Google Lodging Format Protocol Buffer

// This proto relies on set vs. unset primitive-typed fields.
syntax = "proto3";

package hotels.knowledge_base.external;

option java_package = "com.google.travel.hotels.content.knowledge.base.schema.external";
option java_multiple_files = true;

// LodgingList is a wrapper message to store multiple Lodging instances.
message LodgingList {
  repeated Lodging lodgings = 1;
}

// Lodging represents factual information for a single property that provides
// accomodations.
message Lodging {
  // REQUIRED.
  Metadata metadata = 1;

  // REQUIRED. Unique Place ID identifier for the property.
  // https://developers.google.com/places/place-id.
  // Example: "ChIJrTLr-GyuEmsRBfy61i59si0".
  string place_id = 6;

  Property property = 12;

  Services services = 13;

  Policies policies = 14;

  FoodAndDrink food_and_drink = 15;

  Pools pools = 16;

  Wellness wellness = 17;

  Activities activities = 18;

  Transportation transportation = 19;

  Families families = 20;

  Connectivity connectivity = 21;

  Business business = 22;

  Accessibility accessibility = 23;

  Pets pets = 24;

  Parking parking = 25;

  Housekeeping housekeeping = 26;

  // Living area features that are shared amongst guests,
  // such as shared bathrooms, kitchen areas, grills, etc.
  LivingArea common_living_area = 100;

  // All units on the property have at least these attributes.
  // E.g., a living area size means all units are at least that big.
  GuestUnitType all_units = 101;

  // Some units have as much as these attributes.
  // E.g., a living area size means it is possible to book a unit that big.
  GuestUnitType some_units = 102;

  // Individual GuestUnitTypes that are available in this Lodging.
  repeated GuestUnitType guest_units = 104;
}

/////////////////////////////
// Property level messages //
/////////////////////////////

message Property {
  // Built year.
  oneof built_year_oneof {
    int32 built_year = 2;
    Exception built_year_exception = 3;
  }

  // Last renovated year.
  oneof last_renovated_year_oneof {
    int32 last_renovated_year = 4;
    Exception last_renovated_year_exception = 5;
  }

  // Number of rooms.
  oneof number_of_rooms_oneof {
    int32 number_of_rooms = 6;
    Exception number_of_rooms_exception = 7;
  }

  // Floors.
  oneof floors_oneof {
    int32 floors = 8;
    Exception floors_exception = 9;
  }
}

message Services {
  // Class rating.
  oneof class_rating_oneof {
    // Class rating from 1.0 to 5.0.
    float class_rating = 2;
    Exception class_rating_exception = 3;
  }

  ///////////////////////
  // Reception and lobby.

  // Front desk.
  oneof front_desk_oneof {
    bool front_desk = 4;
    Exception front_desk_exception = 5;
  }

  // Front desk 24hrs.
  oneof front_desk_24hrs_oneof {
    bool front_desk_24hrs = 6;
    Exception front_desk_24hrs_exception = 7;
  }

  // Concierge.
  oneof concierge_oneof {
    bool concierge = 8;
    Exception concierge_exception = 9;
  }

  // Elevator.
  oneof elevator_oneof {
    bool elevator = 43;
    Exception elevator_exception = 44;
  }

  ////////////////
  // Conveniences.

  // Baggage storage.
  oneof baggage_storage_oneof {
    bool baggage_storage = 16;
    Exception baggage_storage_exception = 17;
  }

  // Laundry full service.
  oneof laundry_full_service_oneof {
    bool laundry_full_service = 18;
    Exception laundry_full_service_exception = 19;
  }

  // Laundry self service.
  oneof laundry_self_service_oneof {
    bool laundry_self_service = 20;
    Exception laundry_self_service_exception = 21;
  }

  // Social hour.
  oneof social_hour_oneof {
    bool social_hour = 22;
    Exception social_hour_exception = 23;
  }

  // Wake up calls.
  oneof wake_up_calls_oneof {
    bool wake_up_calls = 24;
    Exception wake_up_calls_exception = 25;
  }

  // Convenience store.
  oneof convenience_store_oneof {
    bool convenience_store = 26;
    Exception convenience_store_exception = 27;
  }

  // Gift shop.
  oneof gift_shop_oneof {
    bool gift_shop = 28;
    Exception gift_shop_exception = 29;
  }

  // Currency exchange.
  oneof currency_exchange_oneof {
    bool currency_exchange = 30;
    Exception currency_exchange_exception = 31;
  }

  LanguagesSpoken languages_spoken = 42;
}

message LanguagesSpoken {
  // Arabic spoken.
  oneof arabic_spoken_oneof {
    bool arabic_spoken = 1;
    Exception arabic_spoken_exception = 2;
  }

  // Cantonese spoken.
  oneof cantonese_spoken_oneof {
    bool cantonese_spoken = 3;
    Exception cantonese_spoken_exception = 4;
  }

  // Dutch spoken.
  oneof dutch_spoken_oneof {
    bool dutch_spoken = 5;
    Exception dutch_spoken_exception = 6;
  }

  // English spoken.
  oneof english_spoken_oneof {
    bool english_spoken = 7;
    Exception english_spoken_exception = 8;
  }

  // Filipino spoken.
  oneof filipino_spoken_oneof {
    bool filipino_spoken = 9;
    Exception filipino_spoken_exception = 10;
  }

  // French spoken.
  oneof french_spoken_oneof {
    bool french_spoken = 11;
    Exception french_spoken_exception = 12;
  }

  // German spoken.
  oneof german_spoken_oneof {
    bool german_spoken = 13;
    Exception german_spoken_exception = 14;
  }

  // Hindi spoken.
  oneof hindi_spoken_oneof {
    bool hindi_spoken = 15;
    Exception hindi_spoken_exception = 16;
  }

  // Indonesian spoken.
  oneof indonesian_spoken_oneof {
    bool indonesian_spoken = 17;
    Exception indonesian_spoken_exception = 18;
  }

  // Italian spoken.
  oneof italian_spoken_oneof {
    bool italian_spoken = 31;
    Exception italian_spoken_exception = 32;
  }

  // Japanese spoken.
  oneof japanese_spoken_oneof {
    bool japanese_spoken = 35;
    Exception japanese_spoken_exception = 36;
  }

  // Korean spoken.
  oneof korean_spoken_oneof {
    bool korean_spoken = 19;
    Exception korean_spoken_exception = 20;
  }

  // Mandarin spoken.
  oneof mandarin_spoken_oneof {
    bool mandarin_spoken = 21;
    Exception mandarin_spoken_exception = 22;
  }

  // Portuguese spoken.
  oneof portuguese_spoken_oneof {
    bool portuguese_spoken = 23;
    Exception portuguese_spoken_exception = 24;
  }

  // Russian spoken.
  oneof russian_spoken_oneof {
    bool russian_spoken = 33;
    Exception russian_spoken_exception = 34;
  }

  // Spanish spoken.
  oneof spanish_spoken_oneof {
    bool spanish_spoken = 25;
    Exception spanish_spoken_exception = 26;
  }

  // Vietnamese spoken.
  oneof vietnamese_spoken_oneof {
    bool vietnamese_spoken = 27;
    Exception vietnamese_spoken_exception = 28;
  }
}

message Housekeeping {
  // Housekeeping available.
  oneof housekeeping_available_oneof {
    bool housekeeping_available = 2;
    Exception housekeeping_available_exception = 3;
  }

  // Housekeeping daily.
  oneof housekeeping_daily_oneof {
    bool housekeeping_daily = 4;
    Exception housekeeping_daily_exception = 5;
  }

  // Turndown service.
  oneof turndown_service_oneof {
    bool turndown_service = 6;
    Exception turndown_service_exception = 7;
  }
}

message Parking {
  // Parking available.
  oneof parking_available_oneof {
    bool parking_available = 2;
    Exception parking_available_exception = 3;
  }

  // Parking for free.
  oneof parking_for_free_oneof {
    bool parking_for_free = 4;
    Exception parking_for_free_exception = 5;
  }

  // Self parking available.
  oneof self_parking_available_oneof {
    bool self_parking_available = 6;
    Exception self_parking_available_exception = 7;
  }

  // Self parking for free.
  oneof self_parking_for_free_oneof {
    bool self_parking_for_free = 8;
    Exception self_parking_for_free_exception = 9;
  }

  // Valet parking available.
  oneof valet_parking_available_oneof {
    bool valet_parking_available = 10;
    Exception valet_parking_available_exception = 11;
  }

  // Valet parking for free.
  oneof valet_parking_for_free_oneof {
    bool valet_parking_for_free = 12;
    Exception valet_parking_for_free_exception = 13;
  }

  // Electric car charging stations.
  oneof electric_car_charging_stations_oneof {
    bool electric_car_charging_stations = 14;
    Exception electric_car_charging_stations_exception = 15;
  }
}

message Policies {
  // Check in time.
  oneof check_in_time_oneof {
    // 24hr clock, e.g. "1500" or "1600", in hotel local time.
    // This is the ISO 8601 dense time format with minute precision.
    // For normalization, extended format (with colons) is not supported.
    string check_in_time = 4;
    Exception check_in_time_exception = 5;
  }

  // Check out time.
  oneof check_out_time_oneof {
    // 24hr clock, e.g. "1130" or "1200", in hotel local time.
    // This is the ISO 8601 dense time format with minute precision.
    // For normalization, extended format (with colons) is not supported.
    string check_out_time = 6;
    Exception check_out_time_exception = 7;
  }

  // Kids stay for free.
  oneof kids_stay_for_free_oneof {
    bool kids_stay_for_free = 24;
    Exception kids_stay_for_free_exception = 25;
  }

  // Max number of kids stay for free.
  oneof max_number_of_kids_stay_for_free_oneof {
    int32 max_number_of_kids_stay_for_free = 26;
    Exception max_number_of_kids_stay_for_free_exception = 27;
  }

  // Max child age.
  oneof max_child_age_oneof {
    int32 max_child_age = 28;
    Exception max_child_age_exception = 29;
  }

  // Smoke free property.
  oneof smoke_free_property_oneof {
    bool smoke_free_property = 30;
    Exception smoke_free_property_exception = 31;
  }

  // All inclusive rates available.
  oneof all_inclusive_available_oneof {
    bool all_inclusive_available = 32;
    Exception all_inclusive_available_exception = 33;
  }

  // All inclusive rates only.
  oneof all_inclusive_only_oneof {
    bool all_inclusive_only = 34;
    Exception all_inclusive_only_exception = 35;
  }

  PaymentOptions payment_options = 36;
}

message PaymentOptions {
  // Pay cash.
  oneof cash_oneof {
    bool cash = 2;
    Exception cash_exception = 3;
  }
  // Pay by cheque.
  oneof cheque_oneof {
    bool cheque = 4;
    Exception cheque_exception = 5;
  }

  // Pay credit card.
  oneof credit_card_oneof {
    bool credit_card = 6;
    Exception credit_card_exception = 7;
  }

  // Pay debit card.
  oneof debit_card_oneof {
    bool debit_card = 8;
    Exception debit_card_exception = 9;
  }

  // Pay mobile nfc.
  oneof mobile_nfc_oneof {
    bool mobile_nfc = 10;
    Exception mobile_nfc_exception = 11;
  }
}

message FoodAndDrink {
  // Room service.
  oneof room_service_oneof {
    bool room_service = 2;
    Exception room_service_exception = 3;
  }

  // Room service 24hrs.
  oneof room_service_24hrs_oneof {
    bool room_service_24hrs = 4;
    Exception room_service_24hrs_exception = 5;
  }

  // Existence of restaurant.
  oneof restaurant_oneof {
    bool restaurant = 24;
    Exception restaurant_exception = 25;
  }

  // Number of restaurants.
  oneof number_of_restaurants_oneof {
    int32 number_of_restaurants = 6;
    Exception number_of_restaurants_exception = 7;
  }

  // Table service.
  oneof table_service_oneof {
    bool table_service = 8;
    Exception table_service_exception = 9;
  }

  // Buffet.
  oneof buffet_oneof {
    bool buffet = 10;
    Exception buffet_exception = 11;
  }

  // Buffet dinner.
  oneof buffet_dinner_oneof {
    bool buffet_dinner = 12;
    Exception buffet_dinner_exception = 13;
  }

  // Buffet breakfast.
  oneof buffet_breakfast_oneof {
    bool buffet_breakfast = 14;
    Exception buffet_breakfast_exception = 15;
  }

  // Breakfast available.
  oneof breakfast_available_oneof {
    bool breakfast_available = 22;
    Exception breakfast_available_exception = 23;
  }

  // Breakfast for free.
  oneof breakfast_for_free_oneof {
    bool breakfast_for_free = 16;
    Exception breakfast_for_free_exception = 17;
  }

  // Bar.
  oneof bar_oneof {
    bool bar = 18;
    Exception bar_exception = 19;
  }

  // Vending machine.
  oneof vending_machine_oneof {
    bool vending_machine = 20;
    Exception vending_machine_exception = 21;
  }
}

message Pools {
  // Existence of pool.
  oneof pool_oneof {
    bool pool = 2;
    Exception pool_exception = 3;
  }

  // Number of pools.
  oneof number_of_pools_oneof {
    // Min count of all pools on property.
    int32 number_of_pools = 4;
    Exception number_of_pools_exception = 5;
  }

  // Existence of indoor pool.
  oneof indoor_pool_oneof {
    // Including hot tubs, adult pools, etc.
    bool indoor_pool = 30;
    Exception indoor_pool_exception = 31;
  }

  // Number of indoor pools.
  oneof number_of_indoor_pools_oneof {
    // Including hot tubs, adult pools, etc.
    int32 number_of_indoor_pools = 6;
    Exception number_of_indoor_pools_exception = 7;
  }

  // Existence of outdoor pool.
  oneof outdoor_pool_oneof {
    // Including hot tubs, lazy rivers, etc.
    bool outdoor_pool = 32;
    Exception outdoor_pool_exception = 33;
  }

  // Number of outdoor pools.
  oneof number_of_outdoor_pools_oneof {
    // Including hot tubs, lazy rivers, etc.
    int32 number_of_outdoor_pools = 8;
    Exception number_of_outdoor_pools_exception = 9;
  }

  // Hot tub.
  oneof hot_tub_oneof {
    bool hot_tub = 12;
    Exception hot_tub_exception = 13;
  }

  // Waterslide.
  oneof waterslide_oneof {
    bool waterslide = 14;
    Exception waterslide_exception = 15;
  }

  // Lazy river.
  oneof lazy_river_oneof {
    bool lazy_river = 16;
    Exception lazy_river_exception = 17;
  }

  // Adult pool.
  oneof adult_pool_oneof {
    bool adult_pool = 18;
    Exception adult_pool_exception = 19;
  }

  // Wading pool.
  oneof wading_pool_oneof {
    bool wading_pool = 20;
    Exception wading_pool_exception = 21;
  }

  // Wave pool.
  oneof wave_pool_oneof {
    bool wave_pool = 22;
    Exception wave_pool_exception = 23;
  }

  // Thermal pool.
  oneof thermal_pool_oneof {
    // Includes hot springs.
    bool thermal_pool = 24;
    Exception thermal_pool_exception = 25;
  }

  // Water park.
  oneof water_park_oneof {
    bool water_park = 26;
    Exception water_park_exception = 27;
  }

  // Lifeguard.
  oneof lifeguard_oneof {
    bool lifeguard = 28;
    Exception lifeguard_exception = 29;
  }
}

message Wellness {
  // Fitness center.
  oneof fitness_center_oneof {
    bool fitness_center = 4;
    Exception fitness_center_exception = 5;
  }

  // Fitness center for free.
  oneof fitness_center_for_free_oneof {
    bool fitness_center_for_free = 24;
    Exception fitness_center_for_free_exception = 25;
  }

  // Elliptical machine.
  oneof elliptical_machine_oneof {
    bool elliptical_machine = 6;
    Exception elliptical_machine_exception = 7;
  }

  // Treadmill.
  oneof treadmill_oneof {
    bool treadmill = 8;
    Exception treadmill_exception = 9;
  }

  // Weight machine.
  oneof weight_machine_oneof {
    bool weight_machine = 10;
    Exception weight_machine_exception = 11;
  }

  // Free weights.
  oneof free_weights_oneof {
    bool free_weights = 12;
    Exception free_weights_exception = 13;
  }

  // Spa.
  oneof spa_oneof {
    bool spa = 14;
    Exception spa_exception = 15;
  }

  // Salon.
  oneof salon_oneof {
    bool salon = 16;
    Exception salon_exception = 17;
  }

  // Sauna.
  oneof sauna_oneof {
    bool sauna = 18;
    Exception sauna_exception = 19;
  }

  // Massage.
  oneof massage_oneof {
    bool massage = 20;
    Exception massage_exception = 21;
  }

  //////////////
  // Healthcare.

  // Doctor on call.
  oneof doctor_on_call_oneof {
    bool doctor_on_call = 22;
    Exception doctor_on_call_exception = 23;
  }
}

message Activities {
  /////////////////////////
  // On-premise facilities.

  // Game room.
  oneof game_room_oneof {
    bool game_room = 2;
    Exception game_room_exception = 3;
  }

  // Nightclub.
  oneof nightclub_oneof {
    bool nightclub = 4;
    Exception nightclub_exception = 5;
  }

  // Casino.
  oneof casino_oneof {
    bool casino = 6;
    Exception casino_exception = 7;
  }

  // Boutique stores.
  oneof boutique_stores_oneof {
    bool boutique_stores = 8;
    Exception boutique_stores_exception = 9;
  }

  ////////////////////////////////////////////////////////////////
  // On-premise or adjacent sports facilities, possibly for a fee.

  // Tennis.
  oneof tennis_oneof {
    bool tennis = 10;
    Exception tennis_exception = 11;
  }

  // Golf.
  oneof golf_oneof {
    bool golf = 12;
    Exception golf_exception = 13;
  }

  // Horseback riding.
  oneof horseback_riding_oneof {
    bool horseback_riding = 14;
    Exception horseback_riding_exception = 15;
  }

  // Snorkeling.
  oneof snorkeling_oneof {
    bool snorkeling = 16;
    Exception snorkeling_exception = 17;
  }

  // Scuba.
  oneof scuba_oneof {
    bool scuba = 18;
    Exception scuba_exception = 19;
  }

  // Water skiing.
  oneof water_skiing_oneof {
    bool water_skiing = 20;
    Exception water_skiing_exception = 21;
  }

  // Bicycles rental.
  oneof bicycles_rental_oneof {
    bool bicycles_rental = 22;
    Exception bicycles_rental_exception = 23;
  }

  // Bicycles rental for free.
  oneof bicycles_rental_for_free_oneof {
    bool bicycles_rental_for_free = 24;
    Exception bicycles_rental_for_free_exception = 25;
  }

  // Watercraft rental.
  oneof watercraft_rental_oneof {
    bool watercraft_rental = 26;
    Exception watercraft_rental_exception = 27;
  }

  // Watercraft rental for free.
  oneof watercraft_rental_for_free_oneof {
    bool watercraft_rental_for_free = 28;
    Exception watercraft_rental_for_free_exception = 29;
  }

  // The property is directly accessible to a beach without users needing to
  // cross a public road.
  oneof beach_access_oneof {
    bool beach_access = 30;
    Exception beach_access_exception = 31;
  }

  // The property has a private beach that's only accessible by guests staying
  // at the property.
  oneof private_beach_oneof {
    bool private_beach = 32;
    Exception private_beach_exception = 33;
  }

  // The property is directly on the beach.
  oneof beach_front_oneof {
    bool beach_front = 34;
    Exception beach_front_exception = 35;
  }
}

message Transportation {
  // Transfer from/to lodging property.
  oneof transfer_oneof {
    bool transfer = 2;
    Exception transfer_exception = 3;
  }

  // Airport shuttle.
  oneof airport_shuttle_oneof {
    bool airport_shuttle = 4;
    Exception airport_shuttle_exception = 5;
  }

  // Airport shuttle for free.
  oneof airport_shuttle_for_free_oneof {
    bool airport_shuttle_for_free = 6;
    Exception airport_shuttle_for_free_exception = 7;
  }

  // Local shuttle.
  oneof local_shuttle_oneof {
    // Shuttle to local attractions and businesses.
    bool local_shuttle = 8;
    Exception local_shuttle_exception = 9;
  }

  // Car rental on property.
  oneof car_rental_on_property_oneof {
    bool car_rental_on_property = 10;
    Exception car_rental_on_property_exception = 11;
  }

  // Private car service.
  oneof private_car_service_oneof {
    // Private car services refers to taxis or black car as long as the car is
    // not shared.
    bool private_car_service = 12;
    Exception private_car_service_exception = 13;
  }

  // Private car service for free.
  oneof private_car_service_for_free_oneof {
    bool private_car_service_for_free = 14;
    Exception private_car_service_for_free_exception = 15;
  }
}

message Families {
  // Babysitting.
  oneof babysitting_oneof {
    bool babysitting = 4;
    Exception babysitting_exception = 5;
  }

  // Kids activities.
  oneof kids_activities_oneof {
    bool kids_activities = 6;
    Exception kids_activities_exception = 7;
  }

  // Kids club.
  oneof kids_club_oneof {
    bool kids_club = 8;
    Exception kids_club_exception = 9;
  }
}

message Connectivity {
  // Internet and WiFi options.

  // Wifi available.
  oneof wifi_available_oneof {
    bool wifi_available = 2;
    Exception wifi_available_exception = 3;
  }

  // Wifi for free.
  oneof wifi_for_free_oneof {
    bool wifi_for_free = 22;
    Exception wifi_for_free_exception = 23;
  }

  // Wifi in public areas.
  oneof wifi_in_public_areas_oneof {
    bool wifi_in_public_areas = 6;
    Exception wifi_in_public_areas_exception = 7;
  }

  // Public internet terminal.
  oneof public_internet_terminal_oneof {
    bool public_internet_terminal = 12;
    Exception public_internet_terminal_exception = 13;
  }
}

message Business {
  // Business center.
  oneof business_center_oneof {
    bool business_center = 2;
    Exception business_center_exception = 3;
  }

  // Meeting rooms.
  oneof meeting_rooms_oneof {
    bool meeting_rooms = 6;
    Exception meeting_rooms_exception = 7;
  }

  // Meeting room count.
  oneof number_of_meeting_rooms_oneof {
    int32 number_of_meeting_rooms = 8;
    Exception number_of_meeting_rooms_exception = 9;
  }
}

message Accessibility {
  // Mobility accessible.
  oneof mobility_accessible_oneof {
    bool mobility_accessible = 4;
    Exception mobility_accessible_exception = 5;
  }

  // Mobility accessible parking.
  oneof mobility_accessible_parking_oneof {
    bool mobility_accessible_parking = 2;
    Exception mobility_accessible_parking_exception = 3;
  }

  // Mobility accessible elevator.
  oneof mobility_accessible_elevator_oneof {
    bool mobility_accessible_elevator = 6;
    Exception mobility_accessible_elevator_exception = 7;
  }

  // Mobility accessible pool.
  oneof mobility_accessible_pool_oneof {
    bool mobility_accessible_pool = 8;
    Exception mobility_accessible_pool_exception = 9;
  }
}

message Pets {
  // Pets allowed.
  oneof pets_allowed_oneof {
    bool pets_allowed = 2;
    Exception pets_allowed_exception = 3;
  }

  // Pets allowed for free.
  oneof pets_allowed_for_free_oneof {
    // No standard fees apply for having an allowed pet in the guest unit.
    bool pets_allowed_for_free = 4;
    Exception pets_allowed_for_free_exception = 5;
  }

  // Dogs allowed.
  oneof dogs_allowed_oneof {
    bool dogs_allowed = 6;
    Exception dogs_allowed_exception = 7;
  }

  // Cats allowed.
  oneof cats_allowed_oneof {
    bool cats_allowed = 8;
    Exception cats_allowed_exception = 9;
  }
}

///////////////////////////////
// Guest Unit level messages //
///////////////////////////////

message GuestUnitType {
  // REQUIRED. Unit or room code identifiers for a single GuestUnitType. Each
  // code must be unique within a Lodging instance.
  repeated string code = 59;

  // REQUIRED. Short name of the GuestUnitType. Target <50 chars for English
  // version.
  string name = 2;

  // Tier.
  oneof tier_oneof {
    // Standard or deluxe.
    // A non-standard tier is only permitted if at least one other unit
    // type is of a lower tier.
    UnitTier tier = 5;
    Exception tier_exception = 6;
  }

  /////////////
  // Occupancy.

  // Max number of occupants.
  oneof max_number_of_occupants_oneof {
    int32 max_number_of_occupants = 7;
    Exception max_number_of_occupants_exception = 8;
  }

  // Max number of adult occupants.
  oneof max_number_of_adult_occupants_oneof {
    int32 max_number_of_adult_occupants = 9;
    Exception max_number_of_adult_occupants_exception = 10;
  }

  // Max number of child occupants.
  oneof max_number_of_child_occupants_oneof {
    int32 max_number_of_child_occupants = 11;
    Exception max_number_of_child_occupants_exception = 12;
  }

  /////////////////////////
  // Guest unit attributes.
  // Where possible features should be defined in GuestUnitFeatures and
  // assigned at the most precise known granularity, e.g. some/all guest
  // units, vs. a specific guest unit type vs. a living area.

  // Private home.
  oneof private_home_oneof {
    bool private_home = 13;
    Exception private_home_exception = 14;
  }

  // Suite with multiple living areas / bedrooms.
  oneof suite_oneof {
    bool suite = 19;
    Exception suite_exception = 20;
  }

  // Bungalow or villa.
  oneof bungalow_or_villa_oneof {
    bool bungalow_or_villa = 21;
    Exception bungalow_or_villa_exception = 22;
  }

  // Access to executive floor lounge or related benefits.
  oneof executive_floor_oneof {
    bool executive_floor = 23;
    Exception executive_floor_exception = 24;
  }

  // Connecting unit available.
  oneof connecting_unit_available_oneof {
    bool connecting_unit_available = 25;
    Exception connecting_unit_available_exception = 26;
  }

  ViewsFromUnit views = 60;

  ////////////////
  // Living areas.

  // Features that cannot be associated with a particular
  // living area but are available in the guest unit type.
  // Prefer to associate with living areas when possible.
  // In general, summable numbers are summarized by taking
  // the max of (the value stored in this field) and
  // (the sum of the values for the individual living areas).
  LivingArea total_living_areas = 100;
}

enum UnitTier {
  // Standard. The basic tier for this kind of unit.
  DEFAULT_STANDARD = 0;

  // Deluxe or Superior. Only allowed if another unit type is a standard tier.
  DELUXE = 1;
}

//////////////////////////////////////////////
// Views available from the guest unit itself.
message ViewsFromUnit {
  // View of beach.
  oneof view_of_beach_oneof {
    bool view_of_beach = 2;
    Exception view_of_beach_exception = 3;
  }

  // View of city.
  oneof view_of_city_oneof {
    bool view_of_city = 4;
    Exception view_of_city_exception = 5;
  }

  // View of garden.
  oneof view_of_garden_oneof {
    bool view_of_garden = 6;
    Exception view_of_garden_exception = 7;
  }

  // View of lake.
  oneof view_of_lake_oneof {
    bool view_of_lake = 8;
    Exception view_of_lake_exception = 9;
  }

  // View of landmark.
  oneof view_of_landmark_oneof {
    bool view_of_landmark = 10;
    Exception view_of_landmark_exception = 11;
  }

  // View of ocean.
  oneof view_of_ocean_oneof {
    bool view_of_ocean = 12;
    Exception view_of_ocean_exception = 13;
  }

  // View of pool.
  oneof view_of_pool_oneof {
    bool view_of_pool = 14;
    Exception view_of_pool_exception = 15;
  }

  // View of valley.
  oneof view_of_valley_oneof {
    bool view_of_valley = 16;
    Exception view_of_valley_exception = 17;
  }
}

// An individual room, such as kitchen, bathroom, bedroom, within
// a bookable guest unit.
message LivingArea {
  LivingAreaLayout layout = 100;

  LivingAreaFeatures features = 101;

  LivingAreaEating eating = 102;

  LivingAreaSleeping sleeping = 103;

  LivingAreaAccessibility accessibility = 104;
}

message LivingAreaLayout {
  // Living area sq meters.
  oneof living_area_sq_meters_oneof {
    float living_area_sq_meters = 2;
    Exception living_area_sq_meters_exception = 3;
  }

  // Stairs inside the LivingArea.
  oneof stairs_oneof {
    bool stairs = 4;
    Exception stairs_exception = 5;
  }

  // Loft.
  oneof loft_oneof {
    bool loft = 6;
    Exception loft_exception = 7;
  }

  // Non smoking.
  oneof non_smoking_oneof {
    bool non_smoking = 12;
    Exception non_smoking_exception = 13;
  }

  // Patio.
  oneof patio_oneof {
    // Has a patio or deck, ground or rooftop.
    bool patio = 16;
    Exception patio_exception = 17;
  }

  // Balcony.
  oneof balcony_oneof {
    // Has a balcony or lanai.
    bool balcony = 18;
    Exception balcony_exception = 19;
  }
}

message LivingAreaFeatures {
  /////////////////////
  // Bathroom features.

  // Private bathroom.
  oneof private_bathroom_oneof {
    // Not shared with other guests.
    bool private_bathroom = 2;
    Exception private_bathroom_exception = 3;
  }

  // Toilet.
  oneof toilet_oneof {
    bool toilet = 4;
    Exception toilet_exception = 5;
  }

  // Bidet.
  oneof bidet_oneof {
    bool bidet = 6;
    Exception bidet_exception = 7;
  }

  // Shower.
  oneof shower_oneof {
    bool shower = 8;
    Exception shower_exception = 9;
  }

  // Bathtub.
  oneof bathtub_oneof {
    bool bathtub = 12;
    Exception bathtub_exception = 13;
  }

  // Hairdryer.
  oneof hairdryer_oneof {
    bool hairdryer = 14;
    Exception hairdryer_exception = 15;
  }

  ///////////////
  // Convenience.

  // Washer.
  oneof washer_oneof {
    bool washer = 64;
    Exception washer_exception = 65;
  }

  // Dryer.
  oneof dryer_oneof {
    bool dryer = 66;
    Exception dryer_exception = 67;
  }

  // Ironing equipment.
  oneof ironing_equipment_oneof {
    bool ironing_equipment = 28;
    Exception ironing_equipment_exception = 29;
  }

  // Universal power adapters.
  oneof universal_power_adapters_oneof {
    bool universal_power_adapters = 30;
    Exception universal_power_adapters_exception = 31;
  }

  ///////////
  // Comfort.

  // Air conditioning.
  oneof air_conditioning_oneof {
    bool air_conditioning = 32;
    Exception air_conditioning_exception = 33;
  }

  // Heating.
  oneof heating_oneof {
    bool heating = 34;
    Exception heating_exception = 35;
  }

  // Fireplace.
  oneof fireplace_oneof {
    bool fireplace = 36;
    Exception fireplace_exception = 37;
  }

  /////////////////
  // Entertainment.

  // TV available.
  oneof tv_oneof {
    bool tv = 38;
    Exception tv_exception = 39;
  }

  // TV with casting.
  oneof tv_with_casting_oneof {
    // Chromecast, Apple TV, etc.
    bool tv_with_casting = 40;
    Exception tv_with_casting_exception = 41;
  }

  // TV with streaming.
  oneof tv_with_streaming_oneof {
    // Built in Netflix, Hulu, etc.
    bool tv_with_streaming = 42;
    Exception tv_with_streaming_exception = 43;
  }

  // Pay per view movies.
  oneof pay_per_view_movies_oneof {
    bool pay_per_view_movies = 44;
    Exception pay_per_view_movies_exception = 45;
  }

  ////////////
  // Security.

  // In unit safe.
  oneof in_unit_safe_oneof {
    bool in_unit_safe = 48;
    Exception in_unit_safe_exception = 49;
  }

  // Electronic room key.
  oneof electronic_room_key_oneof {
    bool electronic_room_key = 50;
    Exception electronic_room_key_exception = 51;
  }

  ///////////////
  // Connectivity

  // In unit Wifi available.
  oneof in_unit_wifi_available_oneof {
    bool in_unit_wifi_available = 62;
    Exception in_unit_wifi_available_exception = 63;
  }
}

message LivingAreaEating {
  // Kitchen available in unit.
  oneof kitchen_available_oneof {
    bool kitchen_available = 2;
    Exception kitchen_available_exception = 3;
  }

  /////////////////////////
  // Major kitchen features.

  // Refrigerator.
  oneof refrigerator_oneof {
    bool refrigerator = 4;
    Exception refrigerator_exception = 5;
  }

  // Dishwasher.
  oneof dishwasher_oneof {
    bool dishwasher = 6;
    Exception dishwasher_exception = 7;
  }

  // Stove.
  oneof stove_oneof {
    bool stove = 8;
    Exception stove_exception = 9;
  }

  // Oven.
  oneof oven_oneof {
    bool oven = 10;
    Exception oven_exception = 11;
  }

  //////////////////////////
  // Minor kitchen features.

  // Cookware.
  oneof cookware_oneof {
    bool cookware = 12;
    Exception cookware_exception = 13;
  }

  // Sink.
  oneof sink_oneof {
    bool sink = 14;
    Exception sink_exception = 15;
  }

  // Microwave.
  oneof microwave_oneof {
    bool microwave = 16;
    Exception microwave_exception = 17;
  }

  // Toaster.
  oneof toaster_oneof {
    bool toaster = 18;
    Exception toaster_exception = 19;
  }

  // Indoor grill.
  oneof indoor_grill_oneof {
    bool indoor_grill = 22;
    Exception indoor_grill_exception = 23;
  }

  // Outdoor grill.
  oneof outdoor_grill_oneof {
    bool outdoor_grill = 24;
    Exception outdoor_grill_exception = 25;
  }

  //////////////////////////////
  // In-unit food and beverages.

  // Minibar.
  oneof minibar_oneof {
    bool minibar = 34;
    Exception minibar_exception = 35;
  }

  // Snackbar.
  oneof snackbar_oneof {
    bool snackbar = 36;
    Exception snackbar_exception = 37;
  }

  // Coffee maker.
  oneof coffee_maker_oneof {
    bool coffee_maker = 42;
    Exception coffee_maker_exception = 43;
  }

  // Kettle.
  oneof kettle_oneof {
    bool kettle = 48;
    Exception kettle_exception = 49;
  }

  // Tea station.
  oneof tea_station_oneof {
    bool tea_station = 50;
    Exception tea_station_exception = 51;
  }
}

message LivingAreaSleeping {
  ////////////////////
  // Bed types counts.

  // Number of beds.
  oneof number_of_beds_oneof {
    int32 number_of_beds = 2;
    Exception number_of_beds_exception = 3;
  }

  // King beds.
  oneof king_beds_oneof {
    // Including California king and super king.
    int32 king_beds = 4;
    Exception king_beds_exception = 5;
  }

  // Queen beds.
  oneof queen_beds_oneof {
    int32 queen_beds = 6;
    Exception queen_beds_exception = 7;
  }

  // Double beds.
  oneof double_beds_oneof {
    int32 double_beds = 8;
    Exception double_beds_exception = 9;
  }

  // Single or twin beds.
  oneof single_or_twin_beds_oneof {
    int32 single_or_twin_beds = 10;
    Exception single_or_twin_beds_exception = 11;
  }

  // Sofa beds.
  oneof sofa_beds_oneof {
    int32 sofa_beds = 14;
    Exception sofa_beds_exception = 15;
  }

  // Bunk beds.
  oneof bunk_beds_oneof {
    int32 bunk_beds = 16;
    Exception bunk_beds_exception = 17;
  }

  // Other beds.
  oneof other_beds_oneof {
    // Tatami, trundle, etc.
    int32 other_beds = 18;
    Exception other_beds_exception = 19;
  }

  // Roll away beds available.
  oneof roll_away_beds_available_oneof {
    int32 roll_away_beds_available = 20;
    Exception roll_away_beds_available_exception = 21;
  }

  // Cribs.
  oneof cribs_available_oneof {
    int32 cribs_available = 22;
    Exception cribs_available_exception = 23;
  }

  ////////////
  // Sleeping.

  // Hypoallergenic bedding.
  oneof hypoallergenic_bedding_oneof {
    bool hypoallergenic_bedding = 28;
    Exception hypoallergenic_bedding_exception = 29;
  }

  // Synthetic pillows.
  oneof synthetic_pillows_oneof {
    bool synthetic_pillows = 32;
    Exception synthetic_pillows_exception = 33;
  }

  // Memory foam pillows available.
  oneof memory_foam_pillows_oneof {
    bool memory_foam_pillows = 34;
    Exception memory_foam_pillows_exception = 35;
  }

  // Feather pillows available.
  oneof feather_pillows_oneof {
    bool feather_pillows = 36;
    Exception feather_pillows_exception = 37;
  }
}

message LivingAreaAccessibility {
  // Mobility-accessible unit. Generally what "accessible room" refers to in
  // public lodging offerings.
  oneof mobility_accessible_unit_oneof {
    // True if ada_compliant_unit.
    bool mobility_accessible_unit = 2;
    Exception mobility_accessible_unit_exception = 3;
  }

  // ADA standards compliant unit.
  oneof ada_compliant_unit_oneof {
    bool ada_compliant_unit = 4;
    Exception ada_compliant_unit_exception = 5;
  }

  // Hearing-accessible unit.
  oneof hearing_accessible_unit_oneof {
    bool hearing_accessible_unit = 6;
    Exception hearing_accessible_unit_exception = 7;
  }

  ////////////////////////////////
  // Mobility-accessible features.

  // Mobility-accessible shower.
  oneof mobility_accessible_shower_oneof {
    bool mobility_accessible_shower = 10;
    Exception mobility_accessible_shower_exception = 11;
  }

  // Mobility-accessible bathtub.
  oneof mobility_accessible_bathtub_oneof {
    bool mobility_accessible_bathtub = 12;
    Exception mobility_accessible_bathtub_exception = 13;
  }

  // Mobility-accessible toilet.
  oneof mobility_accessible_toilet_oneof {
    bool mobility_accessible_toilet = 14;
    Exception mobility_accessible_toilet_exception = 15;
  }

  //////////////////////////////////
  // Hearing-accessible features.

  // Hearing-accessible doorbell.
  oneof hearing_accessible_doorbell_oneof {
    bool hearing_accessible_doorbell = 30;
    Exception hearing_accessible_doorbell_exception = 31;
  }

  // Hearing-accessible fire_alarm.
  oneof hearing_accessible_fire_alarm_oneof {
    bool hearing_accessible_fire_alarm = 32;
    Exception hearing_accessible_fire_alarm_exception = 33;
  }
}

// Exception mode. Only use this if the factual information cannot be
// represented by the relevant proto field. i.e. a service is only available
// during some days of the week, or an amenity is only available seasonally.
enum Exception { UNSPECIFIED_REASON = 0; }

message Metadata {
  // REQUIRED.
  // The ISO 8601 datetime at which the Lodging data is asserted to be
  // true in the real world. Examples:
  // 2018-11-13T13:14:52-0800
  // 2018-11-13T13:14:52Z
  string last_updated = 1;
}