Menu feed proto bundle


// Feeds declaration
syntax = "proto3";

package food.menu.v1;

import "google/protobuf/timestamp.proto";
import "money.proto";
import "localized_text.proto";

option go_package = "food/menu/v1/proto";


message FoodMenuFeed {
  repeated MenuComponent data = 1;
}


message MenuComponent {
  oneof type {
    food.menu.v1.Menu menu = 1;
    food.menu.v1.MenuSection section = 2;
    food.menu.v1.MenuItem item = 3;
    food.menu.v1.MenuItemOption option = 4;

  }
}


// Top-level catalog of food items offered by a Food establishment. Menu
// contains a list of merchant ids and the menu that apply to those merchants.
// A Menu can be used to represent single merchant with the menu, or multiple
// merchants (typically chain restaurants) with the menus.
message Menu {
  // An opaque string from a partner which uniquely identifies the Menu within
  // the partner feed.
  // Required.
  string menu_id = 1
      ;

  // The merchants to whom the menu apply.
  // Note: This field is repeated so chain restaurants can share the same menu
  // across multiple locations, each of which is a separate merchant.
  // Required.
  repeated string merchant_ids = 2
      ;

  // The name that can identify the Menu when a user is browsing the menu.
  // Optional.
  TextField display_name = 3;

  // The default language code associated with the text labels contained in the
  // menu. Expects BCP-47 language code, such as "en-US" or "sr-Latn".
  //
  // For more information, see
  // http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
  // Optional.
  string language = 4;

  // Disclaimer to be shown to the user for the menu. For example, nutritional
  // information disclosure and allergen disclosure.
  // Optional.
  Disclaimer disclaimer = 5;

  // IDs of items contained within this menu. Expects first-level menu items
  // only.
  // Optional.
  repeated string menu_item_ids = 6
      ;

  // IDs of sections contained within this menu. Expects first-level menu
  // sections only.
  // Optional.
  repeated string menu_section_ids = 7
      ;

  // Timestamp when this Menu or any of its contents was last updated by the
  // restaurant; i.e. a date to be associated with the phrase “accurate as of
  // date”.
  // Optional.
  google.protobuf.Timestamp last_merchant_update_time = 8
      ;

}


// A menu section is a grouping of items on a menu. Separate MenuSections are
// usually created for each logical grouping of items on a menu. For example,
// meal course type (Appetizer, Main, Dessert) and food categories (Burgers,
// Drinks) are typical sections.
message MenuSection {
  // An opaque string from a partner that uniquely identifies the MenuSection
  // within the partner feed.
  // Required.
  string menu_section_id = 1
      ;

  // The name that can identify the MenuSection when a user is browsing the
  // menu.
  // Required.
  TextField display_name = 2
      ;

  // A description of the menu section.
  // Optional.
  TextField description = 3;

  // Image(s) of the menu section.
  // Optional.
  repeated Image images = 4;


  // IDs of MenuItem entities that correspond to this MenuSection entity. A
  // section is expected to have at least 1 item if it does not contain any
  // sub-sections.
  // Optional.
  repeated string menu_item_ids = 6
      ;

  // Child MenuSections (sub-sections) that correspond to this MenuSection
  // entity.
  // Optional.
  repeated string menu_section_ids = 7
      ;






}


// Represents a single food or drink item offered by a Food establishment.
message MenuItem {
  // An opaque string from a partner that uniquely identifies the MenuItem
  // within the partner feed.
  // Required.
  string menu_item_id = 1
      ;

  // The name that can identify the MenuItem when a user is browsing the menu.
  // Required.
  TextField display_name = 2
      ;

  // A description of the menu item.
  // Optional.
  TextField description = 3;

  // Image(s) of the menu item.
  // Optional.
  repeated Image images = 4;

  // Container that specifies a list of options available on an item.
  message MenuItemOptionSet {
    // IDs of menu item options that are applicable to this menu item.
    // Required.
    repeated string menu_item_option_ids = 1
        ;
  }

  // The menu item must either have a price, or a set of menu item options.
  // Required.
  oneof pricing {
    option (validator.one_of) = {

    // Available offers to purchase this food item.
    OfferSet offer_set = 6;

    // Available options for this menu item.
    MenuItemOptionSet menu_item_option_set = 7;
  }

  // Attributes about this menu item.
  // Optional.
  MenuItemAttributes item_attributes = 8;


}


// Describes choices that a user would be required to make when selecting a
// dish / combo. The user must select an option, otherwise the order is
// considered invalid (e.g. the user must choose small, medium, or large for a
// pizza).
message MenuItemOption {
  // An opaque string from a partner that uniquely identifies the
  // MenuItemOption within the partner feed.
  // Required.
  string menu_item_option_id = 9
      ;

  // Option property and value e.g. Size: Small.
  // Required.
  MenuItemOptionProperty value = 2
      ;



  // Available offers to purchase this menu item option.
  // Required.
  OfferSet offer_set = 4
      ;

  // Attributes about this menu item option.
  // Optional.
  MenuItemAttributes item_attributes = 5;


}


// Describes attributes about a particular menu item or option.
message MenuItemAttributes {
  // Number of servings available in a given menu item.
  // Optional.
  int32 number_of_servings = 1;

  // Describes all the nutritional information of the item, e.g. calories, fat
  // content.
  // Optional.
  NutritionInformation nutrition_information = 2;

  // The dietary restrictions that this menu item complies with.
  // Optional.
  repeated DietaryRestriction suitable_diets = 3
      ;

  // Additives of this menu item.
  // Optional.
  repeated Additive additive = 4;

  // Allergens of this menu item.
  // Optional.
  repeated Allergen allergen = 5;

  // Packaging and recycling information of this menu item.
  // Optional.
  DepositInfo packaging_deposit_info = 6;
}


// Container for a list of offers available on a menu item / option.
// Only one offer should be applicable/valid at one particular time.
// For example, a drink can have 2 offers where one is applicable in the morning
// while the other is applicable in the evening during happy hours.
message OfferSet {
  // List of possible offers.
  // Required.
  repeated Offer offers = 1
      ;
}


// Represents pricing and availability information for MenuItems and
// MenuItemOptions.
message Offer {
  // Monetary value of the menu item/option on sale. Can be 0 to represent free.
  // Required.
  google.type.Money price = 1
      ;






}


// Partner provided disclaimer shown to the user. Contains a text disclaimer
// along with an optional URL for more information.
// Some example include: associated medical risks/warnings, any additional
// fees/gratutity, etc.
message Disclaimer {
  // Body of the disclaimer text to be shown to the user.
  // Required.
  TextField text = 1
      ;

  // URL containing more information about the disclaimer.
  // Optional.
  string uri = 2;
}


// A text payload that contains one or more localized values.
message TextField {
  // Per-locale text values.
  //
  // If there is only one desired locale support, then the language_code within
  // each text is not required to be set and the language will be inferred from
  // the default language of the menu.
  //
  // If there are multiple texts across different locales, then the
  // language_code must be set for each text. The first text in the list is
  // considered the preferred representation.
  // Required.
  repeated google.type.LocalizedText text = 1
      ;
}


// Represents an image associated with a menu entity.
message Image {
  // URL containing the raw pixels of the image.
  // Required.
  string uri = 1
      ;
}


// Describes the property of a menu item option and its value.
message MenuItemOptionProperty {
  // Types of property that the option is for.
  enum PropertyType {
    // Do not use. The property type is not explicitly specified.
    UNKNOWN_PROPERTY_TYPE = 0;

    // A generic menu item option property, which is not one of the more
    // specific types below. Use this if the property is not of type
    // SIZE or PIZZA_SIDE.
    OPTION = 1;

    // Denotes the menu item option property of size (e.g. small, medium, or
    // large).
    SIZE = 2;

    // Property specific to pizzas. For example: this MenuItemOption is only
    // valid for a portion/whole pizza, such as mushroom toppings on the left
    // side, right side, or whole pizza).
    PIZZA_SIDE = 3;
  }

  // Well-defined values for the option property.
  enum PropertyValue {
    // Do not use. The property value is not explicitly specified.
    UNKNOWN_PROPERTY_VALUE = 0;

    // The MenuItemOption applies only to the left side of a pizza.
    PIZZA_SIDE_LEFT = 1;

    // The MenuItemOption applies only to the right side of a pizza.
    PIZZA_SIDE_RIGHT = 2;

    // The MenuItemOption applies to the entire pizza.
    PIZZA_SIDE_WHOLE = 3;
  }

  // The type of this option property.
  // Required.
  PropertyType property_type =
      ;

  // Required.
  oneof value {
    // A well-defined value for the option property. Currently only expected
    // if the property_type is PIZZA_SIDE.
    PropertyValue property_val = 2
        ;

    // A free-form text for the value of the property. Expected for
    // property_type OPTION and SIZE.
    TextField text_val = 3
        ;
  }
}


// Describes all the nutritional measurements of a MenuItem or add-on.
message NutritionInformation {
  // Describes a single nutritional measurement of the serving of food.
  message NutritionValue {
    // Describes a closed range for the nutrition value. E.g. "100-150 cal"
    message Range {
      // The minimum amount of nutrition value.
      // Required.
      double min =
          1
          ;

      // The maximum amount of nutrition value.
      // Required.
      double max =
          2
          ;
    }

    // Required oneof.
    oneof value {
      option (validator.one_of) = {

      // A single number representing the amount of nutritional value.
      double amount = 1
          ;

      // A range representing the amount of nutritional value.
      Range range = 3;
    }

    // The unit associated with the amount as specified from the partner. We
    // will validate the feed so that the unit for each type of nutrition value
    // is expected for that type of value. For example, only ENERGY_CALORIES
    // and ENERGY_KILOJOULES are expected on energy property of
    // NutritionalInformation.
    // Required.
    NutritionValueUnit unit =
        2
        ;
  }

  // The amount of nutritional energy of the serving of food. Can be defined
  // in Calories or kilojoules.
  // Optional.
  NutritionValue energy = 1;

  // The amount of sodium content, measured in grams or milligrams.
  // Optional.
  NutritionValue sodium_content = 2;

  // The number of servings the nutrition value applies to.
  // Optional.
  int32 serving_size = 3
      ;

  // Nutrition information in free text. For example "Contains preservatives".
  // Optional.
  TextField description = 4;
}


// Indicates a dietary restriction or guideline adhered to during
// food preparation.
enum DietaryRestriction {
  // Do not use. The dietary restriction is not explicitly specified.
  DIET_UNSPECIFIED = 0;
  DIET_DIABETIC = 1;
  DIET_GLUTEN_FREE = 2;
  DIET_HALAL = 3;
  DIET_HINDU = 4;
  DIET_KOSHER = 5;
  DIET_LOW_CALORIE = 6;
  DIET_LOW_FAT = 7;
  DIET_LOW_LACTOSE = 8;
  DIET_LOW_SALT = 9;
  DIET_VEGAN = 10;
  DIET_VEGETARIAN = 11;
}


// Additive shown to the user on the MenuItem. An additive preserves or enhances
// the quality of the food.
message Additive {
  // Descriptive text of the additive, e.g. "preservatives".
  // Required.
  TextField name = 1
      ;

  // Whether the MenuItem contains, may contain, or is free from this additive.
  // Defaults to contains.
  // Optional.
  ContainmentLevelCode containment_level_code = 2;
}


// Allergen shown to the user on the MenuItem. An allergen relates to qualities
// of food that causes allergic reactions.
message Allergen {
  // Type of allergen.
  // Required.
  AllergenTypeCode allergen_type_code =
      1
      ;

  // Whether the MenuItem contains, may contain, or is free from this allergen.
  // Defaults to contains.
  // Optional.
  ContainmentLevelCode containment_level_code = 2;
}


// Allergen type derived from GS1: http://gs1.org/voc/AllergenTypeCode
enum AllergenTypeCode {
  // Do not use. The allergen type code is not explicitly specified.
  ALLERGEN_TYPE_CODE_UNSPECIFIED = 0;
  ALLERGEN_TYPE_CODE_ALMONDS = 1;
  ALLERGEN_TYPE_CODE_ALPHA_ISOMETHYL_IONONE = 2;
  ALLERGEN_TYPE_CODE_ALCOHOL = 3;
  ALLERGEN_TYPE_CODE_AMYL_CINNAMAL = 4;
  ALLERGEN_TYPE_CODE_ANISE_ALCOHOL = 5;
  ALLERGEN_TYPE_CODE_BARLEY = 6;
  ALLERGEN_TYPE_CODE_BENZYL_ALCOHOL = 7;
  ALLERGEN_TYPE_CODE_BENZYL_BENZOATE = 8;
  ALLERGEN_TYPE_CODE_BENZYL_CINNAMATE = 9;
  ALLERGEN_TYPE_CODE_BENZYL_SALICYLATE = 10;
  ALLERGEN_TYPE_CODE_BRAZIL_NUTS = 11;
  ALLERGEN_TYPE_CODE_BUTYLPHENYL_METHYLPROPIONATE = 12;
  ALLERGEN_TYPE_CODE_CARROTS = 13;
  ALLERGEN_TYPE_CODE_CASHEW_NUTS = 14;
  ALLERGEN_TYPE_CODE_CELERY = 15;
  ALLERGEN_TYPE_CODE_CEREALS_CONTAINING_GLUTEN = 16;
  ALLERGEN_TYPE_CODE_CINNAMAL = 17;
  ALLERGEN_TYPE_CODE_CINNAMYL_ALCOHOL = 18;
  ALLERGEN_TYPE_CODE_CITRAL = 19;
  ALLERGEN_TYPE_CODE_CITRONELLOL = 20;
  ALLERGEN_TYPE_CODE_COCOA = 21;
  ALLERGEN_TYPE_CODE_CORIANDER = 22;
  ALLERGEN_TYPE_CODE_CORN = 23;
  ALLERGEN_TYPE_CODE_COUMARIN = 24;
  ALLERGEN_TYPE_CODE_CRUSTACEANS = 25;
  ALLERGEN_TYPE_CODE_EGGS = 26;
  ALLERGEN_TYPE_CODE_EUGENOL = 27;
  ALLERGEN_TYPE_CODE_EVERNIA_FURFURACEA = 28;
  ALLERGEN_TYPE_CODE_EVERNIA_PRUNASTRI = 29;
  ALLERGEN_TYPE_CODE_FARNESOL = 30;
  ALLERGEN_TYPE_CODE_FISH = 31;
  ALLERGEN_TYPE_CODE_GERANIOL = 32;
  ALLERGEN_TYPE_CODE_GLUTEN = 33;
  ALLERGEN_TYPE_CODE_HAZELNUTS = 34;
  ALLERGEN_TYPE_CODE_HEXYL_CINNAMAL = 35;
  ALLERGEN_TYPE_CODE_HYDROXYCITRONELLAL = 36;
  ALLERGEN_TYPE_CODE_HYDROXYISOHEXYL_3_CYCLOHEXENE_CARBOXALDEHYDE_ISOEUGENOL_LIMONENE_LINAL =
      37;
  ALLERGEN_TYPE_CODE_KAMUT = 38;
  ALLERGEN_TYPE_CODE_LACTOSE = 39;
  ALLERGEN_TYPE_CODE_LUPINE = 40;
  ALLERGEN_TYPE_CODE_MACADAMIA_NUTS = 41;
  ALLERGEN_TYPE_CODE_METHYL_2_OCTYNOATE = 42;
  ALLERGEN_TYPE_CODE_MILK = 43;
  ALLERGEN_TYPE_CODE_MOLLUSCS = 44;
  ALLERGEN_TYPE_CODE_MUSTARD = 45;
  ALLERGEN_TYPE_CODE_NO_DECLARED_ALLERGENS = 46;
  ALLERGEN_TYPE_CODE_OAT = 47;
  ALLERGEN_TYPE_CODE_PEANUTS = 48;
  ALLERGEN_TYPE_CODE_PEAS = 49;
  ALLERGEN_TYPE_CODE_PECAN_NUTS = 50;
  ALLERGEN_TYPE_CODE_PISTACHIOS = 51;
  ALLERGEN_TYPE_CODE_POD_FRUITS = 52;
  ALLERGEN_TYPE_CODE_QUEENSLAND_NUTS = 53;
  ALLERGEN_TYPE_CODE_RYE = 54;
  ALLERGEN_TYPE_CODE_SESAME_SEEDS = 55;
  ALLERGEN_TYPE_CODE_SOYBEANS = 56;
  ALLERGEN_TYPE_CODE_SPELT = 57;
  ALLERGEN_TYPE_CODE_SULPHUR_DIOXIDE = 58;
  ALLERGEN_TYPE_CODE_TREE_NUTS = 59;
  ALLERGEN_TYPE_CODE_TREE_NUT_TRACES = 60;
  ALLERGEN_TYPE_CODE_WALNUTS = 61;
  ALLERGEN_TYPE_CODE_WHEAT = 62;
}


// Partner provided deposit info to instruct the user how to deposit a food item
// or bottle and the value of such deposit.
message DepositInfo {
  // The deposit strategy to employ, e.g. "reusable".
  // Optional.
  DepositCode deposit_code = 1;

  // Value refunded for depositing the item properly.
  // Optional.
  google.type.Money deposit_value = 2
      ;
}


enum NutritionValueUnit {
  // Do not use. The nutrition value unit is not explicitly set.
  NUTRITION_VALUE_UNIT_UNSPECIFIED = 0;

  // Units used to express the amount of energy in a menu item.
  ENERGY_CALORIES = 1;
  ENERGY_KILOJOULES = 2;

  // Units used to express the amount in weight a substance is present in the
  // menu item.
  WEIGHT_MILLIGRAMS = 3;
  WEIGHT_GRAMS = 4;
}


// Indicates the level of containment a food item has of a certain attribute,
// such as allergens or additives.
enum ContainmentLevelCode {
  // Do not use. The containment level code is not explicitly specified.
  CONTAINMENT_LEVEL_CODE_UNSPECIFIED = 0;
  CONTAINMENT_LEVEL_CODE_CONTAINS = 1;
  CONTAINMENT_LEVEL_CODE_DOES_NOT_CONTAIN = 2;
  CONTAINMENT_LEVEL_CODE_MAY_CONTAIN = 3;
}


// Indicates how to properly deposit a food item or bottle.
enum DepositCode {
  // Do not use. The deposite code is not explicitly specified.
  DEPOSIT_CODE_UNSPECIFIED = 0;
  DEPOSIT_CODE_REUSABLE = 1;
  DEPOSIT_CODE_RECYCLABLE = 2;
}

money.proto

// Copyright 2024 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";

package google.type;

option cc_enable_arenas = true;
option go_package = "google.golang.org/genproto/googleapis/type/money;money";
option java_multiple_files = true;
option java_outer_classname = "MoneyProto";
option java_package = "com.google.type";
option objc_class_prefix = "GTP";

// Represents an amount of money with its currency type.
message Money {
  // The three-letter currency code defined in ISO 4217.
  string currency_code = 1;

  // The whole units of the amount.
  // For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar.
  int64 units = 2;

  // Number of nano (10^-9) units of the amount.
  // The value must be between -999,999,999 and +999,999,999 inclusive.
  // If `units` is positive, `nanos` must be positive or zero.
  // If `units` is zero, `nanos` can be positive, zero, or negative.
  // If `units` is negative, `nanos` must be negative or zero.
  // For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
  int32 nanos = 3;
}

localized_text.proto

// Copyright 2024 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";

package google.type;

option cc_enable_arenas = true;
option go_package = "google.golang.org/genproto/googleapis/type/localized_text;localized_text";
option java_multiple_files = true;
option java_outer_classname = "LocalizedTextProto";
option java_package = "com.google.type";
option objc_class_prefix = "GTP";

// Localized variant of a text in a particular language.
message LocalizedText {
  // Localized string in the language corresponding to `language_code' below.
  string text = 1;

  // The text's BCP-47 language code, such as "en-US" or "sr-Latn".
  //
  // For more information, see
  // http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
  string language_code = 2;
}