Added support for ticket type ids at the availability level.
diff --git a/feeds/feeds.pb.go b/feeds/feeds.pb.go index 9902bb9..e9fa181 100644 --- a/feeds/feeds.pb.go +++ b/feeds/feeds.pb.go
@@ -77,7 +77,7 @@ return proto.EnumName(PriceType_name, int32(x)) } func (PriceType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{0} + return fileDescriptor_feeds_fc30b4ddff65807e, []int{0} } // Defines whether a credit card is required in order to book an appointment. @@ -113,7 +113,7 @@ return proto.EnumName(RequireCreditCard_name, int32(x)) } func (RequireCreditCard) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{1} + return fileDescriptor_feeds_fc30b4ddff65807e, []int{1} } // The platform that the action is performed on. Web application is the general @@ -154,7 +154,7 @@ return proto.EnumName(ActionPlatform_name, int32(x)) } func (ActionPlatform) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{2} + return fileDescriptor_feeds_fc30b4ddff65807e, []int{2} } type FeedMetadata_ProcessingInstruction int32 @@ -186,7 +186,7 @@ return proto.EnumName(FeedMetadata_ProcessingInstruction_name, int32(x)) } func (FeedMetadata_ProcessingInstruction) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{0, 0} + return fileDescriptor_feeds_fc30b4ddff65807e, []int{0, 0} } // Enum to indicate the prepayment type. @@ -221,7 +221,7 @@ return proto.EnumName(Service_PrepaymentType_name, int32(x)) } func (Service_PrepaymentType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{7, 0} + return fileDescriptor_feeds_fc30b4ddff65807e, []int{7, 0} } type Service_ServiceType int32 @@ -253,7 +253,7 @@ return proto.EnumName(Service_ServiceType_name, int32(x)) } func (Service_ServiceType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{7, 1} + return fileDescriptor_feeds_fc30b4ddff65807e, []int{7, 1} } // Enum to indicate the type of field. @@ -299,7 +299,7 @@ return proto.EnumName(ServiceIntakeFormField_FieldType_name, int32(x)) } func (ServiceIntakeFormField_FieldType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{11, 0} + return fileDescriptor_feeds_fc30b4ddff65807e, []int{11, 0} } // Enum to indicate the type of this media source. Only photos are supported. @@ -327,13 +327,13 @@ return proto.EnumName(RelatedMedia_MediaType_name, int32(x)) } func (RelatedMedia_MediaType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{17, 0} + return fileDescriptor_feeds_fc30b4ddff65807e, []int{17, 0} } type FeedMetadata struct { // Instructs us how to process the feed: either as a shard of a complete feed, // or as a shard of an incremental update. - ProcessingInstruction FeedMetadata_ProcessingInstruction `protobuf:"varint,1,opt,name=processing_instruction,json=processingInstruction,enum=maps.booking.feeds.FeedMetadata_ProcessingInstruction" json:"processing_instruction,omitempty"` + ProcessingInstruction FeedMetadata_ProcessingInstruction `protobuf:"varint,1,opt,name=processing_instruction,json=processingInstruction,proto3,enum=maps.booking.feeds.FeedMetadata_ProcessingInstruction" json:"processing_instruction,omitempty"` // The current shard and total number of shards for this feed. // // Shard number is assumed to be zero-based. @@ -342,8 +342,8 @@ // // Shards do not need to be transferred in order, and they may not be // processed in order. - ShardNumber int32 `protobuf:"varint,2,opt,name=shard_number,json=shardNumber" json:"shard_number,omitempty"` - TotalShards int32 `protobuf:"varint,3,opt,name=total_shards,json=totalShards" json:"total_shards,omitempty"` + ShardNumber int32 `protobuf:"varint,2,opt,name=shard_number,json=shardNumber,proto3" json:"shard_number,omitempty"` + TotalShards int32 `protobuf:"varint,3,opt,name=total_shards,json=totalShards,proto3" json:"total_shards,omitempty"` // An identifier that must be consistent across all shards in a feed. // This value must be globally unique across each feed type. // @@ -355,11 +355,11 @@ // total_shards). // // Feeds that span multiple shards must set this nonce to the same value. - Nonce uint64 `protobuf:"varint,5,opt,name=nonce" json:"nonce,omitempty"` + Nonce uint64 `protobuf:"varint,5,opt,name=nonce,proto3" json:"nonce,omitempty"` // The timestamp at which this feed shard was generated. // // In Unix time format (seconds since the epoch). - GenerationTimestamp int64 `protobuf:"varint,4,opt,name=generation_timestamp,json=generationTimestamp" json:"generation_timestamp,omitempty"` + GenerationTimestamp int64 `protobuf:"varint,4,opt,name=generation_timestamp,json=generationTimestamp,proto3" json:"generation_timestamp,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -369,7 +369,7 @@ func (m *FeedMetadata) String() string { return proto.CompactTextString(m) } func (*FeedMetadata) ProtoMessage() {} func (*FeedMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{0} + return fileDescriptor_feeds_fc30b4ddff65807e, []int{0} } func (m *FeedMetadata) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_FeedMetadata.Unmarshal(m, b) @@ -425,8 +425,8 @@ } type AvailabilityFeed struct { - Metadata *FeedMetadata `protobuf:"bytes,1,opt,name=metadata" json:"metadata,omitempty"` - ServiceAvailability []*ServiceAvailability `protobuf:"bytes,2,rep,name=service_availability,json=serviceAvailability" json:"service_availability,omitempty"` + Metadata *FeedMetadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` + ServiceAvailability []*ServiceAvailability `protobuf:"bytes,2,rep,name=service_availability,json=serviceAvailability,proto3" json:"service_availability,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -436,7 +436,7 @@ func (m *AvailabilityFeed) String() string { return proto.CompactTextString(m) } func (*AvailabilityFeed) ProtoMessage() {} func (*AvailabilityFeed) Descriptor() ([]byte, []int) { - return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{1} + return fileDescriptor_feeds_fc30b4ddff65807e, []int{1} } func (m *AvailabilityFeed) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_AvailabilityFeed.Unmarshal(m, b) @@ -494,8 +494,8 @@ // is interpreted to mean all time up to the end_timestamp_restrict. // // In Unix time format (seconds since the epoch). - StartTimestampRestrict int64 `protobuf:"varint,1,opt,name=start_timestamp_restrict,json=startTimestampRestrict" json:"start_timestamp_restrict,omitempty"` - EndTimestampRestrict int64 `protobuf:"varint,2,opt,name=end_timestamp_restrict,json=endTimestampRestrict" json:"end_timestamp_restrict,omitempty"` + StartTimestampRestrict int64 `protobuf:"varint,1,opt,name=start_timestamp_restrict,json=startTimestampRestrict,proto3" json:"start_timestamp_restrict,omitempty"` + EndTimestampRestrict int64 `protobuf:"varint,2,opt,name=end_timestamp_restrict,json=endTimestampRestrict,proto3" json:"end_timestamp_restrict,omitempty"` // If provided, the timestamp restricts will be applied only to the given // merchant or service. // @@ -505,13 +505,13 @@ // // Leaving these fields unset, or setting these to the empty string or null, // is interpreted to mean that no restrict is intended. - MerchantIdRestrict string `protobuf:"bytes,3,opt,name=merchant_id_restrict,json=merchantIdRestrict" json:"merchant_id_restrict,omitempty"` - ServiceIdRestrict string `protobuf:"bytes,4,opt,name=service_id_restrict,json=serviceIdRestrict" json:"service_id_restrict,omitempty"` + MerchantIdRestrict string `protobuf:"bytes,3,opt,name=merchant_id_restrict,json=merchantIdRestrict,proto3" json:"merchant_id_restrict,omitempty"` + ServiceIdRestrict string `protobuf:"bytes,4,opt,name=service_id_restrict,json=serviceIdRestrict,proto3" json:"service_id_restrict,omitempty"` // Setting resources_restrict further restricts the scope of the update to // just this set of resources. All id fields of the resources must match // exactly. - ResourcesRestrict *Resources `protobuf:"bytes,6,opt,name=resources_restrict,json=resourcesRestrict" json:"resources_restrict,omitempty"` - Availability []*Availability `protobuf:"bytes,5,rep,name=availability" json:"availability,omitempty"` + ResourcesRestrict *Resources `protobuf:"bytes,6,opt,name=resources_restrict,json=resourcesRestrict,proto3" json:"resources_restrict,omitempty"` + Availability []*Availability `protobuf:"bytes,5,rep,name=availability,proto3" json:"availability,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -521,7 +521,7 @@ func (m *ServiceAvailability) String() string { return proto.CompactTextString(m) } func (*ServiceAvailability) ProtoMessage() {} func (*ServiceAvailability) Descriptor() ([]byte, []int) { - return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{2} + return fileDescriptor_feeds_fc30b4ddff65807e, []int{2} } func (m *ServiceAvailability) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ServiceAvailability.Unmarshal(m, b) @@ -597,15 +597,17 @@ // availability {start_sec: 9am, duration: 180 minutes, ...} // type Availability struct { - // An opaque string from an aggregator to identify a merchant. - MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId" json:"merchant_id,omitempty"` + // An opaque string from an aggregator to identify a merchant. (required) + MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId,proto3" json:"merchant_id,omitempty"` // An opaque string from aggregator to identify a service of the - // merchant. - ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId" json:"service_id,omitempty"` - // Start time of this availability, using epoch time in seconds. - StartSec int64 `protobuf:"varint,3,opt,name=start_sec,json=startSec" json:"start_sec,omitempty"` + // merchant. (required) + ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"` + // Start time of this availability, using epoch time in seconds in UTC. + // (required) + StartSec int64 `protobuf:"varint,3,opt,name=start_sec,json=startSec,proto3" json:"start_sec,omitempty"` // Duration of the service in seconds, e.g. 30 minutes for a chair massage. - DurationSec int64 `protobuf:"varint,4,opt,name=duration_sec,json=durationSec" json:"duration_sec,omitempty"` + // (required) + DurationSec int64 `protobuf:"varint,4,opt,name=duration_sec,json=durationSec,proto3" json:"duration_sec,omitempty"` // Number of total spots and open spots of this availability. // E.g. a Yoga class of 10 spots with 3 booked. // availability {spots_total: 10, spots_open: 7 ...} @@ -616,11 +618,13 @@ // below, these two fields will be inferred. A Recurrence // implies spots_total=1 and spots_open=1. A ScheduleException implies // spots_total=1 and spots_open=0. - SpotsTotal int64 `protobuf:"varint,5,opt,name=spots_total,json=spotsTotal" json:"spots_total,omitempty"` - SpotsOpen int64 `protobuf:"varint,6,opt,name=spots_open,json=spotsOpen" json:"spots_open,omitempty"` + // (both required if recurrence not set) + SpotsTotal int64 `protobuf:"varint,5,opt,name=spots_total,json=spotsTotal,proto3" json:"spots_total,omitempty"` + SpotsOpen int64 `protobuf:"varint,6,opt,name=spots_open,json=spotsOpen,proto3" json:"spots_open,omitempty"` // An optional opaque string to identify this availability slot. If set, it // will be included in the requests that book/update/cancel appointments. - AvailabilityTag string `protobuf:"bytes,7,opt,name=availability_tag,json=availabilityTag" json:"availability_tag,omitempty"` + // (optional) + AvailabilityTag string `protobuf:"bytes,7,opt,name=availability_tag,json=availabilityTag,proto3" json:"availability_tag,omitempty"` // Optional resources used to disambiguate this availability slot from // others when different staff, room, or party_size values are part // of the service. @@ -630,8 +634,9 @@ // spots_total: 10 spots_open: 7 } // availability { resources { staff_id: "2" staff_name: "John" } // spots_total: 5 spots_open: 2 } - Resources *Resources `protobuf:"bytes,8,opt,name=resources" json:"resources,omitempty"` - // A list of ids referencing the payment options which can be used to pay + // (optional) + Resources *Resources `protobuf:"bytes,8,opt,name=resources,proto3" json:"resources,omitempty"` + // A list of IDs referencing the payment options which can be used to pay // for this slot. The actual payment options are defined at the Merchant // level, and can also be shared among multiple Merchants. // @@ -639,23 +644,72 @@ // message. Similarly payment_option_ids specified here do NOT have to be // present in the service message, though must be defined at the // Merchant level. - PaymentOptionId []string `protobuf:"bytes,9,rep,name=payment_option_id,json=paymentOptionId" json:"payment_option_id,omitempty"` + // Our current implementation limits the number of entries in this array to + // one element. Multiple payment_option_id are still allowed at the Service + // level, but an override at the availability slot level, is limited to a + // single payment_option_id. (optional) + PaymentOptionId []string `protobuf:"bytes,9,rep,name=payment_option_id,json=paymentOptionId,proto3" json:"payment_option_id,omitempty"` // The recurrence information for the availability, representing more than one // start time. A recurrence should contain appointments for one working day. - Recurrence *Availability_Recurrence `protobuf:"bytes,10,opt,name=recurrence" json:"recurrence,omitempty"` - // When this service cannot be scheduled. To limit the number of - // schedule_exception messages consider joining adjacent exceptions. - ScheduleException []*Availability_ScheduleException `protobuf:"bytes,11,rep,name=schedule_exception,json=scheduleException" json:"schedule_exception,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + // (optional) + Recurrence *Availability_Recurrence `protobuf:"bytes,10,opt,name=recurrence,proto3" json:"recurrence,omitempty"` + // Times when this service cannot be scheduled. To limit the number of + // schedule_exception messages, consider joining adjacent exceptions. + // (optional) + ScheduleException []*Availability_ScheduleException `protobuf:"bytes,11,rep,name=schedule_exception,json=scheduleException,proto3" json:"schedule_exception,omitempty"` + // Defines how a deposit may be charged to the user. Overrides the service + // deposit if one was specified. Setting this to an empty Deposit message + // removes any service-level deposit. (optional) + Deposit *Deposit `protobuf:"bytes,12,opt,name=deposit,proto3" json:"deposit,omitempty"` + // Defines a no show fee that may be charged to the user. Overrides the + // service no show fee if one was specified. Setting this to an empty + // NoShowFee message removes any service-level no show fee. (optional) + NoShowFee *NoShowFee `protobuf:"bytes,13,opt,name=no_show_fee,json=noShowFee,proto3" json:"no_show_fee,omitempty"` + // Indicates whether the user must provide a credit card in order to book this + // availability slot. + // If the value is not set, it is inherited from the service level if it's set + // there. (optional) + RequireCreditCard RequireCreditCard `protobuf:"varint,14,opt,name=require_credit_card,json=requireCreditCard,proto3,enum=maps.booking.feeds.RequireCreditCard" json:"require_credit_card,omitempty"` + // Indicates a list of supported ticket types for this availability slot. If + // unset, all ticket types in the parent service are available for this slot. + // Note that the values of this field must be defined in the parent service. + // Examples: + // + // * Service with four ticket types: + // TicketType {ticket_type_id: "adult_1" short_description: "Adult weekdays"} + // TicketType {ticket_type_id: "adult_2" short_description: "Adult weekends"} + // TicketType {ticket_type_id: "youth_1" short_description: "Youth weekdays"} + // TicketType {ticket_type_id: "youth_2" short_description: "Youth weekends"} + // + // To represent the inventory during the weekdays: + // `availability {ticket_type_id: "adult_1" ticket_type_id: "youth_1"...}`. + // To represent the inventory during the holidays: + // `availability {ticket_type_id: "adult_2" ticket_type_id: "youth_2"...}`. + // + // * Service with three ticket types: + // TicketType {ticket_type_id: "adult" short_description: "Adult"} + // TicketType {ticket_type_id: "youth" short_description: "Youth"} + // TicketType {ticket_type_id: "senior" short_description: "Senior"} + // + // To indicate that all three ticket types are available for this time + // slot, use either + // `availability {ticket_type_id: "adult" ticket_type_id: "youth" + // ticket_type_id: "senior" ...}` + // or + // `availability {...}' (do not set ticket_type_id in this slot). + // + // (optional) + TicketTypeId []string `protobuf:"bytes,15,rep,name=ticket_type_id,json=ticketTypeId,proto3" json:"ticket_type_id,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *Availability) Reset() { *m = Availability{} } func (m *Availability) String() string { return proto.CompactTextString(m) } func (*Availability) ProtoMessage() {} func (*Availability) Descriptor() ([]byte, []int) { - return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{3} + return fileDescriptor_feeds_fc30b4ddff65807e, []int{3} } func (m *Availability) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Availability.Unmarshal(m, b) @@ -752,6 +806,34 @@ return nil } +func (m *Availability) GetDeposit() *Deposit { + if m != nil { + return m.Deposit + } + return nil +} + +func (m *Availability) GetNoShowFee() *NoShowFee { + if m != nil { + return m.NoShowFee + } + return nil +} + +func (m *Availability) GetRequireCreditCard() RequireCreditCard { + if m != nil { + return m.RequireCreditCard + } + return RequireCreditCard_REQUIRE_CREDIT_CARD_UNSPECIFIED +} + +func (m *Availability) GetTicketTypeId() []string { + if m != nil { + return m.TicketTypeId + } + return nil +} + // Recurrence messages are optional, but allow for a more compact // representation of consistently repeating availability slots. They typically // represent a day's working schedule. @@ -768,14 +850,15 @@ // merchants/services with regularly scheduled classes. type Availability_Recurrence struct { // The inclusive maximum UTC timestamp the availability repeats until. - RepeatUntilSec int64 `protobuf:"varint,1,opt,name=repeat_until_sec,json=repeatUntilSec" json:"repeat_until_sec,omitempty"` + // (required) + RepeatUntilSec int64 `protobuf:"varint,1,opt,name=repeat_until_sec,json=repeatUntilSec,proto3" json:"repeat_until_sec,omitempty"` // Defines the time between successive availability slots. // - // E.g. An availability with a duration of 20 min, a repeat_every_sec of + // Example: An availability with a duration of 20 min, a repeat_every_sec of // 30 min, a start_sec of 9:00am, and a repeat_until_sec of 11:00am will // yield slots at 9-9:20am, 9:30-9:50am, 10-10:20am, 10:30-10:50am, - // 11-11:20am. - RepeatEverySec int32 `protobuf:"varint,2,opt,name=repeat_every_sec,json=repeatEverySec" json:"repeat_every_sec,omitempty"` + // 11-11:20am. (required) + RepeatEverySec int32 `protobuf:"varint,2,opt,name=repeat_every_sec,json=repeatEverySec,proto3" json:"repeat_every_sec,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -785,7 +868,7 @@ func (m *Availability_Recurrence) String() string { return proto.CompactTextString(m) } func (*Availability_Recurrence) ProtoMessage() {} func (*Availability_Recurrence) Descriptor() ([]byte, []int) { - return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{3, 0} + return fileDescriptor_feeds_fc30b4ddff65807e, []int{3, 0} } func (m *Availability_Recurrence) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Availability_Recurrence.Unmarshal(m, b) @@ -819,13 +902,24 @@ return 0 } -// ScheduleException messages are used to represent booked/unavailable time -// ranges within the work day. As time slots are booked, the list of -// exceptions should grow to reflect the newly unavailable time ranges. -// The recurrence itself shouldn't be modified. +// ScheduleException messages represent booked/unavailable time ranges within +// the workday, which are exceptions to the recurrence described above. As +// time slots are booked, the list of exceptions should be updated to reflect +// the newly unavailable time ranges. The recurrence itself shouldn't be +// modified. type Availability_ScheduleException struct { - // The time range of the exception. - TimeRange *TimeRange `protobuf:"bytes,1,opt,name=time_range,json=timeRange" json:"time_range,omitempty"` + // The time range of the exception. Any slots described by the recurrence + // which overlap this closed-open time range will be considered unavailable. + // + // Example: If the recurrence specifies a duration of 20 min, a + // repeat_every_sec of 30 min, a start_time of 9:00am, and a + // repeat_until_sec of 11:00am, then a ScheduleException with a time_range + // of 9:45am-11:00am would make unavailable the slots at 9:30-9:50am, + // 10-10:20am, and 10:30-10:50am. + // + // Note that because the time range is closed-open, the slot beginning at + // 11am slot would not be impacted. + TimeRange *TimeRange `protobuf:"bytes,1,opt,name=time_range,json=timeRange,proto3" json:"time_range,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -835,7 +929,7 @@ func (m *Availability_ScheduleException) String() string { return proto.CompactTextString(m) } func (*Availability_ScheduleException) ProtoMessage() {} func (*Availability_ScheduleException) Descriptor() ([]byte, []int) { - return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{3, 1} + return fileDescriptor_feeds_fc30b4ddff65807e, []int{3, 1} } func (m *Availability_ScheduleException) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Availability_ScheduleException.Unmarshal(m, b) @@ -872,28 +966,28 @@ // It also needs to be stable over time to allow correlation with past // bookings. // This field must be present if staff_name is present. - StaffId string `protobuf:"bytes,1,opt,name=staff_id,json=staffId" json:"staff_id,omitempty"` + StaffId string `protobuf:"bytes,1,opt,name=staff_id,json=staffId,proto3" json:"staff_id,omitempty"` // Optional name of a staff member providing the service. This field will be // displayed to users making a booking, and should be human readable, as // opposed to an opaque identifier. // This field must be present if staff_id is present. - StaffName string `protobuf:"bytes,2,opt,name=staff_name,json=staffName" json:"staff_name,omitempty"` + StaffName string `protobuf:"bytes,2,opt,name=staff_name,json=staffName,proto3" json:"staff_name,omitempty"` // An optional id for the room the service is located in. This field // identifies the room across all merchants, services, and availability // records. It also needs to be stable over time to allow correlation with // past bookings. // This field must be present if room_name is present. - RoomId string `protobuf:"bytes,3,opt,name=room_id,json=roomId" json:"room_id,omitempty"` + RoomId string `protobuf:"bytes,3,opt,name=room_id,json=roomId,proto3" json:"room_id,omitempty"` // An optional name for the room the service is located in. This // field will be displayed to users making a booking, and should be human // readable, as opposed to an opaque identifier. // This field must be present if room_id is present. - RoomName string `protobuf:"bytes,4,opt,name=room_name,json=roomName" json:"room_name,omitempty"` + RoomName string `protobuf:"bytes,4,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"` // Applicable only for Dining: The party size which can be accommodated // during this time slot. A restaurant can be associated with multiple Slots // for the same time, each specifying a different party_size, if for instance // 2, 3, or 4 people can be seated with a reservation. - PartySize int32 `protobuf:"varint,5,opt,name=party_size,json=partySize" json:"party_size,omitempty"` + PartySize int32 `protobuf:"varint,5,opt,name=party_size,json=partySize,proto3" json:"party_size,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -903,7 +997,7 @@ func (m *Resources) String() string { return proto.CompactTextString(m) } func (*Resources) ProtoMessage() {} func (*Resources) Descriptor() ([]byte, []int) { - return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{4} + return fileDescriptor_feeds_fc30b4ddff65807e, []int{4} } func (m *Resources) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Resources.Unmarshal(m, b) @@ -959,8 +1053,8 @@ } type TimeRange struct { - BeginSec int64 `protobuf:"varint,1,opt,name=begin_sec,json=beginSec" json:"begin_sec,omitempty"` - EndSec int64 `protobuf:"varint,2,opt,name=end_sec,json=endSec" json:"end_sec,omitempty"` + BeginSec int64 `protobuf:"varint,1,opt,name=begin_sec,json=beginSec,proto3" json:"begin_sec,omitempty"` + EndSec int64 `protobuf:"varint,2,opt,name=end_sec,json=endSec,proto3" json:"end_sec,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -970,7 +1064,7 @@ func (m *TimeRange) String() string { return proto.CompactTextString(m) } func (*TimeRange) ProtoMessage() {} func (*TimeRange) Descriptor() ([]byte, []int) { - return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{5} + return fileDescriptor_feeds_fc30b4ddff65807e, []int{5} } func (m *TimeRange) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TimeRange.Unmarshal(m, b) @@ -1005,8 +1099,8 @@ } type ServiceFeed struct { - Metadata *FeedMetadata `protobuf:"bytes,1,opt,name=metadata" json:"metadata,omitempty"` - Service []*Service `protobuf:"bytes,2,rep,name=service" json:"service,omitempty"` + Metadata *FeedMetadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` + Service []*Service `protobuf:"bytes,2,rep,name=service,proto3" json:"service,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1016,7 +1110,7 @@ func (m *ServiceFeed) String() string { return proto.CompactTextString(m) } func (*ServiceFeed) ProtoMessage() {} func (*ServiceFeed) Descriptor() ([]byte, []int) { - return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{6} + return fileDescriptor_feeds_fc30b4ddff65807e, []int{6} } func (m *ServiceFeed) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ServiceFeed.Unmarshal(m, b) @@ -1054,13 +1148,13 @@ type Service struct { // An opaque string from an aggregator partner which uniquely identifies a // merchant. (required) - MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId" json:"merchant_id,omitempty"` + MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId,proto3" json:"merchant_id,omitempty"` // An opaque string from an aggregator partner which uniquely identifies the // service. (required) - ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId" json:"service_id,omitempty"` + ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"` // The name of the service, suitable for display to users, e.g. "Men's // haircut". (required) - Name string `protobuf:"bytes,3,opt,name=name" json:"name,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` // The description of the service, suitable for display to users. // // This field now supports both plain text and HTML-like formatting rules to @@ -1129,49 +1223,49 @@ // approach for you. // // (required) - Description string `protobuf:"bytes,4,opt,name=description" json:"description,omitempty"` + Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` // The price of the service. (optional, overridden when payment options or // ticket types present) - Price *Price `protobuf:"bytes,5,opt,name=price" json:"price,omitempty"` + Price *Price `protobuf:"bytes,5,opt,name=price,proto3" json:"price,omitempty"` // Rules to book/cancel an appointment. (optional) - Rules *SchedulingRules `protobuf:"bytes,6,opt,name=rules" json:"rules,omitempty"` + Rules *SchedulingRules `protobuf:"bytes,6,opt,name=rules,proto3" json:"rules,omitempty"` // Intake forms to customize the service. (optional) - Form []*ServiceIntakeForm `protobuf:"bytes,7,rep,name=form" json:"form,omitempty"` + Form []*ServiceIntakeForm `protobuf:"bytes,7,rep,name=form,proto3" json:"form,omitempty"` // Whether a prepayment is required, optional or not supported. (optional) - PrepaymentType Service_PrepaymentType `protobuf:"varint,8,opt,name=prepayment_type,json=prepaymentType,enum=maps.booking.feeds.Service_PrepaymentType" json:"prepayment_type,omitempty"` + PrepaymentType Service_PrepaymentType `protobuf:"varint,8,opt,name=prepayment_type,json=prepaymentType,proto3,enum=maps.booking.feeds.Service_PrepaymentType" json:"prepayment_type,omitempty"` // The service's tax rate. If present this field overrides any tax_rate set at // the merchant level. An empty message (i.e. tax_rate { }) will reset the // applied tax rate to zero. (optional) - TaxRate *TaxRate `protobuf:"bytes,9,opt,name=tax_rate,json=taxRate" json:"tax_rate,omitempty"` + TaxRate *TaxRate `protobuf:"bytes,9,opt,name=tax_rate,json=taxRate,proto3" json:"tax_rate,omitempty"` // A list of ids referencing the payment options which can be used to pay // for this service. The actual payment options are defined at the Merchant // level, and can also be shared among multiple Merchants. (optional) - PaymentOptionId []string `protobuf:"bytes,10,rep,name=payment_option_id,json=paymentOptionId" json:"payment_option_id,omitempty"` + PaymentOptionId []string `protobuf:"bytes,10,rep,name=payment_option_id,json=paymentOptionId,proto3" json:"payment_option_id,omitempty"` // Defines how a deposit may be charged to the user. Can be overridden at the // availability level. (optional) - Deposit *Deposit `protobuf:"bytes,11,opt,name=deposit" json:"deposit,omitempty"` + Deposit *Deposit `protobuf:"bytes,11,opt,name=deposit,proto3" json:"deposit,omitempty"` // Defines a no show fee that may be charged to the user. Can be overridden // at the availability level. (optional) - NoShowFee *NoShowFee `protobuf:"bytes,12,opt,name=no_show_fee,json=noShowFee" json:"no_show_fee,omitempty"` + NoShowFee *NoShowFee `protobuf:"bytes,12,opt,name=no_show_fee,json=noShowFee,proto3" json:"no_show_fee,omitempty"` // Indicates whether the user must provide a credit card in order to book this // service. // This value can be overridden at the availability level. (optional) - RequireCreditCard RequireCreditCard `protobuf:"varint,13,opt,name=require_credit_card,json=requireCreditCard,enum=maps.booking.feeds.RequireCreditCard" json:"require_credit_card,omitempty"` + RequireCreditCard RequireCreditCard `protobuf:"varint,13,opt,name=require_credit_card,json=requireCreditCard,proto3,enum=maps.booking.feeds.RequireCreditCard" json:"require_credit_card,omitempty"` // An action link related to this service. - ActionLink []*ActionLink `protobuf:"bytes,14,rep,name=action_link,json=actionLink" json:"action_link,omitempty"` + ActionLink []*ActionLink `protobuf:"bytes,14,rep,name=action_link,json=actionLink,proto3" json:"action_link,omitempty"` // The predefined type of this service. Currently, only used with action_link. - Type Service_ServiceType `protobuf:"varint,15,opt,name=type,enum=maps.booking.feeds.Service_ServiceType" json:"type,omitempty"` + Type Service_ServiceType `protobuf:"varint,15,opt,name=type,proto3,enum=maps.booking.feeds.Service_ServiceType" json:"type,omitempty"` // Types of tickets that can be booked/purchased for this service, if tickets // are supported. (optional) - TicketType []*TicketType `protobuf:"bytes,16,rep,name=ticket_type,json=ticketType" json:"ticket_type,omitempty"` + TicketType []*TicketType `protobuf:"bytes,16,rep,name=ticket_type,json=ticketType,proto3" json:"ticket_type,omitempty"` // Photos related to this service. Google will crawl these media to // ensure that they are displayed to end-users in the most efficient way. // (optional) - RelatedMedia []*RelatedMedia `protobuf:"bytes,17,rep,name=related_media,json=relatedMedia" json:"related_media,omitempty"` + RelatedMedia []*RelatedMedia `protobuf:"bytes,17,rep,name=related_media,json=relatedMedia,proto3" json:"related_media,omitempty"` // Service attribute values that apply to this service (optional). // Each Service may have zero or more values for each service attribute // defined in the corresponding Merchant. - ServiceAttributeValueId []*ServiceAttributeValueId `protobuf:"bytes,18,rep,name=service_attribute_value_id,json=serviceAttributeValueId" json:"service_attribute_value_id,omitempty"` + ServiceAttributeValueId []*ServiceAttributeValueId `protobuf:"bytes,18,rep,name=service_attribute_value_id,json=serviceAttributeValueId,proto3" json:"service_attribute_value_id,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1181,7 +1275,7 @@ func (m *Service) String() string { return proto.CompactTextString(m) } func (*Service) ProtoMessage() {} func (*Service) Descriptor() ([]byte, []int) { - return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{7} + return fileDescriptor_feeds_fc30b4ddff65807e, []int{7} } func (m *Service) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Service.Unmarshal(m, b) @@ -1334,12 +1428,12 @@ // rounding. (e.g. For USD 2.5 cents rounded to 2 cents, 3.5 cents rounded to // 4 cents, 0.5 cents rounded to 0 cents, 2.51 cents rounded to 3 cents). // (required) - PriceMicros int64 `protobuf:"varint,1,opt,name=price_micros,json=priceMicros" json:"price_micros,omitempty"` + PriceMicros int64 `protobuf:"varint,1,opt,name=price_micros,json=priceMicros,proto3" json:"price_micros,omitempty"` // The currency of the price that is defined in ISO 4217. (required) - CurrencyCode string `protobuf:"bytes,2,opt,name=currency_code,json=currencyCode" json:"currency_code,omitempty"` + CurrencyCode string `protobuf:"bytes,2,opt,name=currency_code,json=currencyCode,proto3" json:"currency_code,omitempty"` // An optional and opaque string that identifies the pricing option that is // associated with the extended price. (optional) - PricingOptionTag string `protobuf:"bytes,3,opt,name=pricing_option_tag,json=pricingOptionTag" json:"pricing_option_tag,omitempty"` + PricingOptionTag string `protobuf:"bytes,3,opt,name=pricing_option_tag,json=pricingOptionTag,proto3" json:"pricing_option_tag,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1349,7 +1443,7 @@ func (m *Price) String() string { return proto.CompactTextString(m) } func (*Price) ProtoMessage() {} func (*Price) Descriptor() ([]byte, []int) { - return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{8} + return fileDescriptor_feeds_fc30b4ddff65807e, []int{8} } func (m *Price) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Price.Unmarshal(m, b) @@ -1394,14 +1488,14 @@ type SchedulingRules struct { // The minimum advance notice in seconds required to book an appointment. // (optional) - MinAdvanceBooking int64 `protobuf:"varint,1,opt,name=min_advance_booking,json=minAdvanceBooking" json:"min_advance_booking,omitempty"` + MinAdvanceBooking int64 `protobuf:"varint,1,opt,name=min_advance_booking,json=minAdvanceBooking,proto3" json:"min_advance_booking,omitempty"` // The minimum advance notice in seconds required to cancel a booked // appointment online. (optional) - MinAdvanceOnlineCanceling int64 `protobuf:"varint,2,opt,name=min_advance_online_canceling,json=minAdvanceOnlineCanceling" json:"min_advance_online_canceling,omitempty"` + MinAdvanceOnlineCanceling int64 `protobuf:"varint,2,opt,name=min_advance_online_canceling,json=minAdvanceOnlineCanceling,proto3" json:"min_advance_online_canceling,omitempty"` // The fee for canceling within the minimum advance notice period. - LateCancellationFee *Price `protobuf:"bytes,3,opt,name=late_cancellation_fee,json=lateCancellationFee" json:"late_cancellation_fee,omitempty"` // Deprecated: Do not use. + LateCancellationFee *Price `protobuf:"bytes,3,opt,name=late_cancellation_fee,json=lateCancellationFee,proto3" json:"late_cancellation_fee,omitempty"` // Deprecated: Do not use. // The fee for no-show without canceling. - NoshowFee *Price `protobuf:"bytes,4,opt,name=noshow_fee,json=noshowFee" json:"noshow_fee,omitempty"` // Deprecated: Do not use. + NoshowFee *Price `protobuf:"bytes,4,opt,name=noshow_fee,json=noshowFee,proto3" json:"noshow_fee,omitempty"` // Deprecated: Do not use. XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1411,7 +1505,7 @@ func (m *SchedulingRules) String() string { return proto.CompactTextString(m) } func (*SchedulingRules) ProtoMessage() {} func (*SchedulingRules) Descriptor() ([]byte, []int) { - return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{9} + return fileDescriptor_feeds_fc30b4ddff65807e, []int{9} } func (m *SchedulingRules) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SchedulingRules.Unmarshal(m, b) @@ -1480,7 +1574,7 @@ // the smallest currency unit (for example, fractions of one cent) will be // rounded using nearest even rounding. Taxes will be shown to the user as a // separate line item. (required) - MicroPercent int32 `protobuf:"varint,1,opt,name=micro_percent,json=microPercent" json:"micro_percent,omitempty"` + MicroPercent int32 `protobuf:"varint,1,opt,name=micro_percent,json=microPercent,proto3" json:"micro_percent,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1490,7 +1584,7 @@ func (m *TaxRate) String() string { return proto.CompactTextString(m) } func (*TaxRate) ProtoMessage() {} func (*TaxRate) Descriptor() ([]byte, []int) { - return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{10} + return fileDescriptor_feeds_fc30b4ddff65807e, []int{10} } func (m *TaxRate) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TaxRate.Unmarshal(m, b) @@ -1520,14 +1614,14 @@ // Defines a field that is included in a ServiceIntakeForm. type ServiceIntakeFormField struct { // The type of this field. (required) - Type ServiceIntakeFormField_FieldType `protobuf:"varint,1,opt,name=type,enum=maps.booking.feeds.ServiceIntakeFormField_FieldType" json:"type,omitempty"` + Type ServiceIntakeFormField_FieldType `protobuf:"varint,1,opt,name=type,proto3,enum=maps.booking.feeds.ServiceIntakeFormField_FieldType" json:"type,omitempty"` // The text shown to the user for this field. (required) - Label string `protobuf:"bytes,2,opt,name=label" json:"label,omitempty"` + Label string `protobuf:"bytes,2,opt,name=label,proto3" json:"label,omitempty"` // For MULTIPLE_CHOICE, CHECKBOXES, or DROPDOWN, the values to enumerate. // (optional) - Value []string `protobuf:"bytes,3,rep,name=value" json:"value,omitempty"` + Value []string `protobuf:"bytes,3,rep,name=value,proto3" json:"value,omitempty"` // Indicates whether an answer to this field is required by a user. (optional) - IsRequired bool `protobuf:"varint,4,opt,name=is_required,json=isRequired" json:"is_required,omitempty"` + IsRequired bool `protobuf:"varint,4,opt,name=is_required,json=isRequired,proto3" json:"is_required,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1537,7 +1631,7 @@ func (m *ServiceIntakeFormField) String() string { return proto.CompactTextString(m) } func (*ServiceIntakeFormField) ProtoMessage() {} func (*ServiceIntakeFormField) Descriptor() ([]byte, []int) { - return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{11} + return fileDescriptor_feeds_fc30b4ddff65807e, []int{11} } func (m *ServiceIntakeFormField) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ServiceIntakeFormField.Unmarshal(m, b) @@ -1588,13 +1682,13 @@ // Defines an intake form that customizes the service provided by a merchant. type ServiceIntakeForm struct { // Fields that will be displayed to the user. (required) - Field []*ServiceIntakeFormField `protobuf:"bytes,1,rep,name=field" json:"field,omitempty"` + Field []*ServiceIntakeFormField `protobuf:"bytes,1,rep,name=field,proto3" json:"field,omitempty"` // If true, this form will be shown to first time customers. // (one of first_time_customers or returning_customers required) - FirstTimeCustomers bool `protobuf:"varint,2,opt,name=first_time_customers,json=firstTimeCustomers" json:"first_time_customers,omitempty"` + FirstTimeCustomers bool `protobuf:"varint,2,opt,name=first_time_customers,json=firstTimeCustomers,proto3" json:"first_time_customers,omitempty"` // If true, this form will be shown to repeat customers. // (one of first_time_customers or returning_customers required) - ReturningCustomers bool `protobuf:"varint,3,opt,name=returning_customers,json=returningCustomers" json:"returning_customers,omitempty"` + ReturningCustomers bool `protobuf:"varint,3,opt,name=returning_customers,json=returningCustomers,proto3" json:"returning_customers,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1604,7 +1698,7 @@ func (m *ServiceIntakeForm) String() string { return proto.CompactTextString(m) } func (*ServiceIntakeForm) ProtoMessage() {} func (*ServiceIntakeForm) Descriptor() ([]byte, []int) { - return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{12} + return fileDescriptor_feeds_fc30b4ddff65807e, []int{12} } func (m *ServiceIntakeForm) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ServiceIntakeForm.Unmarshal(m, b) @@ -1649,11 +1743,11 @@ // for. type Deposit struct { // Deposit amount. - Deposit *Price `protobuf:"bytes,1,opt,name=deposit" json:"deposit,omitempty"` + Deposit *Price `protobuf:"bytes,1,opt,name=deposit,proto3" json:"deposit,omitempty"` // Minimum advance cancellation for the deposit. - MinAdvanceCancellationSec int64 `protobuf:"varint,2,opt,name=min_advance_cancellation_sec,json=minAdvanceCancellationSec" json:"min_advance_cancellation_sec,omitempty"` + MinAdvanceCancellationSec int64 `protobuf:"varint,2,opt,name=min_advance_cancellation_sec,json=minAdvanceCancellationSec,proto3" json:"min_advance_cancellation_sec,omitempty"` // Defines how the deposit is determined from the availability. - DepositType PriceType `protobuf:"varint,3,opt,name=deposit_type,json=depositType,enum=maps.booking.feeds.PriceType" json:"deposit_type,omitempty"` + DepositType PriceType `protobuf:"varint,3,opt,name=deposit_type,json=depositType,proto3,enum=maps.booking.feeds.PriceType" json:"deposit_type,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1663,7 +1757,7 @@ func (m *Deposit) String() string { return proto.CompactTextString(m) } func (*Deposit) ProtoMessage() {} func (*Deposit) Descriptor() ([]byte, []int) { - return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{13} + return fileDescriptor_feeds_fc30b4ddff65807e, []int{13} } func (m *Deposit) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Deposit.Unmarshal(m, b) @@ -1709,9 +1803,9 @@ type NoShowFee struct { // The amount the user may be charged if they do not show up for their // reservation. - Fee *Price `protobuf:"bytes,1,opt,name=fee" json:"fee,omitempty"` + Fee *Price `protobuf:"bytes,1,opt,name=fee,proto3" json:"fee,omitempty"` // Defines how the fee is determined from the availability. - FeeType PriceType `protobuf:"varint,3,opt,name=fee_type,json=feeType,enum=maps.booking.feeds.PriceType" json:"fee_type,omitempty"` + FeeType PriceType `protobuf:"varint,3,opt,name=fee_type,json=feeType,proto3,enum=maps.booking.feeds.PriceType" json:"fee_type,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1721,7 +1815,7 @@ func (m *NoShowFee) String() string { return proto.CompactTextString(m) } func (*NoShowFee) ProtoMessage() {} func (*NoShowFee) Descriptor() ([]byte, []int) { - return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{14} + return fileDescriptor_feeds_fc30b4ddff65807e, []int{14} } func (m *NoShowFee) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_NoShowFee.Unmarshal(m, b) @@ -1760,15 +1854,15 @@ // performed on. type ActionLink struct { // The entry point URL for this action link. - Url string `protobuf:"bytes,1,opt,name=url" json:"url,omitempty"` + Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"` // The BCP-47 language tag identifying the language in which the content // from this URI is available. - Language string `protobuf:"bytes,2,opt,name=language" json:"language,omitempty"` + Language string `protobuf:"bytes,2,opt,name=language,proto3" json:"language,omitempty"` // ISO 3166-1 alpha-2 country code. Leave empty for unrestricted visibility. - RestrictedCountry []string `protobuf:"bytes,3,rep,name=restricted_country,json=restrictedCountry" json:"restricted_country,omitempty"` + RestrictedCountry []string `protobuf:"bytes,3,rep,name=restricted_country,json=restrictedCountry,proto3" json:"restricted_country,omitempty"` // The platform that this action should be performed on. If this field is // unset, ACTION_PLATFORM_WEB_APPLICATION will be used as fallback. - Platform ActionPlatform `protobuf:"varint,4,opt,name=platform,enum=maps.booking.feeds.ActionPlatform" json:"platform,omitempty"` + Platform ActionPlatform `protobuf:"varint,4,opt,name=platform,proto3,enum=maps.booking.feeds.ActionPlatform" json:"platform,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1778,7 +1872,7 @@ func (m *ActionLink) String() string { return proto.CompactTextString(m) } func (*ActionLink) ProtoMessage() {} func (*ActionLink) Descriptor() ([]byte, []int) { - return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{15} + return fileDescriptor_feeds_fc30b4ddff65807e, []int{15} } func (m *ActionLink) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ActionLink.Unmarshal(m, b) @@ -1833,12 +1927,12 @@ type TicketType struct { // The ticket id is used to differentiate among different ticket types of the // same service, and is only expected to be unique within a service. - TicketTypeId string `protobuf:"bytes,1,opt,name=ticket_type_id,json=ticketTypeId" json:"ticket_type_id,omitempty"` + TicketTypeId string `protobuf:"bytes,1,opt,name=ticket_type_id,json=ticketTypeId,proto3" json:"ticket_type_id,omitempty"` // This can be user visible, e.g., “adult”, "child", “veteran”, “Row J”, etc. - ShortDescription string `protobuf:"bytes,2,opt,name=short_description,json=shortDescription" json:"short_description,omitempty"` + ShortDescription string `protobuf:"bytes,2,opt,name=short_description,json=shortDescription,proto3" json:"short_description,omitempty"` // The price of a single ticket of this type, exclusive of any taxes. The tax // rate of Service is applied to its tickets. - Price *Price `protobuf:"bytes,3,opt,name=price" json:"price,omitempty"` + Price *Price `protobuf:"bytes,3,opt,name=price,proto3" json:"price,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1848,7 +1942,7 @@ func (m *TicketType) String() string { return proto.CompactTextString(m) } func (*TicketType) ProtoMessage() {} func (*TicketType) Descriptor() ([]byte, []int) { - return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{16} + return fileDescriptor_feeds_fc30b4ddff65807e, []int{16} } func (m *TicketType) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TicketType.Unmarshal(m, b) @@ -1894,11 +1988,11 @@ // ensure that they are displayed to end-users in the most efficient way. type RelatedMedia struct { // URL of this media source. - Url string `protobuf:"bytes,1,opt,name=url" json:"url,omitempty"` + Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"` // Type of this media source. - Type RelatedMedia_MediaType `protobuf:"varint,2,opt,name=type,enum=maps.booking.feeds.RelatedMedia_MediaType" json:"type,omitempty"` + Type RelatedMedia_MediaType `protobuf:"varint,2,opt,name=type,proto3,enum=maps.booking.feeds.RelatedMedia_MediaType" json:"type,omitempty"` // Caption of the media, only plain text is supported. (optional) - Caption string `protobuf:"bytes,3,opt,name=caption" json:"caption,omitempty"` + Caption string `protobuf:"bytes,3,opt,name=caption,proto3" json:"caption,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1908,7 +2002,7 @@ func (m *RelatedMedia) String() string { return proto.CompactTextString(m) } func (*RelatedMedia) ProtoMessage() {} func (*RelatedMedia) Descriptor() ([]byte, []int) { - return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{17} + return fileDescriptor_feeds_fc30b4ddff65807e, []int{17} } func (m *RelatedMedia) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RelatedMedia.Unmarshal(m, b) @@ -1954,10 +2048,10 @@ type ServiceAttributeValueId struct { // ID of an attribute as defined in Merchant.service_attribute, e.g. // "service-type". - AttributeId string `protobuf:"bytes,1,opt,name=attribute_id,json=attributeId" json:"attribute_id,omitempty"` + AttributeId string `protobuf:"bytes,1,opt,name=attribute_id,json=attributeId,proto3" json:"attribute_id,omitempty"` // ID of the value for this attribute, e.g. "haircut". Must match a value_id // in the service attribute definition. - ValueId string `protobuf:"bytes,2,opt,name=value_id,json=valueId" json:"value_id,omitempty"` + ValueId string `protobuf:"bytes,2,opt,name=value_id,json=valueId,proto3" json:"value_id,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1967,7 +2061,7 @@ func (m *ServiceAttributeValueId) String() string { return proto.CompactTextString(m) } func (*ServiceAttributeValueId) ProtoMessage() {} func (*ServiceAttributeValueId) Descriptor() ([]byte, []int) { - return fileDescriptor_feeds_0b3f05d3b8d0e7eb, []int{18} + return fileDescriptor_feeds_fc30b4ddff65807e, []int{18} } func (m *ServiceAttributeValueId) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ServiceAttributeValueId.Unmarshal(m, b) @@ -2033,149 +2127,151 @@ proto.RegisterEnum("maps.booking.feeds.RelatedMedia_MediaType", RelatedMedia_MediaType_name, RelatedMedia_MediaType_value) } -func init() { proto.RegisterFile("feeds.proto", fileDescriptor_feeds_0b3f05d3b8d0e7eb) } +func init() { proto.RegisterFile("feeds.proto", fileDescriptor_feeds_fc30b4ddff65807e) } -var fileDescriptor_feeds_0b3f05d3b8d0e7eb = []byte{ - // 2250 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x58, 0x4f, 0x73, 0xdb, 0xc6, - 0x15, 0x0f, 0x48, 0xd1, 0x24, 0x1f, 0x69, 0x19, 0x5c, 0xc9, 0x12, 0x2c, 0xc7, 0xb1, 0x0a, 0x37, - 0x53, 0x55, 0x4e, 0x99, 0x56, 0x4e, 0x32, 0xc9, 0xc4, 0x4d, 0x42, 0x81, 0x90, 0x85, 0x31, 0x45, - 0xc0, 0x4b, 0xc8, 0x8e, 0x7b, 0xd9, 0x40, 0xc0, 0x4a, 0xc2, 0x98, 0x04, 0xd8, 0x05, 0xa8, 0x58, - 0x99, 0xc9, 0xa5, 0xa7, 0x1e, 0x3b, 0xd3, 0x5b, 0x3f, 0x41, 0x3b, 0xf5, 0x07, 0xe8, 0xf4, 0xd6, - 0x53, 0x3f, 0x4e, 0x3f, 0x40, 0x2f, 0x9d, 0x5d, 0x80, 0x00, 0x28, 0x41, 0x96, 0x3b, 0xed, 0x85, - 0xc2, 0xbe, 0xf7, 0x7e, 0xfb, 0xe7, 0xbd, 0x7d, 0xbf, 0xf7, 0x56, 0xd0, 0x3a, 0xa6, 0xd4, 0x8b, - 0xba, 0x53, 0x16, 0xc6, 0x21, 0x42, 0x13, 0x67, 0x1a, 0x75, 0x8f, 0xc2, 0xf0, 0x95, 0x1f, 0x9c, - 0x74, 0x85, 0x46, 0xfd, 0x57, 0x05, 0xda, 0x7b, 0x94, 0x7a, 0x07, 0x34, 0x76, 0x3c, 0x27, 0x76, - 0xd0, 0x04, 0xd6, 0xa6, 0x2c, 0x74, 0x69, 0x14, 0xf9, 0xc1, 0x09, 0xf1, 0x83, 0x28, 0x66, 0x33, - 0x37, 0xf6, 0xc3, 0x40, 0x91, 0x36, 0xa5, 0xad, 0xe5, 0x9d, 0xcf, 0xba, 0x97, 0x67, 0xe9, 0x16, - 0x67, 0xe8, 0x5a, 0x19, 0xdc, 0xc8, 0xd1, 0xf8, 0xf6, 0xb4, 0x4c, 0x8c, 0x7e, 0x02, 0xed, 0xe8, - 0xd4, 0x61, 0x1e, 0x09, 0x66, 0x93, 0x23, 0xca, 0x94, 0xca, 0xa6, 0xb4, 0x55, 0xc3, 0x2d, 0x21, - 0x1b, 0x0a, 0x11, 0x37, 0x89, 0xc3, 0xd8, 0x19, 0x13, 0x21, 0x8c, 0x94, 0x6a, 0x62, 0x22, 0x64, - 0x23, 0x21, 0x42, 0xab, 0x50, 0x0b, 0xc2, 0xc0, 0xa5, 0x4a, 0x6d, 0x53, 0xda, 0x5a, 0xc2, 0xc9, - 0x00, 0xfd, 0x0a, 0x56, 0x4f, 0x68, 0x40, 0x99, 0xc3, 0x57, 0x22, 0xb1, 0x3f, 0xa1, 0x51, 0xec, - 0x4c, 0xa6, 0xca, 0xd2, 0xa6, 0xb4, 0x55, 0xc5, 0x2b, 0xb9, 0xce, 0x9e, 0xab, 0x54, 0x07, 0x6e, - 0x97, 0x6e, 0x1f, 0xad, 0xc0, 0x2d, 0x0b, 0x9b, 0x9a, 0x3e, 0x1a, 0x91, 0xc3, 0xe1, 0xd3, 0xa1, - 0xf9, 0x62, 0x28, 0xbf, 0x87, 0xd6, 0x61, 0x65, 0x2e, 0xec, 0x8d, 0x88, 0x66, 0x1e, 0x58, 0x03, - 0xdd, 0xd6, 0x65, 0x09, 0x6d, 0xc0, 0x5a, 0x41, 0x61, 0x0c, 0x35, 0xac, 0x1f, 0xe8, 0x43, 0xbb, - 0x37, 0x90, 0x2b, 0xea, 0x1b, 0x09, 0xe4, 0xde, 0x99, 0xe3, 0x8f, 0x9d, 0x23, 0x7f, 0xec, 0xc7, - 0xe7, 0xdc, 0x77, 0xe8, 0x31, 0x34, 0x26, 0xa9, 0xff, 0x84, 0x9f, 0x5b, 0x3b, 0x9b, 0xd7, 0xf9, - 0x19, 0x67, 0x08, 0xf4, 0x1b, 0x58, 0x8d, 0x28, 0x3b, 0xf3, 0x5d, 0x4a, 0x9c, 0xc2, 0xcc, 0x4a, - 0x65, 0xb3, 0xba, 0xd5, 0xda, 0xf9, 0x59, 0xd9, 0x4c, 0xa3, 0xc4, 0xbe, 0xb8, 0x11, 0xbc, 0x12, - 0x5d, 0x16, 0xaa, 0xff, 0xae, 0xc0, 0x4a, 0x89, 0x31, 0xfa, 0x1c, 0x94, 0x28, 0x76, 0x58, 0x9c, - 0xfb, 0x95, 0x30, 0x1a, 0xc5, 0xcc, 0x77, 0x63, 0x71, 0x82, 0x2a, 0x5e, 0x13, 0xfa, 0xcc, 0xb7, - 0x38, 0xd5, 0xa2, 0x4f, 0x60, 0x8d, 0x06, 0x5e, 0x19, 0xae, 0x22, 0x70, 0xab, 0x34, 0xf0, 0x2e, - 0xa3, 0x7e, 0x09, 0xab, 0x13, 0xca, 0xdc, 0x53, 0x27, 0x88, 0x89, 0xef, 0xe5, 0x18, 0x7e, 0x1b, - 0x9a, 0x18, 0xcd, 0x75, 0x86, 0x97, 0x21, 0xba, 0x30, 0x3f, 0xd0, 0x02, 0x60, 0x49, 0x00, 0x3a, - 0xa9, 0xaa, 0x60, 0x3f, 0x00, 0xc4, 0x68, 0x14, 0xce, 0x98, 0x4b, 0xa3, 0xdc, 0xfc, 0x86, 0x88, - 0xc6, 0xbd, 0x32, 0x1f, 0xe2, 0xb9, 0x35, 0xee, 0x64, 0xc0, 0x6c, 0xb6, 0x3e, 0xb4, 0x17, 0x62, - 0x51, 0x13, 0xb1, 0x28, 0x8d, 0xea, 0x42, 0x10, 0x16, 0x50, 0xea, 0x3f, 0x6b, 0xd0, 0x5e, 0x70, - 0xfb, 0x7d, 0x68, 0x15, 0xdc, 0x20, 0x3c, 0xdd, 0xc4, 0x90, 0x9f, 0x1e, 0xdd, 0x03, 0xc8, 0x4f, - 0x2d, 0x3c, 0xda, 0xc4, 0xcd, 0xec, 0xb0, 0xe8, 0x2e, 0x34, 0x93, 0xb0, 0x45, 0xd4, 0x15, 0xbe, - 0xab, 0xe2, 0x86, 0x10, 0x8c, 0xa8, 0xcb, 0x33, 0xcd, 0x9b, 0xa5, 0xe9, 0xc2, 0xf5, 0x49, 0xa2, - 0xb4, 0xe6, 0x32, 0x6e, 0x72, 0x1f, 0x5a, 0xd1, 0x34, 0x8c, 0x23, 0x22, 0xd2, 0x4f, 0xe4, 0x5b, - 0x15, 0x83, 0x10, 0xd9, 0x5c, 0x22, 0xd6, 0x17, 0x06, 0xe1, 0x94, 0x06, 0xc2, 0x7b, 0x55, 0xdc, - 0x14, 0x12, 0x73, 0x4a, 0x03, 0xf4, 0x73, 0x90, 0x8b, 0x07, 0x24, 0xb1, 0x73, 0xa2, 0xd4, 0xc5, - 0x26, 0x6f, 0x15, 0xe5, 0xb6, 0x73, 0x82, 0xbe, 0x84, 0x66, 0xe6, 0x56, 0xa5, 0xf1, 0x2e, 0x61, - 0xc8, 0xed, 0xd1, 0x36, 0x74, 0xa6, 0xce, 0xf9, 0x84, 0x06, 0x31, 0x09, 0xa7, 0xe2, 0x40, 0xbe, - 0xa7, 0x34, 0x37, 0xab, 0x7c, 0xa1, 0x54, 0x61, 0x0a, 0xb9, 0xe1, 0xa1, 0xa7, 0x00, 0x8c, 0xba, - 0x33, 0xc6, 0x28, 0xa7, 0x10, 0x10, 0x2b, 0x3d, 0xbc, 0x2e, 0x50, 0x5d, 0x9c, 0x41, 0x70, 0x01, - 0x8e, 0x1c, 0x40, 0x91, 0x7b, 0x4a, 0xbd, 0xd9, 0x98, 0x12, 0xfa, 0xda, 0xa5, 0x62, 0x11, 0xa5, - 0x25, 0xa2, 0xbf, 0x73, 0xed, 0xa4, 0xa3, 0x14, 0xaa, 0xcf, 0x91, 0xb8, 0x13, 0x5d, 0x14, 0x6d, - 0x7c, 0x07, 0x90, 0x2f, 0x8e, 0xb6, 0x40, 0x66, 0x74, 0x4a, 0x9d, 0x98, 0xcc, 0x82, 0xd8, 0x1f, - 0x8b, 0xc0, 0x25, 0x09, 0xb8, 0x9c, 0xc8, 0x0f, 0xb9, 0x98, 0xc7, 0x2e, 0xb7, 0xa4, 0x67, 0x94, - 0x9d, 0x0b, 0xcb, 0x84, 0x6f, 0x53, 0x4b, 0x9d, 0x8b, 0x47, 0xd4, 0xdd, 0x78, 0x06, 0x9d, 0x4b, - 0x3b, 0x41, 0x8f, 0x01, 0x78, 0xce, 0x12, 0xe6, 0x04, 0x27, 0x34, 0x65, 0xa9, 0xd2, 0x80, 0xf0, - 0xe4, 0xc5, 0xdc, 0x08, 0x37, 0xe3, 0xf9, 0xa7, 0xfa, 0x27, 0x09, 0x9a, 0x59, 0xa4, 0xd0, 0x1d, - 0xe0, 0xb7, 0xee, 0xf8, 0x38, 0xbf, 0xc3, 0x75, 0x31, 0x4e, 0x2f, 0xb0, 0x50, 0x05, 0xce, 0x84, - 0x66, 0x17, 0x98, 0x4b, 0x86, 0xce, 0x84, 0xa2, 0x75, 0xa8, 0xb3, 0x30, 0x9c, 0x70, 0x60, 0x92, - 0xfa, 0x37, 0xf8, 0x30, 0xb9, 0xd9, 0x42, 0x21, 0x60, 0x49, 0x92, 0x37, 0xb8, 0x40, 0xa0, 0xee, - 0x01, 0x4c, 0x1d, 0x16, 0x9f, 0x93, 0xc8, 0xff, 0x21, 0xa9, 0x12, 0x35, 0xdc, 0x14, 0x92, 0x91, - 0xff, 0x03, 0x55, 0x7b, 0xd0, 0xcc, 0x36, 0xcd, 0x27, 0x3a, 0xa2, 0x27, 0x7e, 0x50, 0xf0, 0x64, - 0x43, 0x08, 0xb8, 0x0f, 0xd7, 0xa1, 0xce, 0xc9, 0x6b, 0xee, 0xba, 0x2a, 0xbe, 0x41, 0x03, 0x6f, - 0x44, 0x5d, 0xf5, 0x77, 0x12, 0xb4, 0x52, 0x9e, 0xfc, 0x3f, 0x30, 0xfa, 0xa7, 0x50, 0x4f, 0x73, - 0x36, 0x25, 0xf1, 0xbb, 0x6f, 0x21, 0x71, 0x3c, 0xb7, 0x55, 0xdf, 0x00, 0xd4, 0x53, 0xe1, 0xff, - 0xcc, 0x14, 0x08, 0x96, 0x84, 0x2b, 0x13, 0x2f, 0x8b, 0x6f, 0xb4, 0x09, 0x2d, 0x8f, 0x46, 0x2e, - 0xf3, 0x93, 0x5b, 0x9d, 0x78, 0xb9, 0x28, 0x42, 0x1f, 0x43, 0x6d, 0xca, 0xfc, 0xb4, 0x12, 0xb7, - 0x76, 0xee, 0x94, 0x6d, 0xdb, 0xe2, 0x06, 0x38, 0xb1, 0x43, 0x5f, 0x40, 0x8d, 0xcd, 0xc6, 0x34, - 0x4a, 0x89, 0xf6, 0x41, 0xe9, 0x39, 0x93, 0xbb, 0xe8, 0x07, 0x27, 0x98, 0x9b, 0xe2, 0x04, 0x81, - 0xbe, 0x80, 0xa5, 0xe3, 0x90, 0x4d, 0x94, 0xba, 0xf0, 0xd0, 0x87, 0x6f, 0xf1, 0x90, 0x11, 0xc4, - 0xce, 0x2b, 0xba, 0x17, 0xb2, 0x09, 0x16, 0x10, 0x34, 0x82, 0x5b, 0x53, 0x46, 0xe7, 0x0c, 0x11, - 0x9f, 0x4f, 0xa9, 0x60, 0x98, 0xe5, 0x9d, 0xed, 0xb7, 0xcc, 0xd2, 0xb5, 0x32, 0x88, 0x7d, 0x3e, - 0xa5, 0x78, 0x79, 0xba, 0x30, 0x46, 0x9f, 0x41, 0x23, 0x76, 0x5e, 0x13, 0xe6, 0xc4, 0x54, 0x69, - 0x8a, 0xd3, 0x94, 0x46, 0xcd, 0x76, 0x5e, 0x63, 0x27, 0xa6, 0xb8, 0x1e, 0x27, 0x1f, 0xe5, 0x5c, - 0x05, 0xe5, 0x5c, 0xf5, 0x29, 0xd4, 0x3d, 0x3a, 0x0d, 0x23, 0x3f, 0x56, 0x5a, 0x57, 0x2f, 0xd1, - 0x4f, 0x4c, 0xf0, 0xdc, 0x16, 0xfd, 0x1a, 0x5a, 0x41, 0x48, 0xa2, 0xd3, 0xf0, 0x7b, 0x72, 0x4c, - 0xa9, 0xd2, 0xbe, 0x3a, 0x79, 0x87, 0xe1, 0xe8, 0x34, 0xfc, 0x7e, 0x8f, 0x52, 0xdc, 0x0c, 0xe6, - 0x9f, 0xe8, 0x10, 0x56, 0x18, 0xfd, 0xed, 0xcc, 0x67, 0x94, 0xb8, 0x8c, 0x7a, 0x7e, 0x4c, 0x5c, - 0x87, 0x79, 0xca, 0x4d, 0xe1, 0xb2, 0x0f, 0xcb, 0x49, 0x59, 0x98, 0x6b, 0xc2, 0x5a, 0x73, 0x98, - 0xc7, 0x6b, 0xe4, 0x05, 0x11, 0xfa, 0x1a, 0x5a, 0x8e, 0x68, 0xaf, 0xc8, 0xd8, 0x0f, 0x5e, 0x29, - 0xcb, 0x22, 0x8e, 0x1f, 0x94, 0x92, 0xa4, 0x30, 0x1b, 0xf8, 0xc1, 0x2b, 0x0c, 0x4e, 0xf6, 0x8d, - 0xbe, 0x84, 0x25, 0x11, 0xbb, 0x5b, 0x62, 0x23, 0x6f, 0x6b, 0x74, 0xe6, 0x7f, 0x45, 0xe0, 0x04, - 0x88, 0xaf, 0x1e, 0xfb, 0xee, 0x2b, 0x9a, 0xc6, 0x5f, 0xbe, 0x7a, 0x75, 0x5b, 0x98, 0x09, 0x28, - 0xc4, 0xd9, 0x37, 0xd2, 0xe1, 0x26, 0xa3, 0x63, 0x27, 0xa6, 0x1e, 0x99, 0x50, 0xcf, 0x77, 0x94, - 0xce, 0xd5, 0x35, 0x1e, 0x27, 0x86, 0x07, 0xdc, 0x0e, 0xb7, 0x59, 0x61, 0x84, 0x4e, 0x61, 0x23, - 0xeb, 0xde, 0xe2, 0x98, 0xf9, 0x47, 0xb3, 0x98, 0x92, 0x33, 0x67, 0x3c, 0x13, 0x79, 0x89, 0xc4, - 0x9c, 0x0f, 0xdf, 0xd6, 0xc3, 0xcd, 0x41, 0xcf, 0x39, 0xc6, 0xf0, 0xf0, 0x7a, 0x54, 0xae, 0x50, - 0xbf, 0x83, 0xe5, 0xc5, 0x2b, 0x8c, 0xee, 0xc3, 0x5d, 0x0b, 0xeb, 0x56, 0xef, 0x25, 0x6f, 0x4f, - 0x89, 0xfd, 0xd2, 0xd2, 0xc9, 0xe1, 0x70, 0x64, 0xe9, 0x9a, 0xb1, 0x67, 0xe8, 0x7d, 0xf9, 0x3d, - 0xd4, 0x86, 0x06, 0xd6, 0x9f, 0x1d, 0x1a, 0x58, 0xef, 0xcb, 0x12, 0x1f, 0x99, 0x96, 0x6d, 0x98, - 0x43, 0xde, 0xc9, 0xa2, 0x0e, 0xdc, 0x1c, 0x9a, 0x36, 0x19, 0x1d, 0x5a, 0x96, 0x89, 0x6d, 0xbd, - 0x2f, 0x57, 0xd5, 0xbf, 0xe6, 0x2c, 0x28, 0xe6, 0x7f, 0x1f, 0x94, 0x91, 0x8e, 0x9f, 0x1b, 0x9a, - 0x5e, 0x36, 0xf9, 0x03, 0xb8, 0xbf, 0xa0, 0xed, 0x1b, 0x43, 0x63, 0xf8, 0x84, 0x60, 0x9d, 0x4b, - 0x7b, 0x7c, 0x1d, 0x59, 0x42, 0x1f, 0xc0, 0xc6, 0x82, 0xd1, 0x9e, 0x69, 0xf6, 0x89, 0x89, 0xfb, - 0x3a, 0x36, 0x86, 0x4f, 0xe4, 0x0a, 0xba, 0x07, 0x77, 0x16, 0xf4, 0xfa, 0x73, 0x71, 0x14, 0x43, - 0x7b, 0xaa, 0xdb, 0x72, 0x95, 0xb7, 0xe2, 0x0b, 0x6a, 0x1b, 0x1b, 0x16, 0xb1, 0xcd, 0x43, 0x2c, - 0x2f, 0xa9, 0x3f, 0x42, 0x4d, 0x70, 0x11, 0x6f, 0x7c, 0x04, 0x1b, 0x91, 0x89, 0xef, 0xb2, 0x30, - 0x4a, 0x59, 0xbf, 0x25, 0x64, 0x07, 0x42, 0x84, 0x1e, 0xc0, 0xcd, 0xb4, 0xe4, 0x9e, 0x13, 0x37, - 0xf4, 0xe6, 0x95, 0xa9, 0x3d, 0x17, 0x6a, 0xa1, 0x47, 0xd1, 0x47, 0x80, 0x38, 0x86, 0xbf, 0x9c, - 0xd2, 0x4c, 0xe6, 0xfd, 0x4d, 0xc2, 0xa0, 0x72, 0xaa, 0x49, 0x52, 0xd9, 0x76, 0x4e, 0xd4, 0x3f, - 0x56, 0xe0, 0xd6, 0x05, 0x6a, 0xe3, 0x4d, 0xeb, 0xc4, 0x0f, 0x88, 0xe3, 0x9d, 0x39, 0x81, 0x4b, - 0x49, 0x1a, 0xf0, 0x74, 0x43, 0x9d, 0x89, 0x1f, 0xf4, 0x12, 0xcd, 0x6e, 0xa2, 0x40, 0x5f, 0xc3, - 0xfb, 0x45, 0xfb, 0x30, 0x18, 0xfb, 0x01, 0x25, 0x2e, 0x1f, 0xf0, 0x49, 0xd3, 0x22, 0x75, 0x27, - 0x07, 0x9a, 0xc2, 0x42, 0x9b, 0x1b, 0xa0, 0x67, 0x70, 0x9b, 0xdf, 0xc5, 0x14, 0x32, 0x4e, 0x9a, - 0x3f, 0xce, 0x11, 0xd5, 0x6b, 0x08, 0x7c, 0xb7, 0xa2, 0x48, 0x78, 0x85, 0x63, 0xb5, 0x02, 0x94, - 0xb3, 0xc5, 0x63, 0x80, 0x20, 0xcc, 0xb8, 0x66, 0xe9, 0x5d, 0xe6, 0x69, 0x26, 0x80, 0x3d, 0x4a, - 0xd5, 0x2e, 0xd4, 0x53, 0x86, 0xe4, 0x3e, 0x17, 0x01, 0x21, 0x53, 0xca, 0x5c, 0x1a, 0x24, 0x0f, - 0x8b, 0x1a, 0x6e, 0x0b, 0xa1, 0x95, 0xc8, 0xd4, 0xbf, 0x57, 0x60, 0xed, 0x12, 0xcd, 0xef, 0xf9, - 0x74, 0xec, 0xa1, 0xfd, 0x94, 0x1e, 0x92, 0x97, 0xeb, 0x27, 0xef, 0x54, 0x20, 0x04, 0xb2, 0x2b, - 0x7e, 0x0b, 0x5c, 0xb1, 0x0a, 0xb5, 0xb1, 0x73, 0x44, 0xc7, 0x69, 0xd4, 0x93, 0x01, 0x97, 0x8a, - 0x3c, 0x55, 0xaa, 0x82, 0xac, 0x93, 0x01, 0x2f, 0xbc, 0x3e, 0x7f, 0x40, 0x08, 0xb6, 0xf3, 0xc4, - 0xf9, 0x1b, 0x18, 0xfc, 0x28, 0xa5, 0x44, 0x4f, 0xfd, 0xbd, 0x04, 0xcd, 0x6c, 0x01, 0x7e, 0x41, - 0xf7, 0x0c, 0x7d, 0xd0, 0x2f, 0x4b, 0x10, 0x19, 0xda, 0xa3, 0x7d, 0x13, 0xdb, 0xa4, 0x37, 0x1c, - 0xbd, 0xd0, 0xb1, 0x2c, 0xa1, 0x9b, 0xd0, 0xb4, 0x7a, 0xb8, 0xf7, 0x04, 0xf7, 0xac, 0x7d, 0xb9, - 0xc2, 0x9f, 0xa5, 0x07, 0x87, 0x03, 0xdb, 0xb0, 0x06, 0x3a, 0xd1, 0xf6, 0x4d, 0x43, 0xd3, 0xe5, - 0x2a, 0x5a, 0x06, 0xd0, 0xf6, 0x75, 0xed, 0xe9, 0xae, 0xf9, 0xad, 0x3e, 0x92, 0x97, 0x78, 0xd6, - 0xf6, 0xb1, 0x69, 0xf5, 0xf9, 0xa3, 0xb5, 0x86, 0x5a, 0x50, 0xdf, 0x35, 0xcd, 0x81, 0xde, 0x1b, - 0xca, 0x37, 0xd4, 0xbf, 0x49, 0xd0, 0xb9, 0xe4, 0x02, 0xf4, 0x0d, 0xd4, 0x8e, 0xf9, 0xfe, 0x14, - 0x49, 0x90, 0xcf, 0xf6, 0xbb, 0x3b, 0x0e, 0x27, 0x40, 0xfe, 0x5a, 0x3b, 0xf6, 0x59, 0x94, 0xbc, - 0x0e, 0x89, 0x3b, 0x8b, 0xe2, 0x70, 0x42, 0x59, 0x24, 0xdc, 0xd7, 0xc0, 0x48, 0xe8, 0x78, 0xc7, - 0xa5, 0xcd, 0x35, 0xe8, 0x63, 0x5e, 0x62, 0xe2, 0x19, 0x0b, 0x78, 0xf2, 0xe4, 0x80, 0x6a, 0x02, - 0xc8, 0x54, 0x19, 0x40, 0xfd, 0x87, 0x04, 0xf5, 0xb4, 0xce, 0xa1, 0x47, 0x79, 0x55, 0x94, 0xae, - 0xeb, 0x3b, 0xb2, 0x9a, 0x78, 0x21, 0x75, 0x16, 0x12, 0x20, 0xef, 0xef, 0x0a, 0xa9, 0x53, 0xbc, - 0xe7, 0xbc, 0x17, 0xfc, 0x06, 0xda, 0xe9, 0x5c, 0x49, 0x05, 0xa9, 0x8a, 0x6b, 0x76, 0xef, 0xca, - 0xa5, 0xc5, 0x7d, 0x6a, 0xa5, 0x10, 0x3e, 0x50, 0x19, 0x34, 0xb3, 0x7a, 0x8b, 0x1e, 0x42, 0x95, - 0xe7, 0xcb, 0xb5, 0x07, 0xe0, 0x56, 0xe8, 0x73, 0x68, 0x1c, 0x53, 0xfa, 0x5f, 0xac, 0x5b, 0x3f, - 0xa6, 0xe2, 0x43, 0xfd, 0x8b, 0x04, 0x90, 0x97, 0x53, 0x24, 0x43, 0x75, 0xc6, 0xc6, 0x69, 0x7b, - 0xc8, 0x3f, 0xd1, 0x06, 0x34, 0xc6, 0x4e, 0x70, 0x32, 0x73, 0x4e, 0xe6, 0x24, 0x97, 0x8d, 0xd1, - 0x2f, 0xc4, 0x1b, 0x59, 0xbc, 0x70, 0xa9, 0x47, 0xdc, 0x70, 0x16, 0xc4, 0xec, 0x3c, 0xbd, 0xfe, - 0x9d, 0x5c, 0xa3, 0x25, 0x0a, 0xf4, 0x15, 0x34, 0xa6, 0x63, 0x27, 0x16, 0x5d, 0xda, 0x92, 0xd8, - 0xa5, 0x7a, 0x75, 0x75, 0xb7, 0x52, 0x4b, 0x9c, 0x61, 0xd4, 0x3f, 0x48, 0x00, 0x79, 0xf1, 0x45, - 0x3f, 0x85, 0xe5, 0x42, 0xc5, 0xce, 0xbb, 0xda, 0x76, 0x5e, 0x94, 0x0d, 0x0f, 0x3d, 0x84, 0x4e, - 0x74, 0x1a, 0xb2, 0x98, 0x14, 0x5b, 0xd5, 0xe4, 0x20, 0xb2, 0x50, 0xf4, 0xcb, 0xfa, 0xd5, 0xea, - 0xbb, 0xf5, 0xab, 0xea, 0x9f, 0x25, 0x68, 0x17, 0x8b, 0x79, 0x89, 0x03, 0xbf, 0x4a, 0x69, 0xa7, - 0x72, 0x75, 0x47, 0x59, 0x9c, 0xa1, 0x2b, 0x7e, 0x0b, 0x64, 0xa3, 0x40, 0xdd, 0x75, 0x92, 0x6d, - 0x27, 0xa5, 0x63, 0x3e, 0x54, 0x3f, 0x82, 0x66, 0x66, 0x8c, 0x56, 0x41, 0x2e, 0xa1, 0x8c, 0x26, - 0xd4, 0xac, 0x7d, 0xd3, 0x36, 0x65, 0x49, 0x7d, 0x01, 0xeb, 0x57, 0xb4, 0x08, 0xbc, 0xe0, 0xe5, - 0xbd, 0x46, 0xe6, 0xc7, 0x56, 0x26, 0x33, 0x3c, 0xfe, 0x44, 0xcb, 0x9a, 0x90, 0xc4, 0x7b, 0xf5, - 0xb3, 0x04, 0xbd, 0xfd, 0x08, 0x9a, 0xd9, 0xc5, 0x42, 0x6b, 0x80, 0xf6, 0x8c, 0x6f, 0xf5, 0x3e, - 0xc1, 0x3d, 0x5b, 0x27, 0x7d, 0x7d, 0xaf, 0x77, 0x38, 0xb0, 0xe5, 0xf7, 0x38, 0x0b, 0x59, 0x3a, - 0x26, 0x96, 0x8e, 0x47, 0xbc, 0x8e, 0x6f, 0xff, 0x08, 0x9d, 0x4b, 0x4d, 0x21, 0xef, 0x00, 0xd2, - 0xf6, 0x82, 0x68, 0x58, 0xef, 0x1b, 0x36, 0xd1, 0x7a, 0xb8, 0x7f, 0xb9, 0x4d, 0x28, 0x33, 0xd2, - 0xcc, 0x61, 0xdf, 0x48, 0x9b, 0x11, 0xd1, 0x26, 0x94, 0x19, 0xf5, 0x06, 0x2f, 0x7a, 0x2f, 0x47, - 0x72, 0x65, 0xfb, 0x8d, 0x04, 0xcb, 0x8b, 0xf7, 0x8c, 0x37, 0x3f, 0x3d, 0x8d, 0x4f, 0x40, 0xac, - 0x41, 0xcf, 0xde, 0x33, 0xf1, 0xc1, 0xe5, 0x85, 0x2f, 0x1a, 0xbc, 0xd0, 0x77, 0x49, 0xcf, 0xb2, - 0x06, 0x86, 0x56, 0xe8, 0x4f, 0x2e, 0x1a, 0x1d, 0x98, 0xbb, 0xc6, 0x40, 0xe7, 0xb6, 0x72, 0x05, - 0xdd, 0x85, 0xf5, 0x8b, 0xfa, 0xde, 0xb0, 0x8f, 0x4d, 0xa3, 0x2f, 0x57, 0xd1, 0x3a, 0xac, 0x5c, - 0x54, 0x1a, 0xe6, 0x48, 0x5e, 0x3a, 0xba, 0x21, 0xfe, 0x65, 0xfb, 0xe8, 0x3f, 0x01, 0x00, 0x00, - 0xff, 0xff, 0xcc, 0x96, 0x13, 0xc4, 0xc1, 0x15, 0x00, 0x00, +var fileDescriptor_feeds_fc30b4ddff65807e = []byte{ + // 2281 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x58, 0xdf, 0x72, 0xdb, 0xc6, + 0xd5, 0x0f, 0x48, 0xd1, 0x24, 0x0f, 0x29, 0x09, 0x5c, 0x29, 0x12, 0x2c, 0xc7, 0xb1, 0x3e, 0xf8, + 0xcb, 0x54, 0x95, 0x53, 0xa6, 0x95, 0x93, 0x4c, 0x32, 0x71, 0x93, 0x50, 0x20, 0x64, 0x61, 0x4c, + 0x11, 0xf0, 0x12, 0xb2, 0xe3, 0xde, 0x6c, 0x20, 0x60, 0x45, 0x61, 0x4c, 0x02, 0xec, 0x02, 0x54, + 0xac, 0xcc, 0xe4, 0xa6, 0x57, 0xbd, 0xec, 0x4c, 0xef, 0xfa, 0x04, 0xed, 0xd4, 0x0f, 0xd0, 0xc9, + 0x5d, 0x9f, 0xa8, 0x0f, 0xd0, 0x9b, 0xce, 0x2e, 0x40, 0x10, 0x94, 0x20, 0xcb, 0x6d, 0x72, 0x23, + 0x61, 0xcf, 0x39, 0xbf, 0xfd, 0x73, 0xce, 0x9e, 0xdf, 0x39, 0x4b, 0x68, 0x9c, 0x52, 0xea, 0x45, + 0xed, 0x09, 0x0b, 0xe3, 0x10, 0xa1, 0xb1, 0x33, 0x89, 0xda, 0x27, 0x61, 0xf8, 0xd2, 0x0f, 0x86, + 0x6d, 0xa1, 0x51, 0xff, 0x55, 0x82, 0xe6, 0x01, 0xa5, 0xde, 0x11, 0x8d, 0x1d, 0xcf, 0x89, 0x1d, + 0x34, 0x86, 0x8d, 0x09, 0x0b, 0x5d, 0x1a, 0x45, 0x7e, 0x30, 0x24, 0x7e, 0x10, 0xc5, 0x6c, 0xea, + 0xc6, 0x7e, 0x18, 0x28, 0xd2, 0xb6, 0xb4, 0xb3, 0xb2, 0xf7, 0x69, 0xfb, 0xea, 0x2c, 0xed, 0xfc, + 0x0c, 0x6d, 0x2b, 0x83, 0x1b, 0x73, 0x34, 0x7e, 0x77, 0x52, 0x24, 0x46, 0xff, 0x07, 0xcd, 0xe8, + 0xcc, 0x61, 0x1e, 0x09, 0xa6, 0xe3, 0x13, 0xca, 0x94, 0xd2, 0xb6, 0xb4, 0x53, 0xc1, 0x0d, 0x21, + 0xeb, 0x0b, 0x11, 0x37, 0x89, 0xc3, 0xd8, 0x19, 0x11, 0x21, 0x8c, 0x94, 0x72, 0x62, 0x22, 0x64, + 0x03, 0x21, 0x42, 0xeb, 0x50, 0x09, 0xc2, 0xc0, 0xa5, 0x4a, 0x65, 0x5b, 0xda, 0x59, 0xc2, 0xc9, + 0x00, 0xfd, 0x06, 0xd6, 0x87, 0x34, 0xa0, 0xcc, 0xe1, 0x2b, 0x91, 0xd8, 0x1f, 0xd3, 0x28, 0x76, + 0xc6, 0x13, 0x65, 0x69, 0x5b, 0xda, 0x29, 0xe3, 0xb5, 0xb9, 0xce, 0x9e, 0xa9, 0x54, 0x07, 0xde, + 0x2d, 0xdc, 0x3e, 0x5a, 0x83, 0x55, 0x0b, 0x9b, 0x9a, 0x3e, 0x18, 0x90, 0xe3, 0xfe, 0x93, 0xbe, + 0xf9, 0xbc, 0x2f, 0xbf, 0x83, 0x36, 0x61, 0x6d, 0x26, 0xec, 0x0c, 0x88, 0x66, 0x1e, 0x59, 0x3d, + 0xdd, 0xd6, 0x65, 0x09, 0x6d, 0xc1, 0x46, 0x4e, 0x61, 0xf4, 0x35, 0xac, 0x1f, 0xe9, 0x7d, 0xbb, + 0xd3, 0x93, 0x4b, 0xea, 0x6b, 0x09, 0xe4, 0xce, 0xb9, 0xe3, 0x8f, 0x9c, 0x13, 0x7f, 0xe4, 0xc7, + 0x17, 0xdc, 0x77, 0xe8, 0x11, 0xd4, 0xc6, 0xa9, 0xff, 0x84, 0x9f, 0x1b, 0x7b, 0xdb, 0x37, 0xf9, + 0x19, 0x67, 0x08, 0xf4, 0x3b, 0x58, 0x8f, 0x28, 0x3b, 0xf7, 0x5d, 0x4a, 0x9c, 0xdc, 0xcc, 0x4a, + 0x69, 0xbb, 0xbc, 0xd3, 0xd8, 0xfb, 0x45, 0xd1, 0x4c, 0x83, 0xc4, 0x3e, 0xbf, 0x11, 0xbc, 0x16, + 0x5d, 0x15, 0xaa, 0xff, 0x2e, 0xc1, 0x5a, 0x81, 0x31, 0xfa, 0x0c, 0x94, 0x28, 0x76, 0x58, 0x3c, + 0xf7, 0x2b, 0x61, 0x34, 0x8a, 0x99, 0xef, 0xc6, 0xe2, 0x04, 0x65, 0xbc, 0x21, 0xf4, 0x99, 0x6f, + 0x71, 0xaa, 0x45, 0x1f, 0xc3, 0x06, 0x0d, 0xbc, 0x22, 0x5c, 0x49, 0xe0, 0xd6, 0x69, 0xe0, 0x5d, + 0x45, 0xfd, 0x1a, 0xd6, 0xc7, 0x94, 0xb9, 0x67, 0x4e, 0x10, 0x13, 0xdf, 0x9b, 0x63, 0xf8, 0x6d, + 0xa8, 0x63, 0x34, 0xd3, 0x19, 0x5e, 0x86, 0x68, 0xc3, 0xec, 0x40, 0x0b, 0x80, 0x25, 0x01, 0x68, + 0xa5, 0xaa, 0x9c, 0x7d, 0x0f, 0x10, 0xa3, 0x51, 0x38, 0x65, 0x2e, 0x8d, 0xe6, 0xe6, 0xb7, 0x44, + 0x34, 0xee, 0x16, 0xf9, 0x10, 0xcf, 0xac, 0x71, 0x2b, 0x03, 0x66, 0xb3, 0x75, 0xa1, 0xb9, 0x10, + 0x8b, 0x8a, 0x88, 0x45, 0x61, 0x54, 0x17, 0x82, 0xb0, 0x80, 0x52, 0x7f, 0xac, 0x42, 0x73, 0xc1, + 0xed, 0xf7, 0xa0, 0x91, 0x73, 0x83, 0xf0, 0x74, 0x1d, 0xc3, 0xfc, 0xf4, 0xe8, 0x2e, 0xc0, 0xfc, + 0xd4, 0xc2, 0xa3, 0x75, 0x5c, 0xcf, 0x0e, 0x8b, 0xee, 0x40, 0x3d, 0x09, 0x5b, 0x44, 0x5d, 0xe1, + 0xbb, 0x32, 0xae, 0x09, 0xc1, 0x80, 0xba, 0x3c, 0xd3, 0xbc, 0x69, 0x9a, 0x2e, 0x5c, 0x9f, 0x24, + 0x4a, 0x63, 0x26, 0xe3, 0x26, 0xf7, 0xa0, 0x11, 0x4d, 0xc2, 0x38, 0x22, 0x22, 0xfd, 0x44, 0xbe, + 0x95, 0x31, 0x08, 0x91, 0xcd, 0x25, 0x62, 0x7d, 0x61, 0x10, 0x4e, 0x68, 0x20, 0xbc, 0x57, 0xc6, + 0x75, 0x21, 0x31, 0x27, 0x34, 0x40, 0xbf, 0x04, 0x39, 0x7f, 0x40, 0x12, 0x3b, 0x43, 0xa5, 0x2a, + 0x36, 0xb9, 0x9a, 0x97, 0xdb, 0xce, 0x10, 0x7d, 0x01, 0xf5, 0xcc, 0xad, 0x4a, 0xed, 0x6d, 0xc2, + 0x30, 0xb7, 0x47, 0xbb, 0xd0, 0x9a, 0x38, 0x17, 0x63, 0x1a, 0xc4, 0x24, 0x9c, 0x88, 0x03, 0xf9, + 0x9e, 0x52, 0xdf, 0x2e, 0xf3, 0x85, 0x52, 0x85, 0x29, 0xe4, 0x86, 0x87, 0x9e, 0x00, 0x30, 0xea, + 0x4e, 0x19, 0xa3, 0x9c, 0x42, 0x40, 0xac, 0xf4, 0xe0, 0xa6, 0x40, 0xb5, 0x71, 0x06, 0xc1, 0x39, + 0x38, 0x72, 0x00, 0x45, 0xee, 0x19, 0xf5, 0xa6, 0x23, 0x4a, 0xe8, 0x2b, 0x97, 0x8a, 0x45, 0x94, + 0x86, 0x88, 0xfe, 0xde, 0x8d, 0x93, 0x0e, 0x52, 0xa8, 0x3e, 0x43, 0xe2, 0x56, 0x74, 0x59, 0x84, + 0x3e, 0x81, 0xaa, 0x47, 0x27, 0x61, 0xe4, 0xc7, 0x4a, 0x53, 0x6c, 0xf6, 0x4e, 0xd1, 0xbc, 0xdd, + 0xc4, 0x04, 0xcf, 0x6c, 0xd1, 0x6f, 0xa1, 0x11, 0x84, 0x24, 0x3a, 0x0b, 0xbf, 0x23, 0xa7, 0x94, + 0x2a, 0xcb, 0xd7, 0x7b, 0xb4, 0x1f, 0x0e, 0xce, 0xc2, 0xef, 0x0e, 0x28, 0xc5, 0xf5, 0x60, 0xf6, + 0x89, 0x8e, 0x61, 0x8d, 0xd1, 0xdf, 0x4f, 0x7d, 0x46, 0x89, 0xcb, 0xa8, 0xe7, 0xc7, 0xc4, 0x75, + 0x98, 0xa7, 0xac, 0x88, 0xaa, 0xf0, 0x41, 0x71, 0x60, 0x84, 0xb9, 0x26, 0xac, 0x35, 0x87, 0x79, + 0x3c, 0x4f, 0x2e, 0x89, 0xd0, 0xff, 0xc3, 0x4a, 0xec, 0xbb, 0x2f, 0x69, 0x4c, 0xe2, 0x8b, 0x89, + 0xb8, 0xb3, 0xab, 0x22, 0x4a, 0xcd, 0x44, 0x6a, 0x5f, 0x4c, 0xa8, 0xe1, 0x6d, 0x7d, 0x0b, 0x30, + 0xf7, 0x37, 0xda, 0x01, 0x99, 0xd1, 0x09, 0x75, 0x62, 0x32, 0x0d, 0x62, 0x7f, 0x24, 0xee, 0x6a, + 0xc2, 0x39, 0x2b, 0x89, 0xfc, 0x98, 0x8b, 0xf9, 0x75, 0x9d, 0x5b, 0xd2, 0x73, 0xca, 0x2e, 0x84, + 0x65, 0x52, 0x62, 0x52, 0x4b, 0x9d, 0x8b, 0x07, 0xd4, 0xdd, 0x7a, 0x0a, 0xad, 0x2b, 0xce, 0x47, + 0x8f, 0x00, 0x38, 0x4d, 0x11, 0xe6, 0x04, 0x43, 0x9a, 0x12, 0x73, 0xa1, 0xc7, 0x38, 0x5f, 0x61, + 0x6e, 0x84, 0xeb, 0xf1, 0xec, 0x53, 0xfd, 0x8b, 0x04, 0xf5, 0xec, 0x72, 0xa2, 0xdb, 0xc0, 0x13, + 0xed, 0xf4, 0x74, 0x9e, 0xb6, 0x55, 0x31, 0x4e, 0x73, 0x56, 0xa8, 0x02, 0x67, 0x4c, 0xb3, 0x9c, + 0xe5, 0x92, 0xbe, 0x33, 0xa6, 0x68, 0x13, 0xaa, 0x2c, 0x0c, 0xc7, 0x1c, 0x98, 0xb0, 0xdd, 0x2d, + 0x3e, 0x4c, 0x92, 0x59, 0x28, 0x04, 0x2c, 0xe1, 0xb5, 0x1a, 0x17, 0x08, 0xd4, 0x5d, 0x80, 0x89, + 0xc3, 0xe2, 0x0b, 0x12, 0xf9, 0xdf, 0x27, 0x85, 0xb1, 0x82, 0xeb, 0x42, 0x32, 0xf0, 0xbf, 0xa7, + 0x6a, 0x07, 0xea, 0xd9, 0xa6, 0xf9, 0x44, 0x27, 0x74, 0xe8, 0x07, 0x39, 0x4f, 0xd6, 0x84, 0x80, + 0xfb, 0x70, 0x13, 0xaa, 0x9c, 0xaf, 0x67, 0xae, 0x2b, 0xe3, 0x5b, 0x34, 0xf0, 0x06, 0xd4, 0x55, + 0xff, 0x20, 0x41, 0x23, 0x2d, 0x0d, 0x3f, 0x43, 0x11, 0xfb, 0x04, 0xaa, 0x29, 0x4d, 0xa5, 0x75, + 0xeb, 0xce, 0x1b, 0xea, 0x16, 0x9e, 0xd9, 0xaa, 0xaf, 0x01, 0xaa, 0xa9, 0xf0, 0x27, 0x93, 0x23, + 0x82, 0x25, 0xe1, 0xca, 0xc4, 0xcb, 0xe2, 0x1b, 0x6d, 0x43, 0xc3, 0xa3, 0x91, 0xcb, 0xfc, 0x24, + 0x91, 0x13, 0x2f, 0xe7, 0x45, 0xe8, 0x23, 0xa8, 0x4c, 0x98, 0x9f, 0x36, 0x1f, 0x8d, 0xbd, 0xdb, + 0x45, 0xdb, 0xb6, 0xb8, 0x01, 0x4e, 0xec, 0xd0, 0xe7, 0x50, 0x61, 0xd3, 0x11, 0x8d, 0xd2, 0xda, + 0x72, 0xbf, 0xf0, 0x9c, 0xc9, 0x5d, 0xf4, 0x83, 0x21, 0xe6, 0xa6, 0x38, 0x41, 0xa0, 0xcf, 0x61, + 0xe9, 0x34, 0x64, 0x63, 0xa5, 0x2a, 0x3c, 0xf4, 0xc1, 0x1b, 0x3c, 0x64, 0x04, 0xb1, 0xf3, 0x92, + 0x1e, 0x84, 0x6c, 0x8c, 0x05, 0x04, 0x0d, 0x60, 0x75, 0xc2, 0xe8, 0x8c, 0x14, 0x79, 0xb2, 0x09, + 0x52, 0x5d, 0xd9, 0xdb, 0x7d, 0xc3, 0x2c, 0x6d, 0x2b, 0x83, 0xf0, 0x4c, 0xc4, 0x2b, 0x93, 0x85, + 0x31, 0xfa, 0x14, 0x6a, 0xb1, 0xf3, 0x8a, 0x30, 0x27, 0xa6, 0x4a, 0xfd, 0x7a, 0x2e, 0xb2, 0x9d, + 0x57, 0xd8, 0x89, 0x29, 0xae, 0xc6, 0xc9, 0x47, 0x31, 0x3d, 0x43, 0x31, 0x3d, 0xe7, 0xe8, 0xae, + 0xf1, 0xbf, 0xd3, 0x5d, 0xf3, 0xe7, 0xa1, 0xbb, 0xe5, 0x9f, 0x48, 0x77, 0x5f, 0x41, 0xc3, 0x11, + 0x1d, 0x25, 0x19, 0xf9, 0xc1, 0x4b, 0x65, 0x45, 0xc4, 0xf1, 0xfd, 0xc2, 0xba, 0x20, 0xcc, 0x7a, + 0x7e, 0xf0, 0x12, 0x83, 0x93, 0x7d, 0xa3, 0x2f, 0x60, 0x49, 0xc4, 0x6e, 0x55, 0x6c, 0xe4, 0x4d, + 0xbd, 0xdd, 0xec, 0xbf, 0x08, 0x9c, 0x00, 0xf1, 0xd5, 0x73, 0x64, 0xab, 0xc8, 0xd7, 0xaf, 0x6e, + 0x67, 0xec, 0x8b, 0x61, 0xce, 0xc4, 0x48, 0x87, 0x65, 0x46, 0x47, 0x4e, 0x4c, 0x3d, 0x32, 0xa6, + 0x9e, 0xef, 0x28, 0xad, 0xeb, 0xdb, 0x1a, 0x9c, 0x18, 0x1e, 0x71, 0x3b, 0xdc, 0x64, 0xb9, 0x11, + 0x3a, 0x83, 0xad, 0xac, 0x61, 0x8d, 0x63, 0xe6, 0x9f, 0x4c, 0x63, 0x4a, 0xce, 0x9d, 0xd1, 0x54, + 0xe4, 0x25, 0x12, 0x73, 0x3e, 0x78, 0x53, 0xdb, 0x3a, 0x03, 0x3d, 0xe3, 0x18, 0xc3, 0xc3, 0x9b, + 0x51, 0xb1, 0x42, 0xfd, 0x16, 0x56, 0x16, 0xaf, 0x30, 0xba, 0x07, 0x77, 0x2c, 0xac, 0x5b, 0x9d, + 0x17, 0xbc, 0x23, 0x27, 0xf6, 0x0b, 0x4b, 0x27, 0xc7, 0xfd, 0x81, 0xa5, 0x6b, 0xc6, 0x81, 0xa1, + 0x77, 0xe5, 0x77, 0x50, 0x13, 0x6a, 0x58, 0x7f, 0x7a, 0x6c, 0x60, 0xbd, 0x2b, 0x4b, 0x7c, 0x64, + 0x5a, 0xb6, 0x61, 0xf6, 0x79, 0xf3, 0x8e, 0x5a, 0xb0, 0xdc, 0x37, 0x6d, 0x32, 0x38, 0xb6, 0x2c, + 0x13, 0xdb, 0x7a, 0x57, 0x2e, 0xab, 0x7f, 0x9f, 0xb3, 0xa0, 0x98, 0xff, 0x3d, 0x50, 0x06, 0x3a, + 0x7e, 0x66, 0x68, 0x7a, 0xd1, 0xe4, 0xf7, 0xe1, 0xde, 0x82, 0xb6, 0x6b, 0xf4, 0x8d, 0xfe, 0x63, + 0x82, 0x75, 0x2e, 0xed, 0xf0, 0x75, 0x64, 0x09, 0xbd, 0x0f, 0x5b, 0x0b, 0x46, 0x07, 0xa6, 0xd9, + 0x25, 0x26, 0xee, 0xea, 0xd8, 0xe8, 0x3f, 0x96, 0x4b, 0xe8, 0x2e, 0xdc, 0x5e, 0xd0, 0xeb, 0xcf, + 0xc4, 0x51, 0x0c, 0xed, 0x89, 0x6e, 0xcb, 0x65, 0xfe, 0xfa, 0x58, 0x50, 0xdb, 0xd8, 0xb0, 0x88, + 0x6d, 0x1e, 0x63, 0x79, 0x49, 0xfd, 0x01, 0x2a, 0x82, 0x8b, 0x78, 0xaf, 0x27, 0xd8, 0x88, 0x8c, + 0x7d, 0x97, 0x85, 0x51, 0xca, 0xfa, 0x0d, 0x21, 0x3b, 0x12, 0x22, 0x74, 0x1f, 0x96, 0xd3, 0x92, + 0x7b, 0x41, 0xdc, 0xd0, 0x9b, 0x55, 0xa6, 0xe6, 0x4c, 0xa8, 0x85, 0x1e, 0x45, 0x1f, 0x02, 0xe2, + 0x18, 0xfe, 0x58, 0x4c, 0x33, 0x99, 0xb7, 0x74, 0x09, 0x83, 0xca, 0xa9, 0x26, 0x49, 0x65, 0xdb, + 0x19, 0xaa, 0x7f, 0x2e, 0xc1, 0xea, 0x25, 0x6a, 0xe3, 0x7d, 0xfa, 0xd8, 0x0f, 0x88, 0xe3, 0x9d, + 0x3b, 0x81, 0x4b, 0x49, 0x1a, 0xf0, 0x74, 0x43, 0xad, 0xb1, 0x1f, 0x74, 0x12, 0xcd, 0x7e, 0xa2, + 0x40, 0x5f, 0xc1, 0x7b, 0x79, 0xfb, 0x30, 0x18, 0xf9, 0x01, 0x25, 0x2e, 0x1f, 0xf0, 0x49, 0xd3, + 0x22, 0x75, 0x7b, 0x0e, 0x34, 0x85, 0x85, 0x36, 0x33, 0x40, 0x4f, 0xe1, 0x5d, 0x7e, 0x17, 0x53, + 0xc8, 0x28, 0xe9, 0x77, 0x39, 0x47, 0x94, 0x6f, 0x20, 0xf0, 0xfd, 0x92, 0x22, 0xe1, 0x35, 0x8e, + 0xd5, 0x72, 0x50, 0xce, 0x16, 0x8f, 0x00, 0x82, 0x30, 0xe3, 0x9a, 0xa5, 0xb7, 0x99, 0xa7, 0x9e, + 0x00, 0x0e, 0x28, 0x55, 0xdb, 0x50, 0x4d, 0x19, 0x92, 0xfb, 0x5c, 0x04, 0x84, 0x4c, 0x28, 0x73, + 0x69, 0x90, 0xbc, 0xa5, 0x2a, 0xb8, 0x29, 0x84, 0x56, 0x22, 0x53, 0x7f, 0x2c, 0xc1, 0xc6, 0x15, + 0x9a, 0x3f, 0xf0, 0xe9, 0xc8, 0x43, 0x87, 0x29, 0x3d, 0x24, 0x8f, 0xf5, 0x8f, 0xdf, 0xaa, 0x40, + 0x08, 0x64, 0x5b, 0xfc, 0xcd, 0x71, 0xc5, 0x3a, 0x54, 0x46, 0xce, 0x09, 0x1d, 0xa5, 0x51, 0x4f, + 0x06, 0x5c, 0x2a, 0xf2, 0x54, 0x29, 0x0b, 0xb2, 0x4e, 0x06, 0xbc, 0xf0, 0xfa, 0xfc, 0xcd, 0x24, + 0xd8, 0xce, 0x13, 0xe7, 0xaf, 0x61, 0xf0, 0xa3, 0x94, 0x12, 0x3d, 0xf5, 0x8f, 0x12, 0xd4, 0xb3, + 0x05, 0xf8, 0x05, 0x3d, 0x30, 0xf4, 0x5e, 0xb7, 0x28, 0x41, 0x64, 0x68, 0x0e, 0x0e, 0x4d, 0x6c, + 0x93, 0x4e, 0x7f, 0xf0, 0x5c, 0xc7, 0xb2, 0x84, 0x96, 0xa1, 0x6e, 0x75, 0x70, 0xe7, 0x31, 0xee, + 0x58, 0x87, 0x72, 0x89, 0xbf, 0xc4, 0x8f, 0x8e, 0x7b, 0xb6, 0x61, 0xf5, 0x74, 0xa2, 0x1d, 0x9a, + 0x86, 0xa6, 0xcb, 0x65, 0xb4, 0x02, 0xa0, 0x1d, 0xea, 0xda, 0x93, 0x7d, 0xf3, 0x1b, 0x7d, 0x20, + 0x2f, 0xf1, 0xac, 0xed, 0x62, 0xd3, 0xea, 0xf2, 0x77, 0x7a, 0x05, 0x35, 0xa0, 0xba, 0x6f, 0x9a, + 0x3d, 0xbd, 0xd3, 0x97, 0x6f, 0xa9, 0xff, 0x90, 0xa0, 0x75, 0xc5, 0x05, 0xe8, 0x6b, 0xa8, 0x9c, + 0xf2, 0xfd, 0x29, 0x92, 0x20, 0x9f, 0xdd, 0xb7, 0x77, 0x1c, 0x4e, 0x80, 0xfc, 0x81, 0x7a, 0xea, + 0xb3, 0x28, 0x79, 0x10, 0x13, 0x77, 0x1a, 0xc5, 0xe1, 0x98, 0xb2, 0x48, 0xb8, 0xaf, 0x86, 0x91, + 0xd0, 0xf1, 0x8e, 0x4b, 0x9b, 0x69, 0xd0, 0x47, 0xbc, 0xc4, 0xc4, 0x53, 0x16, 0xf0, 0xe4, 0x99, + 0x03, 0xca, 0x09, 0x20, 0x53, 0x65, 0x00, 0xf5, 0x9f, 0x12, 0x54, 0xd3, 0x3a, 0x87, 0x1e, 0xce, + 0xab, 0xa2, 0x74, 0x53, 0xdf, 0x91, 0xd5, 0xc4, 0x4b, 0xa9, 0xb3, 0x90, 0x00, 0xf3, 0xfe, 0x2e, + 0x97, 0x3a, 0xf9, 0x7b, 0xce, 0x7b, 0xc1, 0xaf, 0xa1, 0x99, 0xce, 0x95, 0x54, 0x90, 0xb2, 0xb8, + 0x66, 0x77, 0xaf, 0x5d, 0x5a, 0xdc, 0xa7, 0x46, 0x0a, 0xe1, 0x03, 0x95, 0x41, 0x3d, 0xab, 0xb7, + 0xe8, 0x01, 0x94, 0x79, 0xbe, 0xdc, 0x78, 0x00, 0x6e, 0x85, 0x3e, 0x83, 0xda, 0x29, 0xa5, 0xff, + 0xc5, 0xba, 0xd5, 0x53, 0x2a, 0x3e, 0xd4, 0xbf, 0x49, 0x00, 0xf3, 0x72, 0x8a, 0x64, 0x28, 0x4f, + 0xd9, 0x28, 0x6d, 0x0f, 0xf9, 0x27, 0xda, 0x82, 0xda, 0xc8, 0x09, 0x86, 0x53, 0x67, 0x38, 0x23, + 0xb9, 0x6c, 0x8c, 0x7e, 0x25, 0x7e, 0x16, 0x10, 0x8f, 0x7a, 0xea, 0x11, 0x37, 0x9c, 0x06, 0x31, + 0xbb, 0x48, 0xaf, 0x7f, 0x6b, 0xae, 0xd1, 0x12, 0x05, 0xfa, 0x12, 0x6a, 0x93, 0x91, 0x13, 0x8b, + 0x2e, 0x6d, 0x49, 0xec, 0x52, 0xbd, 0xbe, 0xba, 0x5b, 0xa9, 0x25, 0xce, 0x30, 0xea, 0x9f, 0x24, + 0x80, 0x79, 0xf1, 0x2d, 0x78, 0x1e, 0x25, 0xdb, 0x5e, 0x78, 0x1e, 0xa1, 0x07, 0xd0, 0x8a, 0xce, + 0x42, 0x16, 0x93, 0x7c, 0xab, 0x9a, 0x1c, 0x44, 0x16, 0x8a, 0x6e, 0x51, 0xbf, 0x5a, 0x7e, 0xbb, + 0x7e, 0x55, 0xfd, 0xab, 0x04, 0xcd, 0x7c, 0x31, 0x2f, 0x70, 0xe0, 0x97, 0x29, 0xed, 0x94, 0xae, + 0xef, 0x28, 0xf3, 0x33, 0xb4, 0xc5, 0xdf, 0x1c, 0xd9, 0x28, 0x50, 0x75, 0x9d, 0x64, 0xdb, 0x49, + 0xe9, 0x98, 0x0d, 0xd5, 0x0f, 0xa1, 0x9e, 0x19, 0xa3, 0x75, 0x90, 0x0b, 0x28, 0xa3, 0x0e, 0x15, + 0xeb, 0xd0, 0xb4, 0x4d, 0x59, 0x52, 0x9f, 0xc3, 0xe6, 0x35, 0x2d, 0x02, 0x2f, 0x78, 0xf3, 0x5e, + 0x23, 0xf3, 0x63, 0x23, 0x93, 0x19, 0x1e, 0x7f, 0xa2, 0x65, 0x4d, 0x48, 0xe2, 0xbd, 0xea, 0x79, + 0x82, 0xde, 0x7d, 0x08, 0xf5, 0xec, 0x62, 0xa1, 0x0d, 0x40, 0x07, 0xc6, 0x37, 0x7a, 0x97, 0xe0, + 0x8e, 0xad, 0x93, 0xae, 0x7e, 0xd0, 0x39, 0xee, 0xd9, 0xf2, 0x3b, 0x9c, 0x85, 0x2c, 0x1d, 0x13, + 0x4b, 0xc7, 0x03, 0x5e, 0xc7, 0x77, 0x7f, 0x80, 0xd6, 0x95, 0xa6, 0x90, 0x77, 0x00, 0x69, 0x7b, + 0x41, 0x34, 0xac, 0x77, 0x0d, 0x9b, 0x68, 0x1d, 0xdc, 0xbd, 0xda, 0x26, 0x14, 0x19, 0x69, 0x66, + 0xbf, 0x6b, 0xa4, 0xcd, 0x88, 0x68, 0x13, 0x8a, 0x8c, 0x3a, 0xbd, 0xe7, 0x9d, 0x17, 0x03, 0xb9, + 0xb4, 0xfb, 0x5a, 0x82, 0x95, 0xc5, 0x7b, 0xc6, 0x9b, 0x9f, 0x8e, 0xc6, 0x27, 0x20, 0x56, 0xaf, + 0x63, 0x1f, 0x98, 0xf8, 0xe8, 0xea, 0xc2, 0x97, 0x0d, 0x9e, 0xeb, 0xfb, 0xa4, 0x63, 0x59, 0x3d, + 0x43, 0xcb, 0xf5, 0x27, 0x97, 0x8d, 0x8e, 0xcc, 0x7d, 0xa3, 0xa7, 0x73, 0x5b, 0xb9, 0x84, 0xee, + 0xc0, 0xe6, 0x65, 0x7d, 0xa7, 0xdf, 0xc5, 0xa6, 0xd1, 0x95, 0xcb, 0x68, 0x13, 0xd6, 0x2e, 0x2b, + 0x0d, 0x73, 0x20, 0x2f, 0x9d, 0xdc, 0x12, 0xbf, 0x52, 0x3f, 0xfc, 0x4f, 0x00, 0x00, 0x00, 0xff, + 0xff, 0x1b, 0x9f, 0x88, 0x50, 0xb4, 0x16, 0x00, 0x00, }
diff --git a/feeds/feeds.proto b/feeds/feeds.proto index 55e946e..d714f46 100644 --- a/feeds/feeds.proto +++ b/feeds/feeds.proto
@@ -117,14 +117,16 @@ // availability {start_sec: 9am, duration: 180 minutes, ...} // message Availability { - // An opaque string from an aggregator to identify a merchant. + // An opaque string from an aggregator to identify a merchant. (required) string merchant_id = 1; // An opaque string from aggregator to identify a service of the - // merchant. + // merchant. (required) string service_id = 2; - // Start time of this availability, using epoch time in seconds. + // Start time of this availability, using epoch time in seconds in UTC. + //(required) int64 start_sec = 3; // Duration of the service in seconds, e.g. 30 minutes for a chair massage. + // (required) int64 duration_sec = 4; // Number of total spots and open spots of this availability. // E.g. a Yoga class of 10 spots with 3 booked. @@ -136,10 +138,12 @@ // below, these two fields will be inferred. A Recurrence // implies spots_total=1 and spots_open=1. A ScheduleException implies // spots_total=1 and spots_open=0. + // (both required if recurrence not set) int64 spots_total = 5; int64 spots_open = 6; // An optional opaque string to identify this availability slot. If set, it // will be included in the requests that book/update/cancel appointments. + // (optional) string availability_tag = 7; // Optional resources used to disambiguate this availability slot from @@ -151,9 +155,10 @@ // spots_total: 10 spots_open: 7 } // availability { resources { staff_id: "2" staff_name: "John" } // spots_total: 5 spots_open: 2 } + // (optional) Resources resources = 8; - // A list of ids referencing the payment options which can be used to pay + // A list of IDs referencing the payment options which can be used to pay // for this slot. The actual payment options are defined at the Merchant // level, and can also be shared among multiple Merchants. // @@ -161,6 +166,10 @@ // message. Similarly payment_option_ids specified here do NOT have to be // present in the service message, though must be defined at the // Merchant level. + // Our current implementation limits the number of entries in this array to + // one element. Multiple payment_option_id are still allowed at the Service + // level, but an override at the availability slot level, is limited to a + // single payment_option_id. (optional) repeated string payment_option_id = 9; // Recurrence messages are optional, but allow for a more compact @@ -179,30 +188,91 @@ // merchants/services with regularly scheduled classes. message Recurrence { // The inclusive maximum UTC timestamp the availability repeats until. + // (required) int64 repeat_until_sec = 1; // Defines the time between successive availability slots. // - // E.g. An availability with a duration of 20 min, a repeat_every_sec of + // Example: An availability with a duration of 20 min, a repeat_every_sec of // 30 min, a start_sec of 9:00am, and a repeat_until_sec of 11:00am will // yield slots at 9-9:20am, 9:30-9:50am, 10-10:20am, 10:30-10:50am, - // 11-11:20am. + // 11-11:20am. (required) int32 repeat_every_sec = 2; } // The recurrence information for the availability, representing more than one // start time. A recurrence should contain appointments for one working day. + // (optional) Recurrence recurrence = 10; - // ScheduleException messages are used to represent booked/unavailable time - // ranges within the work day. As time slots are booked, the list of - // exceptions should grow to reflect the newly unavailable time ranges. - // The recurrence itself shouldn't be modified. + // ScheduleException messages represent booked/unavailable time ranges within + // the workday, which are exceptions to the recurrence described above. As + // time slots are booked, the list of exceptions should be updated to reflect + // the newly unavailable time ranges. The recurrence itself shouldn't be + // modified. message ScheduleException { - // The time range of the exception. + // The time range of the exception. Any slots described by the recurrence + // which overlap this closed-open time range will be considered unavailable. + // + // Example: If the recurrence specifies a duration of 20 min, a + // repeat_every_sec of 30 min, a start_time of 9:00am, and a + // repeat_until_sec of 11:00am, then a ScheduleException with a time_range + // of 9:45am-11:00am would make unavailable the slots at 9:30-9:50am, + // 10-10:20am, and 10:30-10:50am. + // + // Note that because the time range is closed-open, the slot beginning at + // 11am slot would not be impacted. TimeRange time_range = 1; } - // When this service cannot be scheduled. To limit the number of - // schedule_exception messages consider joining adjacent exceptions. + // Times when this service cannot be scheduled. To limit the number of + // schedule_exception messages, consider joining adjacent exceptions. + // (optional) repeated ScheduleException schedule_exception = 11; + + // Defines how a deposit may be charged to the user. Overrides the service + // deposit if one was specified. Setting this to an empty Deposit message + // removes any service-level deposit. (optional) + Deposit deposit = 12; + + // Defines a no show fee that may be charged to the user. Overrides the + // service no show fee if one was specified. Setting this to an empty + // NoShowFee message removes any service-level no show fee. (optional) + NoShowFee no_show_fee = 13; + + // Indicates whether the user must provide a credit card in order to book this + // availability slot. + // If the value is not set, it is inherited from the service level if it's set + // there. (optional) + RequireCreditCard require_credit_card = 14; + + // Indicates a list of supported ticket types for this availability slot. If + // unset, all ticket types in the parent service are available for this slot. + // Note that the values of this field must be defined in the parent service. + // Examples: + // + // * Service with four ticket types: + // TicketType {ticket_type_id: "adult_1" short_description: "Adult weekdays"} + // TicketType {ticket_type_id: "adult_2" short_description: "Adult weekends"} + // TicketType {ticket_type_id: "youth_1" short_description: "Youth weekdays"} + // TicketType {ticket_type_id: "youth_2" short_description: "Youth weekends"} + // + // To represent the inventory during the weekdays: + // `availability {ticket_type_id: "adult_1" ticket_type_id: "youth_1"...}`. + // To represent the inventory during the holidays: + // `availability {ticket_type_id: "adult_2" ticket_type_id: "youth_2"...}`. + // + // * Service with three ticket types: + // TicketType {ticket_type_id: "adult" short_description: "Adult"} + // TicketType {ticket_type_id: "youth" short_description: "Youth"} + // TicketType {ticket_type_id: "senior" short_description: "Senior"} + // + // To indicate that all three ticket types are available for this time + // slot, use either + // `availability {ticket_type_id: "adult" ticket_type_id: "youth" + // ticket_type_id: "senior" ...}` + // or + // `availability {...}' (do not set ticket_type_id in this slot). + // + // (optional) + repeated string ticket_type_id = 15; } // A resource is used to disambiguate availability slots from one another when
diff --git a/utils/utils.go b/utils/utils.go index 6e4d65d..c95e198 100644 --- a/utils/utils.go +++ b/utils/utils.go
@@ -77,30 +77,57 @@ } func buildLineItem(availability *fpb.Availability, tickets []*fpb.TicketType) *mpb.LineItem { + // If no ticket types return nil as there is nothing to build. + if len(tickets) == 0 { + return nil + } + + // Treated as a set. + ticketMap := make(map[string]*fpb.TicketType) + for _, ticketType := range tickets { + if _, ok := ticketMap[ticketType.GetTicketTypeId()]; !ok { + // Ticket type ids should be unique to a merchant service pair. + // If they're not unique they will get dropped silently here. + // We enforce minimal feed validation in the test client so it's + // up to you to ensure UIDs. + ticketMap[ticketType.GetTicketTypeId()] = ticketType + } + } + + filteredTickets := tickets + if len(availability.GetTicketTypeId()) != 0 { + // Clear slice but preserve allocated memory. + filteredTickets = filteredTickets[:0] + for _, ticketTypeID := range availability.GetTicketTypeId() { + if ticketType, ok := ticketMap[ticketTypeID]; ok { + filteredTickets = append(filteredTickets, ticketType) + } + } + } + + // If no ticket types return nil as there is nothing to build. + if len(filteredTickets) == 0 { + return nil + } + lineItem := &mpb.LineItem{ ServiceId: availability.GetServiceId(), StartSec: availability.GetStartSec(), DurationSec: availability.GetDurationSec(), Price: &mpb.Price{}, } - - // If not ticket types return nil as there is nothing to build. - if len(tickets) == 0 { - return nil - } - for i := 0; i < int(availability.GetSpotsOpen()); i++ { // This is deterministic which is fine given that we just want to get a mix of ticket types. - ticketTypeIndex := rand.Intn(len(tickets)) + ticketTypeIndex := rand.Intn(len(filteredTickets)) // Calculate price of line item. - if lineItem.GetPrice().GetCurrencyCode() == "" && tickets[ticketTypeIndex].GetPrice().GetCurrencyCode() != "" { - lineItem.Price.CurrencyCode = tickets[ticketTypeIndex].GetPrice().GetCurrencyCode() + if lineItem.GetPrice().GetCurrencyCode() == "" && filteredTickets[ticketTypeIndex].GetPrice().GetCurrencyCode() != "" { + lineItem.Price.CurrencyCode = filteredTickets[ticketTypeIndex].GetPrice().GetCurrencyCode() } - lineItem.Price.PriceMicros += tickets[ticketTypeIndex].GetPrice().GetPriceMicros() + lineItem.Price.PriceMicros += filteredTickets[ticketTypeIndex].GetPrice().GetPriceMicros() // Add ticket to line item. lineItem.Tickets = append(lineItem.Tickets, &mpb.LineItem_OrderedTickets{ - TicketId: tickets[ticketTypeIndex].GetTicketTypeId(), + TicketId: filteredTickets[ticketTypeIndex].GetTicketTypeId(), Count: 1, }) }