| |
| // 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 an partner which 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 an partner which 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 { |
| // 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 an partner which 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. |
| 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 = 1; |
| |
| // 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 { |
| // 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. |
| 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. |
| 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. |
| 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. |
| 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; |
| } |