Merge remote-tracking branch 'origin' into createCartService

This commit is contained in:
Simon Zeltser 2018-06-27 22:30:06 -07:00
commit 4373f02025
44 changed files with 2136 additions and 4084 deletions

View file

@ -63,7 +63,7 @@ message Product {
string name = 2; string name = 2;
string description = 3; string description = 3;
string picture = 4; string picture = 4;
MoneyAmount price_usd = 5; Money price_usd = 5;
} }
message ListProductsResponse { message ListProductsResponse {
@ -95,7 +95,7 @@ message GetQuoteRequest {
} }
message GetQuoteResponse { message GetQuoteResponse {
MoneyAmount cost_usd = 1; Money cost_usd = 1;
} }
message ShipOrderRequest { message ShipOrderRequest {
@ -108,9 +108,9 @@ message ShipOrderResponse {
} }
message Address { message Address {
string street_address_1 = 1; string street_address = 1;
string street_address_2 = 2; string city = 2;
string city= 3; string state = 3;
string country = 4; string country = 4;
int32 zip_code = 5; int32 zip_code = 5;
} }
@ -122,18 +122,22 @@ service CurrencyService {
rpc Convert(CurrencyConversionRequest) returns (Money) {} rpc Convert(CurrencyConversionRequest) returns (Money) {}
} }
// Represents an amount of money with its currency type.
// Describes a money amount without currency. For example, decimal=2 and
// fractional=500 (or fractional=5) makes up 2.5 units.
message MoneyAmount {
uint32 decimal = 1;
uint32 fractional = 2;
}
message Money { message Money {
// The 3-letter currency code defined in ISO 4217. // The 3-letter currency code defined in ISO 4217.
string currency_code = 1; string currency_code = 1;
MoneyAmount amount = 2;
// The whole units of the amount.
// For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar.
int64 units = 2;
// Number of nano (10^-9) units of the amount.
// The value must be between -999,999,999 and +999,999,999 inclusive.
// If `units` is positive, `nanos` must be positive or zero.
// If `units` is zero, `nanos` can be positive, zero, or negative.
// If `units` is negative, `nanos` must be negative or zero.
// For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
int32 nanos = 3;
} }
message GetSupportedCurrenciesResponse { message GetSupportedCurrenciesResponse {

View file

@ -1,13 +1,12 @@
FROM golang:1.10-alpine as builder FROM golang:1.10-alpine as builder
RUN apk add --no-cache ca-certificates git RUN apk add --no-cache ca-certificates git
WORKDIR /src/microservices-demo/catalogservice WORKDIR /go/src/checkoutservice
COPY . . COPY . .
RUN go get -d ./... RUN go get -d ./...
RUN go build -o /catalogservice . RUN go build -o /checkoutservice .
FROM alpine as release FROM alpine as release
RUN apk add --no-cache \ RUN apk add --no-cache ca-certificates
ca-certificates COPY --from=builder /checkoutservice /checkoutservice
COPY --from=builder /catalogservice /catalogservice
EXPOSE 5050 EXPOSE 5050
ENTRYPOINT ["/catalogservice"] ENTRYPOINT ["/checkoutservice"]

View file

@ -35,7 +35,7 @@ func (m *CartItem) Reset() { *m = CartItem{} }
func (m *CartItem) String() string { return proto.CompactTextString(m) } func (m *CartItem) String() string { return proto.CompactTextString(m) }
func (*CartItem) ProtoMessage() {} func (*CartItem) ProtoMessage() {}
func (*CartItem) Descriptor() ([]byte, []int) { func (*CartItem) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{0} return fileDescriptor_demo_bbfc9458084e7e4b, []int{0}
} }
func (m *CartItem) XXX_Unmarshal(b []byte) error { func (m *CartItem) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CartItem.Unmarshal(m, b) return xxx_messageInfo_CartItem.Unmarshal(m, b)
@ -81,7 +81,7 @@ func (m *AddItemRequest) Reset() { *m = AddItemRequest{} }
func (m *AddItemRequest) String() string { return proto.CompactTextString(m) } func (m *AddItemRequest) String() string { return proto.CompactTextString(m) }
func (*AddItemRequest) ProtoMessage() {} func (*AddItemRequest) ProtoMessage() {}
func (*AddItemRequest) Descriptor() ([]byte, []int) { func (*AddItemRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{1} return fileDescriptor_demo_bbfc9458084e7e4b, []int{1}
} }
func (m *AddItemRequest) XXX_Unmarshal(b []byte) error { func (m *AddItemRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_AddItemRequest.Unmarshal(m, b) return xxx_messageInfo_AddItemRequest.Unmarshal(m, b)
@ -126,7 +126,7 @@ func (m *EmptyCartRequest) Reset() { *m = EmptyCartRequest{} }
func (m *EmptyCartRequest) String() string { return proto.CompactTextString(m) } func (m *EmptyCartRequest) String() string { return proto.CompactTextString(m) }
func (*EmptyCartRequest) ProtoMessage() {} func (*EmptyCartRequest) ProtoMessage() {}
func (*EmptyCartRequest) Descriptor() ([]byte, []int) { func (*EmptyCartRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{2} return fileDescriptor_demo_bbfc9458084e7e4b, []int{2}
} }
func (m *EmptyCartRequest) XXX_Unmarshal(b []byte) error { func (m *EmptyCartRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_EmptyCartRequest.Unmarshal(m, b) return xxx_messageInfo_EmptyCartRequest.Unmarshal(m, b)
@ -164,7 +164,7 @@ func (m *GetCartRequest) Reset() { *m = GetCartRequest{} }
func (m *GetCartRequest) String() string { return proto.CompactTextString(m) } func (m *GetCartRequest) String() string { return proto.CompactTextString(m) }
func (*GetCartRequest) ProtoMessage() {} func (*GetCartRequest) ProtoMessage() {}
func (*GetCartRequest) Descriptor() ([]byte, []int) { func (*GetCartRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{3} return fileDescriptor_demo_bbfc9458084e7e4b, []int{3}
} }
func (m *GetCartRequest) XXX_Unmarshal(b []byte) error { func (m *GetCartRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetCartRequest.Unmarshal(m, b) return xxx_messageInfo_GetCartRequest.Unmarshal(m, b)
@ -203,7 +203,7 @@ func (m *Cart) Reset() { *m = Cart{} }
func (m *Cart) String() string { return proto.CompactTextString(m) } func (m *Cart) String() string { return proto.CompactTextString(m) }
func (*Cart) ProtoMessage() {} func (*Cart) ProtoMessage() {}
func (*Cart) Descriptor() ([]byte, []int) { func (*Cart) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{4} return fileDescriptor_demo_bbfc9458084e7e4b, []int{4}
} }
func (m *Cart) XXX_Unmarshal(b []byte) error { func (m *Cart) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Cart.Unmarshal(m, b) return xxx_messageInfo_Cart.Unmarshal(m, b)
@ -247,7 +247,7 @@ func (m *Empty) Reset() { *m = Empty{} }
func (m *Empty) String() string { return proto.CompactTextString(m) } func (m *Empty) String() string { return proto.CompactTextString(m) }
func (*Empty) ProtoMessage() {} func (*Empty) ProtoMessage() {}
func (*Empty) Descriptor() ([]byte, []int) { func (*Empty) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{5} return fileDescriptor_demo_bbfc9458084e7e4b, []int{5}
} }
func (m *Empty) XXX_Unmarshal(b []byte) error { func (m *Empty) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Empty.Unmarshal(m, b) return xxx_messageInfo_Empty.Unmarshal(m, b)
@ -279,7 +279,7 @@ func (m *ListRecommendationsRequest) Reset() { *m = ListRecommendationsR
func (m *ListRecommendationsRequest) String() string { return proto.CompactTextString(m) } func (m *ListRecommendationsRequest) String() string { return proto.CompactTextString(m) }
func (*ListRecommendationsRequest) ProtoMessage() {} func (*ListRecommendationsRequest) ProtoMessage() {}
func (*ListRecommendationsRequest) Descriptor() ([]byte, []int) { func (*ListRecommendationsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{6} return fileDescriptor_demo_bbfc9458084e7e4b, []int{6}
} }
func (m *ListRecommendationsRequest) XXX_Unmarshal(b []byte) error { func (m *ListRecommendationsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListRecommendationsRequest.Unmarshal(m, b) return xxx_messageInfo_ListRecommendationsRequest.Unmarshal(m, b)
@ -324,7 +324,7 @@ func (m *ListRecommendationsResponse) Reset() { *m = ListRecommendations
func (m *ListRecommendationsResponse) String() string { return proto.CompactTextString(m) } func (m *ListRecommendationsResponse) String() string { return proto.CompactTextString(m) }
func (*ListRecommendationsResponse) ProtoMessage() {} func (*ListRecommendationsResponse) ProtoMessage() {}
func (*ListRecommendationsResponse) Descriptor() ([]byte, []int) { func (*ListRecommendationsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{7} return fileDescriptor_demo_bbfc9458084e7e4b, []int{7}
} }
func (m *ListRecommendationsResponse) XXX_Unmarshal(b []byte) error { func (m *ListRecommendationsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListRecommendationsResponse.Unmarshal(m, b) return xxx_messageInfo_ListRecommendationsResponse.Unmarshal(m, b)
@ -356,7 +356,7 @@ type Product struct {
Name string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` Name string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"`
Description string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"` Description string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"`
Picture string `protobuf:"bytes,4,opt,name=picture" json:"picture,omitempty"` Picture string `protobuf:"bytes,4,opt,name=picture" json:"picture,omitempty"`
PriceUsd *MoneyAmount `protobuf:"bytes,5,opt,name=price_usd,json=priceUsd" json:"price_usd,omitempty"` PriceUsd *Money `protobuf:"bytes,5,opt,name=price_usd,json=priceUsd" json:"price_usd,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -366,7 +366,7 @@ func (m *Product) Reset() { *m = Product{} }
func (m *Product) String() string { return proto.CompactTextString(m) } func (m *Product) String() string { return proto.CompactTextString(m) }
func (*Product) ProtoMessage() {} func (*Product) ProtoMessage() {}
func (*Product) Descriptor() ([]byte, []int) { func (*Product) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{8} return fileDescriptor_demo_bbfc9458084e7e4b, []int{8}
} }
func (m *Product) XXX_Unmarshal(b []byte) error { func (m *Product) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Product.Unmarshal(m, b) return xxx_messageInfo_Product.Unmarshal(m, b)
@ -414,7 +414,7 @@ func (m *Product) GetPicture() string {
return "" return ""
} }
func (m *Product) GetPriceUsd() *MoneyAmount { func (m *Product) GetPriceUsd() *Money {
if m != nil { if m != nil {
return m.PriceUsd return m.PriceUsd
} }
@ -432,7 +432,7 @@ func (m *ListProductsResponse) Reset() { *m = ListProductsResponse{} }
func (m *ListProductsResponse) String() string { return proto.CompactTextString(m) } func (m *ListProductsResponse) String() string { return proto.CompactTextString(m) }
func (*ListProductsResponse) ProtoMessage() {} func (*ListProductsResponse) ProtoMessage() {}
func (*ListProductsResponse) Descriptor() ([]byte, []int) { func (*ListProductsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{9} return fileDescriptor_demo_bbfc9458084e7e4b, []int{9}
} }
func (m *ListProductsResponse) XXX_Unmarshal(b []byte) error { func (m *ListProductsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListProductsResponse.Unmarshal(m, b) return xxx_messageInfo_ListProductsResponse.Unmarshal(m, b)
@ -470,7 +470,7 @@ func (m *GetProductRequest) Reset() { *m = GetProductRequest{} }
func (m *GetProductRequest) String() string { return proto.CompactTextString(m) } func (m *GetProductRequest) String() string { return proto.CompactTextString(m) }
func (*GetProductRequest) ProtoMessage() {} func (*GetProductRequest) ProtoMessage() {}
func (*GetProductRequest) Descriptor() ([]byte, []int) { func (*GetProductRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{10} return fileDescriptor_demo_bbfc9458084e7e4b, []int{10}
} }
func (m *GetProductRequest) XXX_Unmarshal(b []byte) error { func (m *GetProductRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetProductRequest.Unmarshal(m, b) return xxx_messageInfo_GetProductRequest.Unmarshal(m, b)
@ -508,7 +508,7 @@ func (m *SearchProductsRequest) Reset() { *m = SearchProductsRequest{} }
func (m *SearchProductsRequest) String() string { return proto.CompactTextString(m) } func (m *SearchProductsRequest) String() string { return proto.CompactTextString(m) }
func (*SearchProductsRequest) ProtoMessage() {} func (*SearchProductsRequest) ProtoMessage() {}
func (*SearchProductsRequest) Descriptor() ([]byte, []int) { func (*SearchProductsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{11} return fileDescriptor_demo_bbfc9458084e7e4b, []int{11}
} }
func (m *SearchProductsRequest) XXX_Unmarshal(b []byte) error { func (m *SearchProductsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SearchProductsRequest.Unmarshal(m, b) return xxx_messageInfo_SearchProductsRequest.Unmarshal(m, b)
@ -546,7 +546,7 @@ func (m *SearchProductsResponse) Reset() { *m = SearchProductsResponse{}
func (m *SearchProductsResponse) String() string { return proto.CompactTextString(m) } func (m *SearchProductsResponse) String() string { return proto.CompactTextString(m) }
func (*SearchProductsResponse) ProtoMessage() {} func (*SearchProductsResponse) ProtoMessage() {}
func (*SearchProductsResponse) Descriptor() ([]byte, []int) { func (*SearchProductsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{12} return fileDescriptor_demo_bbfc9458084e7e4b, []int{12}
} }
func (m *SearchProductsResponse) XXX_Unmarshal(b []byte) error { func (m *SearchProductsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SearchProductsResponse.Unmarshal(m, b) return xxx_messageInfo_SearchProductsResponse.Unmarshal(m, b)
@ -585,7 +585,7 @@ func (m *GetQuoteRequest) Reset() { *m = GetQuoteRequest{} }
func (m *GetQuoteRequest) String() string { return proto.CompactTextString(m) } func (m *GetQuoteRequest) String() string { return proto.CompactTextString(m) }
func (*GetQuoteRequest) ProtoMessage() {} func (*GetQuoteRequest) ProtoMessage() {}
func (*GetQuoteRequest) Descriptor() ([]byte, []int) { func (*GetQuoteRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{13} return fileDescriptor_demo_bbfc9458084e7e4b, []int{13}
} }
func (m *GetQuoteRequest) XXX_Unmarshal(b []byte) error { func (m *GetQuoteRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetQuoteRequest.Unmarshal(m, b) return xxx_messageInfo_GetQuoteRequest.Unmarshal(m, b)
@ -620,7 +620,7 @@ func (m *GetQuoteRequest) GetItems() []*CartItem {
} }
type GetQuoteResponse struct { type GetQuoteResponse struct {
CostUsd *MoneyAmount `protobuf:"bytes,1,opt,name=cost_usd,json=costUsd" json:"cost_usd,omitempty"` CostUsd *Money `protobuf:"bytes,1,opt,name=cost_usd,json=costUsd" json:"cost_usd,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -630,7 +630,7 @@ func (m *GetQuoteResponse) Reset() { *m = GetQuoteResponse{} }
func (m *GetQuoteResponse) String() string { return proto.CompactTextString(m) } func (m *GetQuoteResponse) String() string { return proto.CompactTextString(m) }
func (*GetQuoteResponse) ProtoMessage() {} func (*GetQuoteResponse) ProtoMessage() {}
func (*GetQuoteResponse) Descriptor() ([]byte, []int) { func (*GetQuoteResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{14} return fileDescriptor_demo_bbfc9458084e7e4b, []int{14}
} }
func (m *GetQuoteResponse) XXX_Unmarshal(b []byte) error { func (m *GetQuoteResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetQuoteResponse.Unmarshal(m, b) return xxx_messageInfo_GetQuoteResponse.Unmarshal(m, b)
@ -650,7 +650,7 @@ func (m *GetQuoteResponse) XXX_DiscardUnknown() {
var xxx_messageInfo_GetQuoteResponse proto.InternalMessageInfo var xxx_messageInfo_GetQuoteResponse proto.InternalMessageInfo
func (m *GetQuoteResponse) GetCostUsd() *MoneyAmount { func (m *GetQuoteResponse) GetCostUsd() *Money {
if m != nil { if m != nil {
return m.CostUsd return m.CostUsd
} }
@ -669,7 +669,7 @@ func (m *ShipOrderRequest) Reset() { *m = ShipOrderRequest{} }
func (m *ShipOrderRequest) String() string { return proto.CompactTextString(m) } func (m *ShipOrderRequest) String() string { return proto.CompactTextString(m) }
func (*ShipOrderRequest) ProtoMessage() {} func (*ShipOrderRequest) ProtoMessage() {}
func (*ShipOrderRequest) Descriptor() ([]byte, []int) { func (*ShipOrderRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{15} return fileDescriptor_demo_bbfc9458084e7e4b, []int{15}
} }
func (m *ShipOrderRequest) XXX_Unmarshal(b []byte) error { func (m *ShipOrderRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ShipOrderRequest.Unmarshal(m, b) return xxx_messageInfo_ShipOrderRequest.Unmarshal(m, b)
@ -714,7 +714,7 @@ func (m *ShipOrderResponse) Reset() { *m = ShipOrderResponse{} }
func (m *ShipOrderResponse) String() string { return proto.CompactTextString(m) } func (m *ShipOrderResponse) String() string { return proto.CompactTextString(m) }
func (*ShipOrderResponse) ProtoMessage() {} func (*ShipOrderResponse) ProtoMessage() {}
func (*ShipOrderResponse) Descriptor() ([]byte, []int) { func (*ShipOrderResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{16} return fileDescriptor_demo_bbfc9458084e7e4b, []int{16}
} }
func (m *ShipOrderResponse) XXX_Unmarshal(b []byte) error { func (m *ShipOrderResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ShipOrderResponse.Unmarshal(m, b) return xxx_messageInfo_ShipOrderResponse.Unmarshal(m, b)
@ -742,9 +742,9 @@ func (m *ShipOrderResponse) GetTrackingId() string {
} }
type Address struct { type Address struct {
StreetAddress_1 string `protobuf:"bytes,1,opt,name=street_address_1,json=streetAddress1" json:"street_address_1,omitempty"` StreetAddress string `protobuf:"bytes,1,opt,name=street_address,json=streetAddress" json:"street_address,omitempty"`
StreetAddress_2 string `protobuf:"bytes,2,opt,name=street_address_2,json=streetAddress2" json:"street_address_2,omitempty"` City string `protobuf:"bytes,2,opt,name=city" json:"city,omitempty"`
City string `protobuf:"bytes,3,opt,name=city" json:"city,omitempty"` State string `protobuf:"bytes,3,opt,name=state" json:"state,omitempty"`
Country string `protobuf:"bytes,4,opt,name=country" json:"country,omitempty"` Country string `protobuf:"bytes,4,opt,name=country" json:"country,omitempty"`
ZipCode int32 `protobuf:"varint,5,opt,name=zip_code,json=zipCode" json:"zip_code,omitempty"` ZipCode int32 `protobuf:"varint,5,opt,name=zip_code,json=zipCode" json:"zip_code,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
@ -756,7 +756,7 @@ func (m *Address) Reset() { *m = Address{} }
func (m *Address) String() string { return proto.CompactTextString(m) } func (m *Address) String() string { return proto.CompactTextString(m) }
func (*Address) ProtoMessage() {} func (*Address) ProtoMessage() {}
func (*Address) Descriptor() ([]byte, []int) { func (*Address) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{17} return fileDescriptor_demo_bbfc9458084e7e4b, []int{17}
} }
func (m *Address) XXX_Unmarshal(b []byte) error { func (m *Address) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Address.Unmarshal(m, b) return xxx_messageInfo_Address.Unmarshal(m, b)
@ -776,16 +776,9 @@ func (m *Address) XXX_DiscardUnknown() {
var xxx_messageInfo_Address proto.InternalMessageInfo var xxx_messageInfo_Address proto.InternalMessageInfo
func (m *Address) GetStreetAddress_1() string { func (m *Address) GetStreetAddress() string {
if m != nil { if m != nil {
return m.StreetAddress_1 return m.StreetAddress
}
return ""
}
func (m *Address) GetStreetAddress_2() string {
if m != nil {
return m.StreetAddress_2
} }
return "" return ""
} }
@ -797,6 +790,13 @@ func (m *Address) GetCity() string {
return "" return ""
} }
func (m *Address) GetState() string {
if m != nil {
return m.State
}
return ""
}
func (m *Address) GetCountry() string { func (m *Address) GetCountry() string {
if m != nil { if m != nil {
return m.Country return m.Country
@ -811,58 +811,20 @@ func (m *Address) GetZipCode() int32 {
return 0 return 0
} }
// Describes a money amount without currency. For example, decimal=2 and // Represents an amount of money with its currency type.
// fractional=500 (or fractional=5) makes up 2.5 units.
type MoneyAmount struct {
Decimal uint32 `protobuf:"varint,1,opt,name=decimal" json:"decimal,omitempty"`
Fractional uint32 `protobuf:"varint,2,opt,name=fractional" json:"fractional,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *MoneyAmount) Reset() { *m = MoneyAmount{} }
func (m *MoneyAmount) String() string { return proto.CompactTextString(m) }
func (*MoneyAmount) ProtoMessage() {}
func (*MoneyAmount) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{18}
}
func (m *MoneyAmount) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_MoneyAmount.Unmarshal(m, b)
}
func (m *MoneyAmount) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_MoneyAmount.Marshal(b, m, deterministic)
}
func (dst *MoneyAmount) XXX_Merge(src proto.Message) {
xxx_messageInfo_MoneyAmount.Merge(dst, src)
}
func (m *MoneyAmount) XXX_Size() int {
return xxx_messageInfo_MoneyAmount.Size(m)
}
func (m *MoneyAmount) XXX_DiscardUnknown() {
xxx_messageInfo_MoneyAmount.DiscardUnknown(m)
}
var xxx_messageInfo_MoneyAmount proto.InternalMessageInfo
func (m *MoneyAmount) GetDecimal() uint32 {
if m != nil {
return m.Decimal
}
return 0
}
func (m *MoneyAmount) GetFractional() uint32 {
if m != nil {
return m.Fractional
}
return 0
}
type Money struct { type Money struct {
// The 3-letter currency code defined in ISO 4217. // The 3-letter currency code defined in ISO 4217.
CurrencyCode string `protobuf:"bytes,1,opt,name=currency_code,json=currencyCode" json:"currency_code,omitempty"` CurrencyCode string `protobuf:"bytes,1,opt,name=currency_code,json=currencyCode" json:"currency_code,omitempty"`
Amount *MoneyAmount `protobuf:"bytes,2,opt,name=amount" json:"amount,omitempty"` // The whole units of the amount.
// For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar.
Units int64 `protobuf:"varint,2,opt,name=units" json:"units,omitempty"`
// Number of nano (10^-9) units of the amount.
// The value must be between -999,999,999 and +999,999,999 inclusive.
// If `units` is positive, `nanos` must be positive or zero.
// If `units` is zero, `nanos` can be positive, zero, or negative.
// If `units` is negative, `nanos` must be negative or zero.
// For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
Nanos int32 `protobuf:"varint,3,opt,name=nanos" json:"nanos,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -872,7 +834,7 @@ func (m *Money) Reset() { *m = Money{} }
func (m *Money) String() string { return proto.CompactTextString(m) } func (m *Money) String() string { return proto.CompactTextString(m) }
func (*Money) ProtoMessage() {} func (*Money) ProtoMessage() {}
func (*Money) Descriptor() ([]byte, []int) { func (*Money) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{19} return fileDescriptor_demo_bbfc9458084e7e4b, []int{18}
} }
func (m *Money) XXX_Unmarshal(b []byte) error { func (m *Money) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Money.Unmarshal(m, b) return xxx_messageInfo_Money.Unmarshal(m, b)
@ -899,11 +861,18 @@ func (m *Money) GetCurrencyCode() string {
return "" return ""
} }
func (m *Money) GetAmount() *MoneyAmount { func (m *Money) GetUnits() int64 {
if m != nil { if m != nil {
return m.Amount return m.Units
} }
return nil return 0
}
func (m *Money) GetNanos() int32 {
if m != nil {
return m.Nanos
}
return 0
} }
type GetSupportedCurrenciesResponse struct { type GetSupportedCurrenciesResponse struct {
@ -918,7 +887,7 @@ func (m *GetSupportedCurrenciesResponse) Reset() { *m = GetSupportedCurr
func (m *GetSupportedCurrenciesResponse) String() string { return proto.CompactTextString(m) } func (m *GetSupportedCurrenciesResponse) String() string { return proto.CompactTextString(m) }
func (*GetSupportedCurrenciesResponse) ProtoMessage() {} func (*GetSupportedCurrenciesResponse) ProtoMessage() {}
func (*GetSupportedCurrenciesResponse) Descriptor() ([]byte, []int) { func (*GetSupportedCurrenciesResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{20} return fileDescriptor_demo_bbfc9458084e7e4b, []int{19}
} }
func (m *GetSupportedCurrenciesResponse) XXX_Unmarshal(b []byte) error { func (m *GetSupportedCurrenciesResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetSupportedCurrenciesResponse.Unmarshal(m, b) return xxx_messageInfo_GetSupportedCurrenciesResponse.Unmarshal(m, b)
@ -958,7 +927,7 @@ func (m *CurrencyConversionRequest) Reset() { *m = CurrencyConversionReq
func (m *CurrencyConversionRequest) String() string { return proto.CompactTextString(m) } func (m *CurrencyConversionRequest) String() string { return proto.CompactTextString(m) }
func (*CurrencyConversionRequest) ProtoMessage() {} func (*CurrencyConversionRequest) ProtoMessage() {}
func (*CurrencyConversionRequest) Descriptor() ([]byte, []int) { func (*CurrencyConversionRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{21} return fileDescriptor_demo_bbfc9458084e7e4b, []int{20}
} }
func (m *CurrencyConversionRequest) XXX_Unmarshal(b []byte) error { func (m *CurrencyConversionRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CurrencyConversionRequest.Unmarshal(m, b) return xxx_messageInfo_CurrencyConversionRequest.Unmarshal(m, b)
@ -1006,7 +975,7 @@ func (m *CreditCardInfo) Reset() { *m = CreditCardInfo{} }
func (m *CreditCardInfo) String() string { return proto.CompactTextString(m) } func (m *CreditCardInfo) String() string { return proto.CompactTextString(m) }
func (*CreditCardInfo) ProtoMessage() {} func (*CreditCardInfo) ProtoMessage() {}
func (*CreditCardInfo) Descriptor() ([]byte, []int) { func (*CreditCardInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{22} return fileDescriptor_demo_bbfc9458084e7e4b, []int{21}
} }
func (m *CreditCardInfo) XXX_Unmarshal(b []byte) error { func (m *CreditCardInfo) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CreditCardInfo.Unmarshal(m, b) return xxx_messageInfo_CreditCardInfo.Unmarshal(m, b)
@ -1066,7 +1035,7 @@ func (m *ChargeRequest) Reset() { *m = ChargeRequest{} }
func (m *ChargeRequest) String() string { return proto.CompactTextString(m) } func (m *ChargeRequest) String() string { return proto.CompactTextString(m) }
func (*ChargeRequest) ProtoMessage() {} func (*ChargeRequest) ProtoMessage() {}
func (*ChargeRequest) Descriptor() ([]byte, []int) { func (*ChargeRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{23} return fileDescriptor_demo_bbfc9458084e7e4b, []int{22}
} }
func (m *ChargeRequest) XXX_Unmarshal(b []byte) error { func (m *ChargeRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChargeRequest.Unmarshal(m, b) return xxx_messageInfo_ChargeRequest.Unmarshal(m, b)
@ -1111,7 +1080,7 @@ func (m *ChargeResponse) Reset() { *m = ChargeResponse{} }
func (m *ChargeResponse) String() string { return proto.CompactTextString(m) } func (m *ChargeResponse) String() string { return proto.CompactTextString(m) }
func (*ChargeResponse) ProtoMessage() {} func (*ChargeResponse) ProtoMessage() {}
func (*ChargeResponse) Descriptor() ([]byte, []int) { func (*ChargeResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{24} return fileDescriptor_demo_bbfc9458084e7e4b, []int{23}
} }
func (m *ChargeResponse) XXX_Unmarshal(b []byte) error { func (m *ChargeResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChargeResponse.Unmarshal(m, b) return xxx_messageInfo_ChargeResponse.Unmarshal(m, b)
@ -1150,7 +1119,7 @@ func (m *OrderItem) Reset() { *m = OrderItem{} }
func (m *OrderItem) String() string { return proto.CompactTextString(m) } func (m *OrderItem) String() string { return proto.CompactTextString(m) }
func (*OrderItem) ProtoMessage() {} func (*OrderItem) ProtoMessage() {}
func (*OrderItem) Descriptor() ([]byte, []int) { func (*OrderItem) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{25} return fileDescriptor_demo_bbfc9458084e7e4b, []int{24}
} }
func (m *OrderItem) XXX_Unmarshal(b []byte) error { func (m *OrderItem) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_OrderItem.Unmarshal(m, b) return xxx_messageInfo_OrderItem.Unmarshal(m, b)
@ -1199,7 +1168,7 @@ func (m *OrderResult) Reset() { *m = OrderResult{} }
func (m *OrderResult) String() string { return proto.CompactTextString(m) } func (m *OrderResult) String() string { return proto.CompactTextString(m) }
func (*OrderResult) ProtoMessage() {} func (*OrderResult) ProtoMessage() {}
func (*OrderResult) Descriptor() ([]byte, []int) { func (*OrderResult) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{26} return fileDescriptor_demo_bbfc9458084e7e4b, []int{25}
} }
func (m *OrderResult) XXX_Unmarshal(b []byte) error { func (m *OrderResult) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_OrderResult.Unmarshal(m, b) return xxx_messageInfo_OrderResult.Unmarshal(m, b)
@ -1266,7 +1235,7 @@ func (m *SendOrderConfirmationRequest) Reset() { *m = SendOrderConfirmat
func (m *SendOrderConfirmationRequest) String() string { return proto.CompactTextString(m) } func (m *SendOrderConfirmationRequest) String() string { return proto.CompactTextString(m) }
func (*SendOrderConfirmationRequest) ProtoMessage() {} func (*SendOrderConfirmationRequest) ProtoMessage() {}
func (*SendOrderConfirmationRequest) Descriptor() ([]byte, []int) { func (*SendOrderConfirmationRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{27} return fileDescriptor_demo_bbfc9458084e7e4b, []int{26}
} }
func (m *SendOrderConfirmationRequest) XXX_Unmarshal(b []byte) error { func (m *SendOrderConfirmationRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SendOrderConfirmationRequest.Unmarshal(m, b) return xxx_messageInfo_SendOrderConfirmationRequest.Unmarshal(m, b)
@ -1313,7 +1282,7 @@ func (m *CreateOrderRequest) Reset() { *m = CreateOrderRequest{} }
func (m *CreateOrderRequest) String() string { return proto.CompactTextString(m) } func (m *CreateOrderRequest) String() string { return proto.CompactTextString(m) }
func (*CreateOrderRequest) ProtoMessage() {} func (*CreateOrderRequest) ProtoMessage() {}
func (*CreateOrderRequest) Descriptor() ([]byte, []int) { func (*CreateOrderRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{28} return fileDescriptor_demo_bbfc9458084e7e4b, []int{27}
} }
func (m *CreateOrderRequest) XXX_Unmarshal(b []byte) error { func (m *CreateOrderRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CreateOrderRequest.Unmarshal(m, b) return xxx_messageInfo_CreateOrderRequest.Unmarshal(m, b)
@ -1366,7 +1335,7 @@ func (m *CreateOrderResponse) Reset() { *m = CreateOrderResponse{} }
func (m *CreateOrderResponse) String() string { return proto.CompactTextString(m) } func (m *CreateOrderResponse) String() string { return proto.CompactTextString(m) }
func (*CreateOrderResponse) ProtoMessage() {} func (*CreateOrderResponse) ProtoMessage() {}
func (*CreateOrderResponse) Descriptor() ([]byte, []int) { func (*CreateOrderResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{29} return fileDescriptor_demo_bbfc9458084e7e4b, []int{28}
} }
func (m *CreateOrderResponse) XXX_Unmarshal(b []byte) error { func (m *CreateOrderResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CreateOrderResponse.Unmarshal(m, b) return xxx_messageInfo_CreateOrderResponse.Unmarshal(m, b)
@ -1415,7 +1384,7 @@ func (m *PlaceOrderRequest) Reset() { *m = PlaceOrderRequest{} }
func (m *PlaceOrderRequest) String() string { return proto.CompactTextString(m) } func (m *PlaceOrderRequest) String() string { return proto.CompactTextString(m) }
func (*PlaceOrderRequest) ProtoMessage() {} func (*PlaceOrderRequest) ProtoMessage() {}
func (*PlaceOrderRequest) Descriptor() ([]byte, []int) { func (*PlaceOrderRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{30} return fileDescriptor_demo_bbfc9458084e7e4b, []int{29}
} }
func (m *PlaceOrderRequest) XXX_Unmarshal(b []byte) error { func (m *PlaceOrderRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PlaceOrderRequest.Unmarshal(m, b) return xxx_messageInfo_PlaceOrderRequest.Unmarshal(m, b)
@ -1481,7 +1450,7 @@ func (m *PlaceOrderResponse) Reset() { *m = PlaceOrderResponse{} }
func (m *PlaceOrderResponse) String() string { return proto.CompactTextString(m) } func (m *PlaceOrderResponse) String() string { return proto.CompactTextString(m) }
func (*PlaceOrderResponse) ProtoMessage() {} func (*PlaceOrderResponse) ProtoMessage() {}
func (*PlaceOrderResponse) Descriptor() ([]byte, []int) { func (*PlaceOrderResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{31} return fileDescriptor_demo_bbfc9458084e7e4b, []int{30}
} }
func (m *PlaceOrderResponse) XXX_Unmarshal(b []byte) error { func (m *PlaceOrderResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PlaceOrderResponse.Unmarshal(m, b) return xxx_messageInfo_PlaceOrderResponse.Unmarshal(m, b)
@ -1527,7 +1496,6 @@ func init() {
proto.RegisterType((*ShipOrderRequest)(nil), "hipstershop.ShipOrderRequest") proto.RegisterType((*ShipOrderRequest)(nil), "hipstershop.ShipOrderRequest")
proto.RegisterType((*ShipOrderResponse)(nil), "hipstershop.ShipOrderResponse") proto.RegisterType((*ShipOrderResponse)(nil), "hipstershop.ShipOrderResponse")
proto.RegisterType((*Address)(nil), "hipstershop.Address") proto.RegisterType((*Address)(nil), "hipstershop.Address")
proto.RegisterType((*MoneyAmount)(nil), "hipstershop.MoneyAmount")
proto.RegisterType((*Money)(nil), "hipstershop.Money") proto.RegisterType((*Money)(nil), "hipstershop.Money")
proto.RegisterType((*GetSupportedCurrenciesResponse)(nil), "hipstershop.GetSupportedCurrenciesResponse") proto.RegisterType((*GetSupportedCurrenciesResponse)(nil), "hipstershop.GetSupportedCurrenciesResponse")
proto.RegisterType((*CurrencyConversionRequest)(nil), "hipstershop.CurrencyConversionRequest") proto.RegisterType((*CurrencyConversionRequest)(nil), "hipstershop.CurrencyConversionRequest")
@ -2294,100 +2262,98 @@ var _CheckoutService_serviceDesc = grpc.ServiceDesc{
Metadata: "demo.proto", Metadata: "demo.proto",
} }
func init() { proto.RegisterFile("demo.proto", fileDescriptor_demo_40506d781b7ed975) } func init() { proto.RegisterFile("demo.proto", fileDescriptor_demo_bbfc9458084e7e4b) }
var fileDescriptor_demo_40506d781b7ed975 = []byte{ var fileDescriptor_demo_bbfc9458084e7e4b = []byte{
// 1466 bytes of a gzipped FileDescriptorProto // 1435 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x58, 0xdd, 0x72, 0xd3, 0xc6, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x58, 0xdd, 0x72, 0xd3, 0x46,
0x17, 0x8f, 0x9c, 0x38, 0xb6, 0x8f, 0x63, 0x27, 0x59, 0x12, 0xfe, 0x46, 0x81, 0x90, 0xff, 0x66, 0x14, 0x8e, 0x1c, 0x3b, 0xb6, 0x8f, 0x63, 0x27, 0x59, 0x12, 0x6a, 0x14, 0x7e, 0xd2, 0xcd, 0x40,
0x4a, 0x43, 0xa1, 0x19, 0x30, 0xed, 0x70, 0x51, 0x5a, 0xca, 0x98, 0x8c, 0xf1, 0x0c, 0x14, 0xaa, 0xa1, 0x40, 0xca, 0xa4, 0x9d, 0xe1, 0xa2, 0xb4, 0x94, 0x31, 0x19, 0xe3, 0x19, 0x28, 0x54, 0x81,
0x40, 0xa7, 0x1d, 0x3a, 0x78, 0x84, 0xb4, 0xc1, 0x2a, 0xd6, 0x07, 0xab, 0x55, 0xa6, 0x66, 0x7a, 0x0e, 0x1d, 0x3a, 0xf5, 0x08, 0x69, 0xc1, 0x2a, 0x91, 0x56, 0xd9, 0x5d, 0x65, 0x6a, 0xa6, 0x57,
0x45, 0x5f, 0xa4, 0x57, 0xbd, 0xe8, 0x03, 0xb4, 0xef, 0xd0, 0xfb, 0xbe, 0x42, 0x9f, 0xa3, 0xb3, 0xf4, 0x01, 0x7a, 0xdf, 0x47, 0xe8, 0x03, 0xb4, 0xef, 0xd0, 0xfb, 0xbe, 0x42, 0x9f, 0xa3, 0xb3,
0xab, 0x5d, 0x7d, 0x59, 0x4a, 0xc2, 0x4d, 0x7b, 0xe7, 0xdd, 0xfd, 0xed, 0x39, 0xbf, 0x3d, 0xdf, 0x2b, 0xad, 0xfe, 0x6c, 0x25, 0xe1, 0xa6, 0xbd, 0xd3, 0xee, 0x7e, 0x7b, 0xce, 0xb7, 0xe7, 0xdf,
0x32, 0x80, 0x4d, 0x5c, 0x7f, 0x3f, 0xa0, 0x3e, 0xf3, 0x51, 0x7b, 0xe2, 0x04, 0x21, 0x23, 0x34, 0x06, 0x70, 0x89, 0x4f, 0x77, 0x42, 0x46, 0x05, 0x45, 0x9d, 0x89, 0x17, 0x72, 0x41, 0x18, 0x9f,
0x9c, 0xf8, 0x01, 0x3e, 0x80, 0xe6, 0xc0, 0xa4, 0x6c, 0xc4, 0x88, 0x8b, 0x2e, 0x01, 0x04, 0xd4, 0xd0, 0x10, 0xef, 0x41, 0x6b, 0x60, 0x33, 0x31, 0x12, 0xc4, 0x47, 0x17, 0x00, 0x42, 0x46, 0xdd,
0xb7, 0x23, 0x8b, 0x8d, 0x1d, 0xbb, 0xa7, 0xed, 0x68, 0x7b, 0x2d, 0xa3, 0x25, 0x77, 0x46, 0x36, 0xc8, 0x11, 0x63, 0xcf, 0xed, 0x1b, 0x5b, 0xc6, 0xd5, 0xb6, 0xd5, 0x4e, 0x76, 0x46, 0x2e, 0x32,
0xd2, 0xa1, 0xf9, 0x26, 0x32, 0x3d, 0xe6, 0xb0, 0x59, 0xaf, 0xb6, 0xa3, 0xed, 0xd5, 0x8d, 0x64, 0xa1, 0x75, 0x18, 0xd9, 0x81, 0xf0, 0xc4, 0xb4, 0x5f, 0xdb, 0x32, 0xae, 0x36, 0xac, 0x74, 0x8d,
0x8d, 0x9f, 0x42, 0xf7, 0x9e, 0x6d, 0x73, 0x29, 0x06, 0x79, 0x13, 0x91, 0x90, 0xa1, 0xff, 0x41, 0x9f, 0x42, 0xef, 0x9e, 0xeb, 0x4a, 0x29, 0x16, 0x39, 0x8c, 0x08, 0x17, 0xe8, 0x03, 0x68, 0x46,
0x23, 0x0a, 0x09, 0x4d, 0x25, 0x2d, 0xf3, 0xe5, 0xc8, 0x46, 0x57, 0x61, 0xc9, 0x61, 0xc4, 0x15, 0x9c, 0xb0, 0x4c, 0xd2, 0x92, 0x5c, 0x8e, 0x5c, 0x74, 0x0d, 0xea, 0x9e, 0x20, 0xbe, 0x12, 0xd1,
0x22, 0xda, 0xfd, 0xcd, 0xfd, 0x0c, 0x9b, 0x7d, 0x45, 0xc5, 0x10, 0x10, 0x7c, 0x0d, 0xd6, 0x0e, 0xd9, 0xdd, 0xd8, 0xc9, 0xb1, 0xd9, 0xd1, 0x54, 0x2c, 0x05, 0xc1, 0xd7, 0x61, 0x75, 0xcf, 0x0f,
0xdc, 0x80, 0xcd, 0xf8, 0xf6, 0x69, 0x72, 0xf1, 0x55, 0xe8, 0x0e, 0x09, 0x3b, 0x13, 0xf4, 0x21, 0xc5, 0x54, 0x6e, 0x9f, 0x24, 0x17, 0x5f, 0x83, 0xde, 0x90, 0x88, 0x53, 0x41, 0x1f, 0x42, 0x5d,
0x2c, 0x71, 0x5c, 0x35, 0xc7, 0x6b, 0x50, 0xe7, 0x04, 0xc2, 0x5e, 0x6d, 0x67, 0xb1, 0x9a, 0x64, 0xe2, 0xaa, 0x39, 0x5e, 0x87, 0x86, 0x24, 0xc0, 0xfb, 0xb5, 0xad, 0xc5, 0x6a, 0x92, 0x31, 0x06,
0x8c, 0xc1, 0x0d, 0xa8, 0x0b, 0x96, 0xf8, 0x1b, 0xd0, 0x1f, 0x3a, 0x21, 0x33, 0x88, 0xe5, 0xbb, 0x37, 0xa1, 0xa1, 0x58, 0xe2, 0x6f, 0xc1, 0x7c, 0xe8, 0x71, 0x61, 0x11, 0x87, 0xfa, 0x3e, 0x09,
0x2e, 0xf1, 0x6c, 0x93, 0x39, 0xbe, 0x17, 0x9e, 0x6a, 0x90, 0xcb, 0xd0, 0x4e, 0xcd, 0x1e, 0xab, 0x5c, 0x5b, 0x78, 0x34, 0xe0, 0x27, 0x1a, 0xe4, 0x12, 0x74, 0x32, 0xb3, 0xc7, 0x2a, 0xdb, 0x16,
0x6c, 0x19, 0x90, 0xd8, 0x3d, 0xc4, 0x5f, 0xc0, 0x56, 0xa9, 0xdc, 0x30, 0xf0, 0xbd, 0x90, 0x14, 0xa4, 0x76, 0xe7, 0xf8, 0x4b, 0xd8, 0x9c, 0x2b, 0x97, 0x87, 0x34, 0xe0, 0xa4, 0x7c, 0xdf, 0x98,
0xef, 0x6b, 0x73, 0xf7, 0x7f, 0xd1, 0xa0, 0xf1, 0x24, 0x5e, 0xa2, 0x2e, 0xd4, 0x12, 0x02, 0x35, 0xb9, 0xff, 0x9b, 0x01, 0xcd, 0x27, 0xf1, 0x12, 0xf5, 0xa0, 0x96, 0x12, 0xa8, 0x79, 0x2e, 0x42,
0xc7, 0x46, 0x08, 0x96, 0x3c, 0xd3, 0x25, 0xc2, 0x1b, 0x2d, 0x43, 0xfc, 0x46, 0x3b, 0xd0, 0xb6, 0x50, 0x0f, 0x6c, 0x9f, 0x28, 0x6f, 0xb4, 0x2d, 0xf5, 0x8d, 0xb6, 0xa0, 0xe3, 0x12, 0xee, 0x30,
0x49, 0x68, 0x51, 0x27, 0xe0, 0x8a, 0x7a, 0x8b, 0xe2, 0x28, 0xbb, 0x85, 0x7a, 0xd0, 0x08, 0x1c, 0x2f, 0x94, 0x8a, 0xfa, 0x8b, 0xea, 0x28, 0xbf, 0x85, 0xfa, 0xd0, 0x0c, 0x3d, 0x47, 0x44, 0x8c,
0x8b, 0x45, 0x94, 0xf4, 0x96, 0xc4, 0xa9, 0x5a, 0xa2, 0x4f, 0xa1, 0x15, 0x50, 0xc7, 0x22, 0xe3, 0xf4, 0xeb, 0xea, 0x54, 0x2f, 0xd1, 0x27, 0xd0, 0x0e, 0x99, 0xe7, 0x90, 0x71, 0xc4, 0xdd, 0x7e,
0x28, 0xb4, 0x7b, 0x75, 0xe1, 0xe2, 0x5e, 0xce, 0x7a, 0x8f, 0x7c, 0x8f, 0xcc, 0xee, 0xb9, 0x7e, 0x43, 0xb9, 0x18, 0x15, 0xac, 0xf7, 0x88, 0x06, 0x64, 0x6a, 0xb5, 0x14, 0xe8, 0x19, 0x77, 0xf1,
0xe4, 0x31, 0xa3, 0x29, 0xa0, 0xcf, 0x42, 0x1b, 0x3f, 0x80, 0x0d, 0xfe, 0x44, 0xc9, 0x32, 0x7d, 0x03, 0x58, 0x97, 0x8f, 0x4b, 0xf8, 0x65, 0xaf, 0xba, 0x05, 0xad, 0xe4, 0x09, 0xf1, 0x93, 0x3a,
0xdb, 0x0d, 0x68, 0xca, 0x87, 0xc4, 0x0f, 0x6b, 0xf7, 0x37, 0x72, 0xd2, 0xe4, 0x05, 0x23, 0x41, 0xbb, 0xeb, 0x05, 0x39, 0xc9, 0x05, 0x2b, 0x45, 0xe1, 0x6d, 0x58, 0x1b, 0x12, 0x2d, 0x48, 0x5b,
0xe1, 0x5d, 0x58, 0x1f, 0x12, 0x25, 0x48, 0xd9, 0xbe, 0xf0, 0x6a, 0xfc, 0x31, 0x6c, 0x1e, 0x12, 0xbd, 0xf4, 0x5e, 0x7c, 0x13, 0x36, 0xf6, 0x89, 0xcd, 0x9c, 0x49, 0xa6, 0x30, 0x06, 0xae, 0x43,
0x93, 0x5a, 0x93, 0x54, 0x61, 0x0c, 0xdc, 0x80, 0xfa, 0x9b, 0x88, 0xd0, 0x99, 0xc4, 0xc6, 0x0b, 0xe3, 0x30, 0x22, 0x6c, 0x9a, 0x60, 0xe3, 0x05, 0x7e, 0x00, 0x67, 0xcb, 0xf0, 0x84, 0xdf, 0x0e,
0xfc, 0x00, 0xce, 0x17, 0xe1, 0x92, 0xdf, 0x3e, 0x34, 0x28, 0x09, 0xa3, 0xe9, 0x29, 0xf4, 0x14, 0x34, 0x19, 0xe1, 0xd1, 0xc1, 0x09, 0xf4, 0x34, 0x08, 0x07, 0xb0, 0x32, 0x24, 0xe2, 0x9b, 0x88,
0x08, 0x7b, 0xb0, 0x3a, 0x24, 0xec, 0xeb, 0xc8, 0x67, 0x44, 0xa9, 0xdc, 0x87, 0x86, 0x69, 0xdb, 0x0a, 0xa2, 0x55, 0xee, 0x40, 0xd3, 0x76, 0x5d, 0x46, 0x38, 0x57, 0x4a, 0xcb, 0x22, 0xee, 0xc5,
0x94, 0x84, 0xa1, 0x50, 0x5a, 0x14, 0x71, 0x2f, 0x3e, 0x33, 0x14, 0xe8, 0xfd, 0x62, 0x73, 0x08, 0x67, 0x96, 0x06, 0xbd, 0x5f, 0x54, 0xde, 0x83, 0xd5, 0x4c, 0x5f, 0xc2, 0xf9, 0x26, 0xb4, 0x1c,
0x6b, 0xa9, 0x3e, 0xc9, 0xf9, 0x16, 0x34, 0x2d, 0x3f, 0x64, 0xc2, 0x43, 0xda, 0x29, 0x1e, 0x6a, 0xca, 0x85, 0xf2, 0x8d, 0x51, 0xe9, 0x9b, 0xa6, 0xc4, 0x48, 0xd7, 0x50, 0x58, 0xdd, 0x9f, 0x78,
0x70, 0x24, 0x77, 0x90, 0x0f, 0x6b, 0x87, 0x13, 0x27, 0x78, 0x4c, 0x6d, 0x42, 0xff, 0x15, 0xe6, 0xe1, 0x63, 0xe6, 0x12, 0xf6, 0x9f, 0x70, 0xfe, 0x0c, 0xd6, 0x72, 0x0a, 0xb3, 0xf0, 0x16, 0xcc,
0x9f, 0xc0, 0x7a, 0x46, 0x61, 0x1a, 0xea, 0x8c, 0x9a, 0xd6, 0x6b, 0xc7, 0x7b, 0x95, 0xe6, 0x11, 0x76, 0xde, 0x78, 0xc1, 0xeb, 0x2c, 0x77, 0x40, 0x6f, 0x8d, 0x5c, 0xfc, 0xab, 0x01, 0xcd, 0x44,
0xa8, 0xad, 0x91, 0x8d, 0x7f, 0xd5, 0xa0, 0x21, 0xf5, 0xa2, 0x3d, 0x58, 0x0b, 0x19, 0x25, 0x84, 0x2f, 0xba, 0x0c, 0x3d, 0x2e, 0x18, 0x21, 0x62, 0x9c, 0x67, 0xd9, 0xb6, 0xba, 0xf1, 0xae, 0x86,
0x8d, 0x25, 0x81, 0xf1, 0x4d, 0x79, 0xa3, 0x1b, 0xef, 0x4b, 0xe0, 0xcd, 0x12, 0x64, 0x5f, 0x26, 0x21, 0xa8, 0x3b, 0xba, 0x8c, 0xb5, 0x2d, 0xf5, 0x2d, 0x03, 0x80, 0x0b, 0x5b, 0x90, 0x24, 0xde,
0x44, 0x1e, 0xd9, 0xe7, 0xe9, 0x62, 0xf1, 0xfa, 0x17, 0xe7, 0x84, 0xf8, 0xcd, 0x93, 0xc1, 0xe2, 0xe3, 0x85, 0x8c, 0x74, 0x87, 0x46, 0x81, 0x60, 0x53, 0x1d, 0xe9, 0xc9, 0x12, 0x9d, 0x83, 0xd6,
0xc6, 0xa2, 0x33, 0x95, 0x0c, 0x72, 0x89, 0x2e, 0x40, 0xf3, 0xad, 0x13, 0x8c, 0x2d, 0xdf, 0x26, 0x5b, 0x2f, 0x1c, 0x3b, 0xd4, 0x25, 0x2a, 0xd0, 0x1b, 0x56, 0xf3, 0xad, 0x17, 0x0e, 0xa8, 0x4b,
0x22, 0x17, 0xea, 0x46, 0xe3, 0xad, 0x13, 0x0c, 0x7c, 0x9b, 0xe0, 0x21, 0xb4, 0x33, 0x76, 0xe6, 0xf0, 0x73, 0x68, 0x28, 0x53, 0xa2, 0x6d, 0xe8, 0x3a, 0x11, 0x63, 0x24, 0x70, 0xa6, 0x31, 0x30,
0x32, 0x6c, 0x62, 0x39, 0xae, 0x39, 0x15, 0x14, 0x3b, 0x86, 0x5a, 0xa2, 0x6d, 0x80, 0x23, 0x6a, 0x66, 0xb3, 0xac, 0x37, 0x25, 0x5a, 0x2a, 0x8e, 0x02, 0x4f, 0x70, 0xc5, 0x66, 0xd1, 0x8a, 0x17,
0x5a, 0x3c, 0xed, 0xcc, 0xa9, 0x60, 0xd5, 0x31, 0x32, 0x3b, 0xf8, 0x05, 0xd4, 0x85, 0x20, 0xb4, 0x72, 0x37, 0xb0, 0x03, 0xca, 0x15, 0x9d, 0x86, 0x15, 0x2f, 0xf0, 0x10, 0x2e, 0x0e, 0x89, 0xd8,
0x0b, 0x1d, 0x2b, 0xa2, 0x94, 0x78, 0xd6, 0x2c, 0xd6, 0x18, 0xbf, 0x75, 0x45, 0x6d, 0x72, 0xb5, 0x8f, 0xc2, 0x90, 0x32, 0x41, 0xdc, 0x41, 0x2c, 0xc7, 0x23, 0x59, 0x5c, 0x5e, 0x86, 0x5e, 0x41,
0xe8, 0x06, 0x2c, 0x9b, 0x42, 0xa3, 0x2c, 0xbf, 0xd5, 0x9e, 0x97, 0x38, 0x3c, 0x84, 0xed, 0x21, 0xa5, 0x2e, 0x08, 0xdd, 0xbc, 0x4e, 0x8e, 0xbf, 0x87, 0x73, 0x83, 0x74, 0x23, 0x38, 0x22, 0x8c,
0x61, 0x87, 0x51, 0x10, 0xf8, 0x94, 0x11, 0x7b, 0x10, 0x4b, 0x73, 0x48, 0x9a, 0x03, 0x1f, 0x40, 0x7b, 0x34, 0xd0, 0x4e, 0xbe, 0x02, 0xf5, 0x57, 0x8c, 0xfa, 0xc7, 0xc4, 0x88, 0x3a, 0x97, 0x25,
0x37, 0xa7, 0x58, 0x95, 0xa0, 0x4e, 0x56, 0x73, 0x88, 0xbf, 0x87, 0x0b, 0x83, 0x64, 0xc3, 0x3b, 0x4d, 0xd0, 0xf8, 0x61, 0xb1, 0x25, 0x97, 0x04, 0x55, 0x06, 0xf8, 0xc7, 0x80, 0xde, 0x80, 0x11,
0x26, 0x34, 0x74, 0x7c, 0x4f, 0x85, 0xd2, 0x15, 0x58, 0x3a, 0xa2, 0xbe, 0x2b, 0xe3, 0x08, 0xcd, 0xd7, 0x93, 0xf5, 0xd8, 0x1d, 0x05, 0xaf, 0x28, 0xba, 0x01, 0xc8, 0x51, 0x3b, 0x63, 0xc7, 0x66,
0xb3, 0x32, 0xc4, 0x39, 0x2f, 0xa2, 0xcc, 0x8f, 0x9f, 0x17, 0x3b, 0x68, 0x99, 0xf9, 0xc2, 0x9e, 0xee, 0x38, 0x88, 0xfc, 0x97, 0x84, 0x25, 0xf6, 0x58, 0x75, 0x52, 0xec, 0xd7, 0x6a, 0x1f, 0x5d,
0x7f, 0x6b, 0xd0, 0x1d, 0x50, 0x62, 0x3b, 0xbc, 0x03, 0xd8, 0x23, 0xef, 0xc8, 0x47, 0xd7, 0x01, 0x81, 0x95, 0x3c, 0xda, 0x39, 0x3a, 0x4a, 0x5a, 0x4e, 0x37, 0x83, 0x0e, 0x8e, 0x8e, 0xd0, 0x17,
0x59, 0x62, 0x67, 0x6c, 0x99, 0xd4, 0x1e, 0x7b, 0x91, 0xfb, 0x92, 0x50, 0x69, 0x95, 0x35, 0x2b, 0xb0, 0x99, 0xc7, 0x91, 0x9f, 0x42, 0x8f, 0xa9, 0xf2, 0x38, 0x9e, 0x12, 0x9b, 0x25, 0xb6, 0xeb,
0xc1, 0x7e, 0x25, 0xf6, 0xd1, 0x15, 0x58, 0xcd, 0xa2, 0xad, 0xe3, 0x63, 0xd9, 0xe4, 0x3a, 0x29, 0x67, 0x77, 0xf6, 0x52, 0xc0, 0x77, 0xc4, 0x66, 0xe8, 0x2e, 0x9c, 0xaf, 0xb8, 0xee, 0xd3, 0x40,
0x74, 0x70, 0x7c, 0x8c, 0x3e, 0x87, 0xad, 0x2c, 0x8e, 0xfc, 0x18, 0x38, 0x54, 0x14, 0xe4, 0xf1, 0x4c, 0x94, 0xcb, 0x1b, 0xd6, 0xb9, 0x79, 0xf7, 0x1f, 0x49, 0x00, 0x9e, 0x42, 0x77, 0x30, 0xb1,
0x8c, 0x98, 0x54, 0x04, 0x46, 0xdd, 0xe8, 0xa5, 0x77, 0x0e, 0x12, 0xc0, 0x77, 0xc4, 0xa4, 0xe8, 0xd9, 0xeb, 0x34, 0xa7, 0x3f, 0x86, 0x25, 0xdb, 0x97, 0x11, 0x72, 0x8c, 0xf1, 0x12, 0x04, 0xba,
0x2e, 0x5c, 0xac, 0xb8, 0xee, 0xfa, 0x1e, 0x9b, 0x88, 0x08, 0xaa, 0x1b, 0x17, 0xca, 0xee, 0x3f, 0x03, 0x9d, 0x9c, 0xf6, 0xa4, 0x21, 0x6e, 0x16, 0x33, 0xa4, 0x60, 0x44, 0x0b, 0x32, 0x26, 0xf8,
0xe2, 0x00, 0x3c, 0x83, 0xce, 0x60, 0x62, 0xd2, 0x57, 0x49, 0xfd, 0xf8, 0x28, 0x71, 0x69, 0xb5, 0x36, 0xf4, 0xb4, 0xea, 0xcc, 0xf5, 0x82, 0xd9, 0x01, 0xb7, 0x1d, 0xf5, 0x84, 0x34, 0x59, 0xba,
0xf1, 0x24, 0x02, 0xdd, 0x81, 0x76, 0x46, 0xbb, 0x8c, 0x81, 0xad, 0x7c, 0x1e, 0xe6, 0x8c, 0x68, 0xb9, 0xdd, 0x91, 0x8b, 0x7f, 0x80, 0xb6, 0xca, 0x30, 0xd5, 0xf3, 0x75, 0x37, 0x36, 0x4e, 0xec,
0x40, 0xca, 0x04, 0xdf, 0x86, 0xae, 0x52, 0x9d, 0xba, 0x9e, 0x51, 0xd3, 0x0b, 0xe3, 0x68, 0x4c, 0xc6, 0x32, 0x2a, 0x64, 0x65, 0x48, 0x78, 0xce, 0x8d, 0x0a, 0x79, 0x8e, 0xdf, 0xd5, 0xa0, 0xa3,
0x53, 0xb2, 0x93, 0xd9, 0x1d, 0xd9, 0xf8, 0x05, 0xb4, 0x44, 0x1e, 0x8b, 0x29, 0x43, 0xf5, 0x7f, 0x53, 0x38, 0x3a, 0x10, 0x32, 0x51, 0xa8, 0x5c, 0x66, 0x84, 0x9a, 0x6a, 0x3d, 0x72, 0xd1, 0x2d,
0xed, 0xd4, 0xfe, 0xcf, 0xa3, 0x82, 0xd7, 0x1f, 0xc9, 0xb3, 0x34, 0x2a, 0xf8, 0x39, 0x7e, 0x57, 0x58, 0xe7, 0x13, 0x2f, 0x0c, 0x65, 0x6e, 0xe7, 0x93, 0x3c, 0x8e, 0x26, 0xa4, 0xcf, 0x9e, 0xa6,
0x83, 0xb6, 0x2a, 0x14, 0xd1, 0x94, 0xf1, 0xbc, 0xf3, 0xf9, 0x32, 0x25, 0xd4, 0x10, 0xeb, 0x91, 0xc9, 0x8e, 0x6e, 0x43, 0x37, 0xbd, 0xa1, 0xd8, 0x2c, 0x56, 0xb2, 0x59, 0xd6, 0xc0, 0x01, 0xe5,
0x8d, 0x6e, 0xc0, 0x46, 0x38, 0x71, 0x82, 0x80, 0x57, 0x90, 0x6c, 0x29, 0x89, 0xa3, 0x09, 0xa9, 0x02, 0xdd, 0x85, 0xd5, 0xf4, 0xa2, 0xae, 0x0d, 0xf5, 0x63, 0x2a, 0xd8, 0x8a, 0x46, 0xeb, 0x9a,
0xb3, 0xa7, 0x49, 0x49, 0x41, 0xb7, 0xa1, 0x93, 0xdc, 0x10, 0x6c, 0x16, 0x2b, 0xd9, 0xac, 0x28, 0x71, 0x43, 0x57, 0xb2, 0x86, 0xaa, 0x64, 0x67, 0x0b, 0xb7, 0x52, 0x83, 0xea, 0x52, 0xe6, 0xc2,
0xe0, 0xc0, 0x0f, 0x19, 0xba, 0x0b, 0x6b, 0xc9, 0x45, 0x55, 0x27, 0x97, 0x4e, 0xa8, 0x93, 0xab, 0xf9, 0x7d, 0x12, 0xb8, 0x6a, 0x7f, 0x40, 0x83, 0x57, 0x1e, 0xf3, 0x55, 0xd8, 0xe4, 0xda, 0x0d,
0x0a, 0xad, 0x0a, 0xd8, 0x75, 0x55, 0x2f, 0xeb, 0xa2, 0x5e, 0x9e, 0xcf, 0xdd, 0x4a, 0x0c, 0xaa, 0xf1, 0x6d, 0xef, 0x40, 0xb7, 0x1b, 0xb5, 0x40, 0x3b, 0xd0, 0x50, 0xa6, 0x49, 0x6c, 0xdc, 0x9f,
0x0a, 0xa6, 0x0d, 0x17, 0x0f, 0x89, 0x67, 0x8b, 0xfd, 0x81, 0xef, 0x1d, 0x39, 0xd4, 0x15, 0x61, 0xd5, 0x11, 0xdb, 0xd4, 0x8a, 0x61, 0xf8, 0x9d, 0x01, 0x68, 0xc0, 0x88, 0x2d, 0x48, 0xa1, 0x48,
0x93, 0x69, 0x6d, 0xc4, 0x35, 0x9d, 0xa9, 0x6a, 0x6d, 0x62, 0x81, 0xf6, 0xa1, 0x2e, 0x4c, 0x53, 0x57, 0x8e, 0x1a, 0xdb, 0xd0, 0x55, 0x07, 0xba, 0x16, 0x24, 0x86, 0x5e, 0x96, 0x9b, 0xba, 0x1c,
0x5a, 0x0f, 0x32, 0x36, 0x35, 0x62, 0x18, 0x7e, 0xa7, 0x01, 0x1a, 0x50, 0x62, 0x32, 0x92, 0x6b, 0xe4, 0x4b, 0xfc, 0xe2, 0x29, 0x4a, 0x3c, 0xfe, 0x19, 0xce, 0x14, 0x38, 0x24, 0xd1, 0x98, 0xda,
0x05, 0x95, 0xc3, 0xcd, 0x2e, 0x74, 0xc4, 0x81, 0xaa, 0x05, 0xd2, 0xd0, 0x2b, 0x7c, 0x53, 0x95, 0xcb, 0x38, 0x85, 0xbd, 0x66, 0xfd, 0x5a, 0x3b, 0x9d, 0x5f, 0xf1, 0xdf, 0x06, 0xac, 0x3d, 0x39,
0x83, 0x6c, 0x23, 0x59, 0x3c, 0x43, 0x23, 0xc1, 0x3f, 0xc1, 0xb9, 0x1c, 0x07, 0x19, 0x8d, 0x89, 0xb0, 0x9d, 0xff, 0xd1, 0x02, 0x99, 0x33, 0x1b, 0x79, 0x67, 0x96, 0xd2, 0x7b, 0xe9, 0xfd, 0xd2,
0xbd, 0xb4, 0x33, 0xd8, 0x6b, 0xde, 0xaf, 0xb5, 0xb3, 0xf9, 0x15, 0xff, 0xa5, 0xc1, 0xfa, 0x93, 0xfb, 0x3e, 0xa0, 0xfc, 0xb3, 0xd2, 0xa9, 0x23, 0x09, 0x10, 0xe3, 0x54, 0x01, 0xb2, 0xfb, 0x97,
0xa9, 0x69, 0xfd, 0x87, 0x16, 0x48, 0x9d, 0x59, 0xcf, 0x3a, 0xb3, 0x90, 0xde, 0xcb, 0xef, 0x97, 0x01, 0x1d, 0x99, 0xc6, 0xfb, 0x84, 0x1d, 0x79, 0x0e, 0x41, 0x77, 0x54, 0xab, 0x54, 0x99, 0xbf,
0xde, 0xf7, 0x01, 0x65, 0x9f, 0x95, 0x4c, 0x38, 0x32, 0x40, 0xb4, 0x33, 0x05, 0x48, 0xff, 0x4f, 0x59, 0x7e, 0x53, 0x6e, 0x7a, 0x37, 0x8b, 0x76, 0x8f, 0xc7, 0xdb, 0x05, 0xf4, 0x39, 0x34, 0x93,
0x0d, 0xda, 0x3c, 0x8d, 0x0f, 0x09, 0x3d, 0x76, 0x2c, 0x82, 0xee, 0x88, 0x86, 0x2c, 0x32, 0x7f, 0x11, 0xbb, 0x74, 0xbb, 0x38, 0x78, 0x9b, 0x6b, 0x33, 0x65, 0x04, 0x2f, 0xa0, 0xaf, 0xa0, 0x9d,
0xab, 0xf8, 0xa6, 0xcc, 0xf7, 0x82, 0x9e, 0xb7, 0x7b, 0x3c, 0x50, 0x2f, 0xa0, 0xcf, 0xa0, 0x21, 0x0e, 0xf3, 0xe8, 0xc2, 0xac, 0xfc, 0xbc, 0x80, 0xb9, 0xea, 0x77, 0x7f, 0x31, 0x60, 0xa3, 0x38,
0x87, 0xfa, 0xc2, 0xed, 0xfc, 0xa8, 0xaf, 0xaf, 0xcf, 0x95, 0x11, 0xbc, 0x80, 0xbe, 0x84, 0x56, 0x04, 0xeb, 0x67, 0xfd, 0x08, 0x67, 0xe6, 0x4c, 0xc8, 0xe8, 0xa3, 0x82, 0x98, 0xea, 0xd9, 0xdc,
0xf2, 0xf9, 0x80, 0x2e, 0xcd, 0xcb, 0xcf, 0x0a, 0x28, 0x55, 0xdf, 0xff, 0x59, 0x83, 0xcd, 0xfc, 0xbc, 0x7a, 0x32, 0x30, 0x76, 0x80, 0x64, 0x51, 0x83, 0x8d, 0x64, 0xba, 0x1b, 0xd8, 0xc2, 0x3e,
0xd8, 0xad, 0x9e, 0xf5, 0x03, 0x9c, 0x2b, 0x99, 0xc9, 0xd1, 0x87, 0x39, 0x31, 0xd5, 0x5f, 0x03, 0xa0, 0xaf, 0x35, 0x8b, 0x21, 0x2c, 0xe7, 0x47, 0x59, 0x34, 0xe7, 0x15, 0xe6, 0x87, 0x33, 0x9a,
0xfa, 0xde, 0xe9, 0xc0, 0xd8, 0x01, 0x9c, 0x45, 0x0d, 0x36, 0xe5, 0x24, 0x39, 0x30, 0x99, 0x39, 0xca, 0x93, 0x25, 0x5e, 0x40, 0xf7, 0x01, 0xb2, 0x49, 0x16, 0x5d, 0x2c, 0x9b, 0xba, 0x38, 0xe2,
0xf5, 0x5f, 0x29, 0x16, 0x43, 0x58, 0xc9, 0x8e, 0xcd, 0xa8, 0xe4, 0x15, 0xfa, 0xff, 0xe7, 0x34, 0x9a, 0x73, 0x07, 0x4f, 0xbc, 0x80, 0x5e, 0x40, 0xaf, 0x38, 0xbb, 0x22, 0x5c, 0x40, 0xce, 0x9d,
0x15, 0xa7, 0x58, 0xbc, 0x80, 0xee, 0x03, 0xa4, 0x53, 0x33, 0xda, 0x2e, 0x9a, 0x3a, 0x3f, 0x4e, 0x83, 0xcd, 0xed, 0x63, 0x31, 0xa9, 0x15, 0x7e, 0x37, 0x60, 0x65, 0x3f, 0xc9, 0x43, 0xfd, 0xfe,
0xeb, 0xa5, 0x43, 0x2e, 0x5e, 0x40, 0xcf, 0xa1, 0x9b, 0x9f, 0x93, 0x11, 0xce, 0x21, 0x4b, 0x67, 0x11, 0xb4, 0xf4, 0xc8, 0x89, 0xce, 0x97, 0x49, 0xe7, 0x27, 0x5f, 0xf3, 0x42, 0xc5, 0x69, 0x6a,
0x6e, 0x7d, 0xf7, 0x44, 0x4c, 0x62, 0x85, 0xdf, 0x34, 0x58, 0x3d, 0x94, 0x79, 0xa8, 0xde, 0x3f, 0x81, 0x87, 0xd0, 0x4e, 0x27, 0xc1, 0x52, 0xb0, 0x94, 0x47, 0x52, 0xf3, 0x62, 0xd5, 0x71, 0x4a,
0x82, 0xa6, 0x1a, 0x6f, 0xd1, 0xc5, 0x22, 0xe9, 0xec, 0x94, 0xad, 0x5f, 0xaa, 0x38, 0x4d, 0x2c, 0xf6, 0x4f, 0x03, 0x56, 0x74, 0x72, 0x6b, 0xb2, 0x2f, 0xe0, 0xec, 0xfc, 0x49, 0x6a, 0xae, 0xdb,
0xf0, 0x10, 0x5a, 0xc9, 0xbc, 0x59, 0x08, 0x96, 0xe2, 0xe0, 0xab, 0x6f, 0x57, 0x1d, 0x27, 0x64, 0xae, 0x97, 0x09, 0x1f, 0x33, 0x82, 0xe1, 0x05, 0x34, 0x84, 0x66, 0x3c, 0x55, 0x09, 0x74, 0xa5,
0xff, 0xd0, 0x60, 0x55, 0x25, 0xb7, 0x22, 0xfb, 0x1c, 0xce, 0x97, 0x4f, 0x52, 0xa5, 0x6e, 0xbb, 0x98, 0x0b, 0x55, 0x33, 0x97, 0x39, 0xa7, 0xd2, 0xe1, 0x85, 0xdd, 0x67, 0xd0, 0x7b, 0x62, 0x4f,
0x56, 0x24, 0x7c, 0xc2, 0x08, 0x86, 0x17, 0xd0, 0x10, 0x1a, 0xf1, 0x54, 0xc5, 0xd0, 0x95, 0x7c, 0x7d, 0x12, 0xa4, 0x19, 0x3c, 0x80, 0xa5, 0xb8, 0xed, 0x23, 0xb3, 0x28, 0x39, 0x3f, 0x86, 0x98,
0x2e, 0x54, 0xcd, 0x5c, 0x7a, 0x49, 0xa5, 0xc3, 0x0b, 0xfd, 0x67, 0xd0, 0x7d, 0x62, 0xce, 0x5c, 0x9b, 0x73, 0xcf, 0x52, 0x83, 0x4c, 0x60, 0x79, 0x4f, 0xd6, 0x28, 0x2d, 0xf4, 0xb9, 0xfc, 0x55,
0xe2, 0x25, 0x19, 0x3c, 0x80, 0xe5, 0xb8, 0xed, 0x23, 0x3d, 0x2f, 0x39, 0x3b, 0x86, 0xe8, 0x5b, 0x34, 0xa7, 0x5b, 0xa1, 0x6b, 0xa5, 0x68, 0xa8, 0xee, 0x68, 0x15, 0x39, 0xfb, 0x87, 0x34, 0xfd,
0xa5, 0x67, 0x89, 0x41, 0x26, 0xb0, 0x72, 0xc0, 0x6b, 0x94, 0x12, 0xfa, 0x2d, 0xff, 0x02, 0x2b, 0x84, 0x38, 0x6f, 0x68, 0x94, 0x3e, 0xc1, 0x82, 0x4e, 0xae, 0x61, 0xa0, 0x4b, 0xe5, 0x92, 0x58,
0xe9, 0x56, 0xe8, 0x6a, 0x21, 0x1a, 0xaa, 0x3b, 0x5a, 0x45, 0xce, 0xfe, 0xce, 0x4d, 0x3f, 0x21, 0x6a, 0x67, 0xe6, 0x56, 0x35, 0x20, 0xb5, 0xf8, 0x63, 0x80, 0xac, 0x5c, 0x96, 0x52, 0x66, 0xa6,
0xd6, 0x6b, 0x3f, 0x4a, 0x9e, 0x60, 0x40, 0x3b, 0xd3, 0x30, 0xd0, 0xe5, 0x62, 0x49, 0x2c, 0xb4, 0x3d, 0x98, 0x97, 0x2a, 0xcf, 0xb5, 0xc0, 0x97, 0x4b, 0xea, 0xcf, 0x92, 0x4f, 0xff, 0x0d, 0x00,
0x33, 0x7d, 0xa7, 0x1a, 0x90, 0x58, 0xfc, 0x31, 0x40, 0x5a, 0x2e, 0x0b, 0x29, 0x33, 0xd7, 0x1e, 0x00, 0xff, 0xff, 0x1d, 0x9c, 0xae, 0xb8, 0x3a, 0x11, 0x00, 0x00,
0xf4, 0xcb, 0x95, 0xe7, 0x4a, 0xe0, 0xcb, 0x65, 0xf1, 0xf7, 0xcc, 0xad, 0x7f, 0x02, 0x00, 0x00,
0xff, 0xff, 0xdd, 0xe8, 0xfb, 0x77, 0xac, 0x11, 0x00, 0x00,
} }

View file

@ -12,7 +12,8 @@ import (
"google.golang.org/grpc/codes" "google.golang.org/grpc/codes"
"google.golang.org/grpc/status" "google.golang.org/grpc/status"
pb "./genproto" pb "checkoutservice/genproto"
money "checkoutservice/money"
) )
const ( const (
@ -67,16 +68,13 @@ func (cs *checkoutService) CreateOrder(ctx context.Context, req *pb.CreateOrderR
log.Printf("[CreateOrder] user_id=%q user_currency=%q", req.UserId, req.UserCurrency) log.Printf("[CreateOrder] user_id=%q user_currency=%q", req.UserId, req.UserCurrency)
resp := new(pb.CreateOrderResponse) resp := new(pb.CreateOrderResponse)
shippingQuoteUSD, err := cs.quoteShipping(ctx, req.Address, nil) // TODO(ahmetb): query CartService for items prep, err := cs.prepareOrderItemsAndShippingQuoteFromCart(ctx, req.UserId, req.UserCurrency, req.Address)
if err != nil { if err != nil {
return nil, status.Errorf(codes.Internal, "shipping quote failure: %+v", err) return nil, status.Errorf(codes.Internal, err.Error())
} }
resp.ShippingCost = &pb.Money{
Amount: shippingQuoteUSD, resp.Items = prep.orderItems
CurrencyCode: "USD", resp.ShippingCost = prep.shippingCostLocalized
}
// TODO(ahmetb) convert to req.UserCurrency
// TODO(ahmetb) calculate resp.OrderItem with req.UserCurrency
return resp, nil return resp, nil
} }
@ -88,40 +86,26 @@ func (cs *checkoutService) PlaceOrder(ctx context.Context, req *pb.PlaceOrderReq
return nil, status.Errorf(codes.Internal, "failed to generate order uuid") return nil, status.Errorf(codes.Internal, "failed to generate order uuid")
} }
cartItems, err := cs.getUserCart(ctx, req.UserId) prep, err := cs.prepareOrderItemsAndShippingQuoteFromCart(ctx, req.UserId, req.UserCurrency, req.Address)
if err != nil { if err != nil {
return nil, status.Errorf(codes.Internal, "cart failure: %+v", err) return nil, status.Errorf(codes.Internal, err.Error())
} }
orderItems, err := cs.prepOrderItems(ctx, cartItems, req.UserCurrency) total := pb.Money{CurrencyCode: req.UserCurrency,
if err != nil { Units: 0,
return nil, status.Errorf(codes.Internal, "failed to prepare order: %+v", err) Nanos: 0}
total = money.Must(money.Sum(total, *prep.shippingCostLocalized))
for _, it := range prep.orderItems {
total = money.Must(money.Sum(total, *it.Cost))
} }
shippingUsd, err := cs.quoteShipping(ctx, req.Address, cartItems) // TODO(ahmetb): query CartService for items txID, err := cs.chargeCard(ctx, &total, req.CreditCard)
if err != nil {
return nil, status.Errorf(codes.Internal, "shipping quote failure: %+v", err)
}
shippingPrice, err := cs.convertCurrency(ctx, &pb.Money{
Amount: shippingUsd,
CurrencyCode: usdCurrency}, req.UserCurrency)
if err != nil {
return nil, status.Errorf(codes.Internal, "failed to convert shipping cost to currency: %+v", err)
}
var totalPrice pb.Money
totalPrice = sumMoney(totalPrice, *shippingPrice)
for _, it := range orderItems {
totalPrice = sumMoney(totalPrice, *it.Cost)
}
txID, err := cs.chargeCard(ctx, &totalPrice, req.CreditCard)
if err != nil { if err != nil {
return nil, status.Errorf(codes.Internal, "failed to charge card: %+v", err) return nil, status.Errorf(codes.Internal, "failed to charge card: %+v", err)
} }
log.Printf("payment went through (transaction_id: %s)", txID) log.Printf("payment went through (transaction_id: %s)", txID)
shippingTrackingID, err := cs.shipOrder(ctx, req.Address, cartItems) shippingTrackingID, err := cs.shipOrder(ctx, req.Address, prep.cartItems)
if err != nil { if err != nil {
return nil, status.Errorf(codes.Unavailable, "shipping error: %+v", err) return nil, status.Errorf(codes.Unavailable, "shipping error: %+v", err)
} }
@ -129,9 +113,9 @@ func (cs *checkoutService) PlaceOrder(ctx context.Context, req *pb.PlaceOrderReq
orderResult := &pb.OrderResult{ orderResult := &pb.OrderResult{
OrderId: orderID.String(), OrderId: orderID.String(),
ShippingTrackingId: shippingTrackingID, ShippingTrackingId: shippingTrackingID,
ShippingCost: shippingPrice, ShippingCost: prep.shippingCostLocalized,
ShippingAddress: req.Address, ShippingAddress: req.Address,
Items: orderItems, Items: prep.orderItems,
} }
if err := cs.sendOrderConfirmation(ctx, req.Email, orderResult); err != nil { if err := cs.sendOrderConfirmation(ctx, req.Email, orderResult); err != nil {
@ -143,7 +127,38 @@ func (cs *checkoutService) PlaceOrder(ctx context.Context, req *pb.PlaceOrderReq
return resp, nil return resp, nil
} }
func (cs *checkoutService) quoteShipping(ctx context.Context, address *pb.Address, items []*pb.CartItem) (*pb.MoneyAmount, error) { type orderPrep struct {
orderItems []*pb.OrderItem
cartItems []*pb.CartItem
shippingCostLocalized *pb.Money
}
func (cs *checkoutService) prepareOrderItemsAndShippingQuoteFromCart(ctx context.Context, userID, userCurrency string, address *pb.Address) (orderPrep, error) {
var out orderPrep
cartItems, err := cs.getUserCart(ctx, userID)
if err != nil {
return out, fmt.Errorf("cart failure: %+v", err)
}
orderItems, err := cs.prepOrderItems(ctx, cartItems, userCurrency)
if err != nil {
return out, fmt.Errorf("failed to prepare order: %+v", err)
}
shippingUSD, err := cs.quoteShipping(ctx, address, cartItems)
if err != nil {
return out, fmt.Errorf("shipping quote failure: %+v", err)
}
shippingPrice, err := cs.convertCurrency(ctx, shippingUSD, userCurrency)
if err != nil {
return out, fmt.Errorf("failed to convert shipping cost to currency: %+v", err)
}
out.shippingCostLocalized = shippingPrice
out.cartItems = cartItems
out.orderItems = orderItems
return out, nil
}
func (cs *checkoutService) quoteShipping(ctx context.Context, address *pb.Address, items []*pb.CartItem) (*pb.Money, error) {
conn, err := grpc.DialContext(ctx, cs.shippingSvcAddr, grpc.WithInsecure()) conn, err := grpc.DialContext(ctx, cs.shippingSvcAddr, grpc.WithInsecure())
if err != nil { if err != nil {
return nil, fmt.Errorf("could not connect shipping service: %+v", err) return nil, fmt.Errorf("could not connect shipping service: %+v", err)
@ -189,10 +204,7 @@ func (cs *checkoutService) prepOrderItems(ctx context.Context, items []*pb.CartI
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to get product #%q", item.GetProductId()) return nil, fmt.Errorf("failed to get product #%q", item.GetProductId())
} }
usdPrice := &pb.Money{ price, err := cs.convertCurrency(ctx, product.GetPriceUsd(), userCurrency)
Amount: product.GetPriceUsd(),
CurrencyCode: usdCurrency}
price, err := cs.convertCurrency(ctx, usdPrice, userCurrency)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to convert price of %q to %s", item.GetProductId(), userCurrency) return nil, fmt.Errorf("failed to convert price of %q to %s", item.GetProductId(), userCurrency)
} }

View file

@ -1,44 +0,0 @@
package main
import (
"math"
pb "./genproto"
)
func sum(m1, m2 pb.MoneyAmount) pb.MoneyAmount {
f1, f2 := float64(m1.Fractional), float64(m2.Fractional)
lg1 := math.Max(1, math.Ceil(math.Log10(f1)))
if f1 == math.Pow(10, lg1) {
lg1++
}
lg2 := math.Max(1, math.Ceil(math.Log10(f2)))
if f2 == math.Pow(10, lg2) {
lg2++
}
lgMax := math.Max(lg1, lg2)
dSum := m1.Decimal + m2.Decimal
o1 := f1 * math.Pow(10, lgMax-lg1)
o2 := f2 * math.Pow(10, lgMax-lg2)
fSum := o1 + o2
if fSum >= math.Pow(10, lgMax) {
fSum -= math.Pow(10, lgMax)
dSum++
}
for int(fSum)%10 == 0 && fSum != 0 {
fSum = float64(int(fSum) / 10)
}
return pb.MoneyAmount{
Decimal: dSum,
Fractional: uint32(fSum)}
}
func sumMoney(m1, m2 pb.Money) pb.Money {
s := sum(*m1.Amount, *m2.Amount)
return pb.Money{
Amount: &s,
CurrencyCode: m1.CurrencyCode}
}

View file

@ -0,0 +1,118 @@
package money
import (
"errors"
pb "checkoutservice/genproto"
)
const (
nanosMin = -999999999
nanosMax = +999999999
nanosMod = 1000000000
)
var (
ErrInvalidValue = errors.New("one of the specified money values is invalid")
ErrMismatchingCurrency = errors.New("mismatching currency codes")
)
// IsValid checks if specified value has a valid units/nanos signs and ranges.
func IsValid(m pb.Money) bool {
return signMatches(m) && validNanos(m.GetNanos())
}
func signMatches(m pb.Money) bool {
return m.GetNanos() == 0 || m.GetUnits() == 0 || (m.GetNanos() < 0) == (m.GetUnits() < 0)
}
func validNanos(nanos int32) bool { return nanosMin <= nanos && nanos <= nanosMax }
// IsZero returns true if the specified money value is equal to zero.
func IsZero(m pb.Money) bool { return m.GetUnits() == 0 && m.GetNanos() == 0 }
// IsPositive returns true if the specified money value is valid and is
// positive.
func IsPositive(m pb.Money) bool {
return IsValid(m) && m.GetUnits() > 0 || (m.GetUnits() == 0 && m.GetNanos() > 0)
}
// IsNegative returns true if the specified money value is valid and is
// negative.
func IsNegative(m pb.Money) bool {
return IsValid(m) && m.GetUnits() < 0 || (m.GetUnits() == 0 && m.GetNanos() < 0)
}
// AreSameCurrency returns true if values l and r have a currency code and
// they are the same values.
func AreSameCurrency(l, r pb.Money) bool {
return l.GetCurrencyCode() == r.GetCurrencyCode() && l.GetCurrencyCode() != ""
}
// AreEquals returns true if values l and r are the equal, including the
// currency. This does not check validity of the provided values.
func AreEquals(l, r pb.Money) bool {
return l.GetCurrencyCode() == r.GetCurrencyCode() &&
l.GetUnits() == r.GetUnits() && l.GetNanos() == r.GetNanos()
}
// Negate returns the same amount with the sign negated.
func Negate(m pb.Money) pb.Money {
return pb.Money{
Units: -m.GetUnits(),
Nanos: -m.GetNanos(),
CurrencyCode: m.GetCurrencyCode()}
}
// Must panics if the given error is not nil. This can be used with other
// functions like: "m := Must(Sum(a,b))".
func Must(v pb.Money, err error) pb.Money {
if err != nil {
panic(err)
}
return v
}
// Sum adds two values. Returns an error if one of the values are invalid or
// currency codes are not matching (unless currency code is unspecified for
// both).
func Sum(l, r pb.Money) (pb.Money, error) {
if !IsValid(l) || !IsValid(r) {
return pb.Money{}, ErrInvalidValue
} else if l.GetCurrencyCode() != r.GetCurrencyCode() {
return pb.Money{}, ErrMismatchingCurrency
}
units := l.GetUnits() + r.GetUnits()
nanos := l.GetNanos() + r.GetNanos()
if (units == 0 && nanos == 0) || (units > 0 && nanos >= 0) || (units < 0 && nanos <= 0) {
// same sign <units, nanos>
units += int64(nanos / nanosMod)
nanos = nanos % nanosMod
} else {
// different sign. nanos guaranteed to not to go over the limit
if units > 0 {
units--
nanos += nanosMod
} else {
units++
nanos -= nanosMod
}
}
return pb.Money{
Units: units,
Nanos: nanos,
CurrencyCode: l.GetCurrencyCode()}, nil
}
// MultiplySlow is a slow multiplication operation done through adding the value
// to itself n-1 times.
func MultiplySlow(m pb.Money, n uint32) pb.Money {
out := m
for n > 1 {
out = Must(Sum(out, m))
n--
}
return out
}

View file

@ -0,0 +1,231 @@
package money
import (
"fmt"
"reflect"
"testing"
pb "checkoutservice/genproto"
)
func mmc(u int64, n int32, c string) pb.Money { return pb.Money{Units: u, Nanos: n, CurrencyCode: c} }
func mm(u int64, n int32) pb.Money { return mmc(u, n, "") }
func TestIsValid(t *testing.T) {
tests := []struct {
name string
in pb.Money
want bool
}{
{"valid -/-", mm(-981273891273, -999999999), true},
{"invalid -/+", mm(-981273891273, +999999999), false},
{"valid +/+", mm(981273891273, 999999999), true},
{"invalid +/-", mm(981273891273, -999999999), false},
{"invalid +/+overflow", mm(3, 1000000000), false},
{"invalid +/-overflow", mm(3, -1000000000), false},
{"invalid -/+overflow", mm(-3, 1000000000), false},
{"invalid -/-overflow", mm(-3, -1000000000), false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := IsValid(tt.in); got != tt.want {
t.Errorf("IsValid(%v) = %v, want %v", tt.in, got, tt.want)
}
})
}
}
func TestIsZero(t *testing.T) {
tests := []struct {
name string
in pb.Money
want bool
}{
{"zero", mm(0, 0), true},
{"not-zero (-/+)", mm(-1, +1), false},
{"not-zero (-/-)", mm(-1, -1), false},
{"not-zero (+/+)", mm(+1, +1), false},
{"not-zero (+/-)", mm(+1, -1), false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := IsZero(tt.in); got != tt.want {
t.Errorf("IsZero(%v) = %v, want %v", tt.in, got, tt.want)
}
})
}
}
func TestIsPositive(t *testing.T) {
tests := []struct {
name string
in pb.Money
want bool
}{
{"zero", mm(0, 0), false},
{"positive (+/+)", mm(+1, +1), true},
{"invalid (-/+)", mm(-1, +1), false},
{"negative (-/-)", mm(-1, -1), false},
{"invalid (+/-)", mm(+1, -1), false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := IsPositive(tt.in); got != tt.want {
t.Errorf("IsPositive(%v) = %v, want %v", tt.in, got, tt.want)
}
})
}
}
func TestIsNegative(t *testing.T) {
tests := []struct {
name string
in pb.Money
want bool
}{
{"zero", mm(0, 0), false},
{"positive (+/+)", mm(+1, +1), false},
{"invalid (-/+)", mm(-1, +1), false},
{"negative (-/-)", mm(-1, -1), true},
{"invalid (+/-)", mm(+1, -1), false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := IsNegative(tt.in); got != tt.want {
t.Errorf("IsNegative(%v) = %v, want %v", tt.in, got, tt.want)
}
})
}
}
func TestAreSameCurrency(t *testing.T) {
type args struct {
l pb.Money
r pb.Money
}
tests := []struct {
name string
args args
want bool
}{
{"both empty currency", args{mmc(1, 0, ""), mmc(2, 0, "")}, false},
{"left empty currency", args{mmc(1, 0, ""), mmc(2, 0, "USD")}, false},
{"right empty currency", args{mmc(1, 0, "USD"), mmc(2, 0, "")}, false},
{"mismatching", args{mmc(1, 0, "USD"), mmc(2, 0, "CAD")}, false},
{"matching", args{mmc(1, 0, "USD"), mmc(2, 0, "USD")}, true},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := AreSameCurrency(tt.args.l, tt.args.r); got != tt.want {
t.Errorf("AreSameCurrency([%v],[%v]) = %v, want %v", tt.args.l, tt.args.r, got, tt.want)
}
})
}
}
func TestAreEquals(t *testing.T) {
type args struct {
l pb.Money
r pb.Money
}
tests := []struct {
name string
args args
want bool
}{
{"equals", args{mmc(1, 2, "USD"), mmc(1, 2, "USD")}, true},
{"mismatching currency", args{mmc(1, 2, "USD"), mmc(1, 2, "CAD")}, false},
{"mismatching units", args{mmc(10, 20, "USD"), mmc(1, 20, "USD")}, false},
{"mismatching nanos", args{mmc(1, 2, "USD"), mmc(1, 20, "USD")}, false},
{"negated", args{mmc(1, 2, "USD"), mmc(-1, -2, "USD")}, false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := AreEquals(tt.args.l, tt.args.r); got != tt.want {
t.Errorf("AreEquals([%v],[%v]) = %v, want %v", tt.args.l, tt.args.r, got, tt.want)
}
})
}
}
func TestNegate(t *testing.T) {
tests := []struct {
name string
in pb.Money
want pb.Money
}{
{"zero", mm(0, 0), mm(0, 0)},
{"negative", mm(-1, -200), mm(1, 200)},
{"positive", mm(1, 200), mm(-1, -200)},
{"carries currency code", mmc(0, 0, "XXX"), mmc(0, 0, "XXX")},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := Negate(tt.in); !AreEquals(got, tt.want) {
t.Errorf("Negate([%v]) = %v, want %v", tt.in, got, tt.want)
}
})
}
}
func TestMust_pass(t *testing.T) {
v := Must(mm(2, 3), nil)
if !AreEquals(v, mm(2, 3)) {
t.Errorf("returned the wrong value: %v", v)
}
}
func TestMust_panic(t *testing.T) {
defer func() {
if r := recover(); r != nil {
t.Logf("panic captured: %v", r)
}
}()
Must(mm(2, 3), fmt.Errorf("some error"))
t.Fatal("this should not have executed due to the panic above")
}
func TestSum(t *testing.T) {
type args struct {
l pb.Money
r pb.Money
}
tests := []struct {
name string
args args
want pb.Money
wantErr error
}{
{"0+0=0", args{mm(0, 0), mm(0, 0)}, mm(0, 0), nil},
{"Error: currency code on left", args{mmc(0, 0, "XXX"), mm(0, 0)}, mm(0, 0), ErrMismatchingCurrency},
{"Error: currency code on right", args{mm(0, 0), mmc(0, 0, "YYY")}, mm(0, 0), ErrMismatchingCurrency},
{"Error: currency code mismatch", args{mmc(0, 0, "AAA"), mmc(0, 0, "BBB")}, mm(0, 0), ErrMismatchingCurrency},
{"Error: invalid +/-", args{mm(+1, -1), mm(0, 0)}, mm(0, 0), ErrInvalidValue},
{"Error: invalid -/+", args{mm(0, 0), mm(-1, +2)}, mm(0, 0), ErrInvalidValue},
{"Error: invalid nanos", args{mm(0, 1000000000), mm(1, 0)}, mm(0, 0), ErrInvalidValue},
{"both positive (no carry)", args{mm(2, 200000000), mm(2, 200000000)}, mm(4, 400000000), nil},
{"both positive (nanos=max)", args{mm(2, 111111111), mm(2, 888888888)}, mm(4, 999999999), nil},
{"both positive (carry)", args{mm(2, 200000000), mm(2, 900000000)}, mm(5, 100000000), nil},
{"both negative (no carry)", args{mm(-2, -200000000), mm(-2, -200000000)}, mm(-4, -400000000), nil},
{"both negative (carry)", args{mm(-2, -200000000), mm(-2, -900000000)}, mm(-5, -100000000), nil},
{"mixed (larger positive, just decimals)", args{mm(11, 0), mm(-2, 0)}, mm(9, 0), nil},
{"mixed (larger negative, just decimals)", args{mm(-11, 0), mm(2, 0)}, mm(-9, 0), nil},
{"mixed (larger positive, no borrow)", args{mm(11, 100000000), mm(-2, -100000000)}, mm(9, 0), nil},
{"mixed (larger positive, with borrow)", args{mm(11, 100000000), mm(-2, -9000000 /*.09*/)}, mm(9, 91000000 /*.091*/), nil},
{"mixed (larger negative, no borrow)", args{mm(-11, -100000000), mm(2, 100000000)}, mm(-9, 0), nil},
{"mixed (larger negative, with borrow)", args{mm(-11, -100000000), mm(2, 9000000 /*.09*/)}, mm(-9, -91000000 /*.091*/), nil},
{"0+negative", args{mm(0, 0), mm(-2, -100000000)}, mm(-2, -100000000), nil},
{"negative+0", args{mm(-2, -100000000), mm(0, 0)}, mm(-2, -100000000), nil},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := Sum(tt.args.l, tt.args.r)
if err != tt.wantErr {
t.Errorf("Sum([%v],[%v]): expected err=\"%v\" got=\"%v\"", tt.args.l, tt.args.r, tt.wantErr, err)
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("Sum([%v],[%v]) = %v, want %v", tt.args.l, tt.args.r, got, tt.want)
}
})
}
}

View file

@ -1,53 +0,0 @@
package main
import (
"reflect"
"testing"
pb "./genproto"
)
func Test_sum(t *testing.T) {
type args struct {
m1 pb.MoneyAmount
m2 pb.MoneyAmount
}
tests := []struct {
name string
args args
want pb.MoneyAmount
}{
{
name: "no fractions",
args: args{pb.MoneyAmount{Decimal: 10}, pb.MoneyAmount{Decimal: 100}},
want: pb.MoneyAmount{Decimal: 110},
},
{
name: "same fraction digits",
args: args{pb.MoneyAmount{Decimal: 1, Fractional: 23}, pb.MoneyAmount{Decimal: 1, Fractional: 44}},
want: pb.MoneyAmount{Decimal: 2, Fractional: 67},
},
{
name: "different fraction digits",
args: args{pb.MoneyAmount{Decimal: 1, Fractional: 351}, pb.MoneyAmount{Decimal: 1, Fractional: 1}},
want: pb.MoneyAmount{Decimal: 2, Fractional: 451},
},
{
name: "redundant trailing zeroes are removed from fraction",
args: args{pb.MoneyAmount{Decimal: 1, Fractional: 351}, pb.MoneyAmount{Decimal: 1, Fractional: 349}},
want: pb.MoneyAmount{Decimal: 2, Fractional: 7},
},
{
name: "carry",
args: args{pb.MoneyAmount{Decimal: 1, Fractional: 5}, pb.MoneyAmount{Decimal: 1, Fractional: 5000000}},
want: pb.MoneyAmount{Decimal: 3},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := sum(tt.args.m1, tt.args.m2); !reflect.DeepEqual(got, tt.want) {
t.Errorf("sum(%v+%v) = %v, want=%v", tt.args.m1, tt.args.m2, got, tt.want)
}
})
}
}

View file

@ -18,6 +18,7 @@
const path = require('path'); const path = require('path');
const grpc = require('grpc'); const grpc = require('grpc');
const leftPad = require('left-pad');
const PROTO_PATH = path.join(__dirname, './proto/demo.proto'); const PROTO_PATH = path.join(__dirname, './proto/demo.proto');
const PORT = 31337; const PORT = 31337;
@ -28,17 +29,15 @@ const client = new shopProto.CurrencyService(`localhost:${PORT}`,
const request = { const request = {
from: { from: {
currency_code: 'USD', currency_code: 'CHF',
amount: { units: 300,
decimal: 300, nanos: 0
fractional: 0
}
}, },
to_code: 'CHF' to_code: 'EUR'
}; };
function _moneyToString (m) { function _moneyToString (m) {
return `${m.amount.decimal}.${m.amount.fractional} ${m.currency_code}`; return `${m.units}.${leftPad(m.nanos, 9, '0')} ${m.currency_code}`;
} }
client.getSupportedCurrencies({}, (err, response) => { client.getSupportedCurrencies({}, (err, response) => {

0
src/currencyservice/genproto.sh Normal file → Executable file
View file

View file

@ -8,6 +8,7 @@
"async": "^1.5.2", "async": "^1.5.2",
"google-protobuf": "^3.0.0", "google-protobuf": "^3.0.0",
"grpc": "^1.0.0", "grpc": "^1.0.0",
"left-pad": "^1.3.0",
"request": "^2.87.0", "request": "^2.87.0",
"xml2js": "^0.4.19" "xml2js": "^0.4.19"
} }

View file

@ -63,7 +63,7 @@ message Product {
string name = 2; string name = 2;
string description = 3; string description = 3;
string picture = 4; string picture = 4;
MoneyAmount price_usd = 5; Money price_usd = 5;
} }
message ListProductsResponse { message ListProductsResponse {
@ -95,7 +95,7 @@ message GetQuoteRequest {
} }
message GetQuoteResponse { message GetQuoteResponse {
MoneyAmount cost_usd = 1; Money cost_usd = 1;
} }
message ShipOrderRequest { message ShipOrderRequest {
@ -122,18 +122,22 @@ service CurrencyService {
rpc Convert(CurrencyConversionRequest) returns (Money) {} rpc Convert(CurrencyConversionRequest) returns (Money) {}
} }
// Represents an amount of money with its currency type.
// Describes a money amount without currency. For example, decimal=2 and
// fractional=500 (or fractional=5) makes up 2.5 units.
message MoneyAmount {
uint32 decimal = 1;
uint32 fractional = 2;
}
message Money { message Money {
// The 3-letter currency code defined in ISO 4217. // The 3-letter currency code defined in ISO 4217.
string currency_code = 1; string currency_code = 1;
MoneyAmount amount = 2;
// The whole units of the amount.
// For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar.
int64 units = 2;
// Number of nano (10^-9) units of the amount.
// The value must be between -999,999,999 and +999,999,999 inclusive.
// If `units` is positive, `nanos` must be positive or zero.
// If `units` is zero, `nanos` can be positive, zero, or negative.
// If `units` is negative, `nanos` must be negative or zero.
// For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
int32 nanos = 3;
} }
message GetSupportedCurrenciesResponse { message GetSupportedCurrenciesResponse {

View file

@ -31,7 +31,7 @@ const shopProto = grpc.load(PROTO_PATH).hipstershop;
let _data; let _data;
function _getCurrencyData (callback) { function _getCurrencyData (callback) {
if (!_data) { if (!_data) {
console.log('Fetching currency data...') console.log('Fetching currency data...');
request(DATA_URL, (err, res) => { request(DATA_URL, (err, res) => {
if (err) { if (err) {
throw new Error(`Error getting data: ${err}`); throw new Error(`Error getting data: ${err}`);
@ -53,7 +53,7 @@ function _getCurrencyData (callback) {
}); });
}); });
} else { } else {
console.log('Using cached currency data...') console.log('Using cached currency data...');
callback(_data); callback(_data);
} }
} }
@ -62,9 +62,10 @@ function _getCurrencyData (callback) {
* Helper function that handles decimal/fractional carrying * Helper function that handles decimal/fractional carrying
*/ */
function _carry (amount) { function _carry (amount) {
amount.fractional += (amount.decimal % 1) * 100; const fractionSize = Math.pow(10, 9);
amount.decimal = Math.floor(amount.decimal) + Math.floor(amount.fractional / 100); amount.nanos += (amount.units % 1) * fractionSize;
amount.fractional = amount.fractional % 100; amount.units = Math.floor(amount.units) + Math.floor(amount.nanos / fractionSize);
amount.nanos = amount.nanos % fractionSize;
return amount; return amount;
} }
@ -72,7 +73,7 @@ function _carry (amount) {
* Lists the supported currencies * Lists the supported currencies
*/ */
function getSupportedCurrencies (call, callback) { function getSupportedCurrencies (call, callback) {
console.log('Getting supported currencies...') console.log('Getting supported currencies...');
_getCurrencyData((data) => { _getCurrencyData((data) => {
callback(null, {currency_codes: Object.keys(data)}); callback(null, {currency_codes: Object.keys(data)});
}); });
@ -82,7 +83,7 @@ function getSupportedCurrencies (call, callback) {
* Converts between currencies * Converts between currencies
*/ */
function convert (call, callback) { function convert (call, callback) {
console.log('Starting conversion request...') console.log('Starting conversion request...');
try { try {
_getCurrencyData((data) => { _getCurrencyData((data) => {
const request = call.request; const request = call.request;
@ -90,22 +91,28 @@ function convert (call, callback) {
// Convert: from_currency --> EUR // Convert: from_currency --> EUR
const from = request.from; const from = request.from;
const euros = _carry({ const euros = _carry({
decimal: from.amount.decimal / data[from.currency_code], units: from.units / data[from.currency_code],
fractional: from.amount.fractional / data[from.currency_code] nanos: from.nanos / data[from.currency_code]
}); });
euros.nanos = Math.round(euros.nanos);
// Convert: EUR --> to_currency // Convert: EUR --> to_currency
const target = _carry({ const result = _carry({
decimal: euros.decimal * data[request.to_code], units: euros.units * data[request.to_code],
fractional: euros.fractional * data[request.to_code] nanos: euros.nanos * data[request.to_code]
}); });
target.fractional = Math.round(target.fractional);
console.log('Conversion request successful.') result.units = Math.floor(result.units)
callback(null, {currency_code: request.to_code, amount: target}); result.nanos = Math.floor(result.nanos)
result.currency_code = request.to_code;
console.log(`Conversion request successful ${result.nanos}..${result.nanos}`);
callback(null, result);
}); });
} catch (err) { } catch (err) {
console.error('Conversion request failed.') console.error('Conversion request failed.');
console.error(err);
callback(err.message); callback(err.message);
} }
} }

View file

@ -1,13 +0,0 @@
FROM golang:1.10-alpine as builder
RUN apk add --no-cache ca-certificates git
WORKDIR /src/microservices-demo/currencyservice
COPY . .
RUN go get -d ./...
RUN go build -o /currencyservice .
FROM alpine as release
RUN apk add --no-cache \
ca-certificates
COPY --from=builder /currencyservice /currencyservice
EXPOSE 7000
ENTRYPOINT ["/currencyservice"]

File diff suppressed because it is too large Load diff

View file

@ -1,77 +0,0 @@
package main
import (
"context"
"fmt"
"log"
"net"
"os"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"google.golang.org/grpc"
pb "./genproto"
)
const (
listenPort = "7000"
)
type currencyServer struct {
currencies []string
conversionRates map[[2]string]float64
}
func main() {
port := listenPort
if os.Getenv("PORT") != "" {
port = os.Getenv("PORT")
}
svc := &currencyServer{
currencies: []string{"USD", "EUR", "CAD"},
conversionRates: map[[2]string]float64{
{"USD", "EUR"}: 0.86,
{"EUR", "USD"}: 1 / 0.86,
{"USD", "CAD"}: 1.33,
{"CAD", "USD"}: 1 / 1.33,
{"EUR", "CAD"}: 1.54,
{"CAD", "EUR"}: 1 / 1.54,
},
}
lis, err := net.Listen("tcp", fmt.Sprintf(":%s", port))
if err != nil {
log.Fatal(err)
}
srv := grpc.NewServer()
pb.RegisterCurrencyServiceServer(srv, svc)
log.Printf("starting to listen on tcp: %q", lis.Addr().String())
log.Fatal(srv.Serve(lis))
}
func (cs *currencyServer) GetSupportedCurrencies(_ context.Context, _ *pb.Empty) (*pb.GetSupportedCurrenciesResponse, error) {
log.Printf("requesting supported currencies (%d)", len(cs.currencies))
return &pb.GetSupportedCurrenciesResponse{CurrencyCodes: cs.currencies}, nil
}
func (cs *currencyServer) Convert(_ context.Context, req *pb.CurrencyConversionRequest) (*pb.Money, error) {
log.Printf("requesting currency conversion [%+v] --> %s", req.From, req.ToCode)
conv := [2]string{req.GetFrom().GetCurrencyCode(), req.GetToCode()}
rate, ok := cs.conversionRates[conv]
if !ok {
return nil, status.Errorf(codes.InvalidArgument, "conversion %v not supported", conv)
}
if req.From == nil {
return nil, status.Errorf(codes.InvalidArgument, "no money amount provided")
}
amount := convert(*req.From.Amount, rate)
return &pb.Money{
CurrencyCode: req.GetToCode(),
Amount: &amount}, nil
}

View file

@ -1,29 +0,0 @@
package main
import (
"fmt"
"math"
"strconv"
"strings"
pb "./genproto"
)
func convert(m pb.MoneyAmount, rate float64) pb.MoneyAmount {
d, f := m.Decimal, m.Fractional
lg := int(math.Max(1, math.Ceil(math.Log10(float64(f)))))
ff, _ := strconv.ParseFloat(fmt.Sprintf("%d.%d", d, f), 64)
res := ff * rate
resTxt := fmt.Sprintf("%."+strconv.Itoa(lg)+"f", res)
p := strings.Split(resTxt, ".")
ds, fs := p[0], p[1]
fs = strings.TrimSuffix(fs, "0")
if fs == "" {
fs = "0"
}
dn, _ := strconv.Atoi(ds)
fn, _ := strconv.Atoi(fs)
return pb.MoneyAmount{Decimal: uint32(dn), Fractional: uint32(fn)}
}

View file

@ -1,46 +0,0 @@
package main
import (
"reflect"
"testing"
pb "./genproto"
)
func Test_convert(t *testing.T) {
type args struct {
m pb.MoneyAmount
rate float64
}
tests := []struct {
name string
args args
want pb.MoneyAmount
}{
{
"0.33*3", args{pb.MoneyAmount{Decimal: 0, Fractional: 330}, 3}, pb.MoneyAmount{Decimal: 0, Fractional: 99},
},
{
"10.00*0.5", args{pb.MoneyAmount{Decimal: 10}, 0.5}, pb.MoneyAmount{Decimal: 5},
},
{
"10.00*1.5", args{pb.MoneyAmount{Decimal: 10}, 1.5}, pb.MoneyAmount{Decimal: 15},
},
{
"10.00*1/3", args{pb.MoneyAmount{Decimal: 10}, 1.0 / 3}, pb.MoneyAmount{Decimal: 3, Fractional: 3},
},
{
"32.320*0.5 (trailing zero removed)", args{pb.MoneyAmount{Decimal: 32, Fractional: 32}, 0.5}, pb.MoneyAmount{Decimal: 16, Fractional: 16},
},
{
"33.33*(1/3) (trailing zero removed)", args{pb.MoneyAmount{Decimal: 33, Fractional: 33}, 1.0 / 3}, pb.MoneyAmount{Decimal: 11, Fractional: 11},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := convert(tt.args.m, tt.args.rate); !reflect.DeepEqual(got, tt.want) {
t.Errorf("convert([%v]*%f) = %v, want=[%v]", tt.args.m, tt.args.rate, got, tt.want)
}
})
}
}

View file

@ -35,7 +35,7 @@ func (m *CartItem) Reset() { *m = CartItem{} }
func (m *CartItem) String() string { return proto.CompactTextString(m) } func (m *CartItem) String() string { return proto.CompactTextString(m) }
func (*CartItem) ProtoMessage() {} func (*CartItem) ProtoMessage() {}
func (*CartItem) Descriptor() ([]byte, []int) { func (*CartItem) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{0} return fileDescriptor_demo_bbfc9458084e7e4b, []int{0}
} }
func (m *CartItem) XXX_Unmarshal(b []byte) error { func (m *CartItem) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CartItem.Unmarshal(m, b) return xxx_messageInfo_CartItem.Unmarshal(m, b)
@ -81,7 +81,7 @@ func (m *AddItemRequest) Reset() { *m = AddItemRequest{} }
func (m *AddItemRequest) String() string { return proto.CompactTextString(m) } func (m *AddItemRequest) String() string { return proto.CompactTextString(m) }
func (*AddItemRequest) ProtoMessage() {} func (*AddItemRequest) ProtoMessage() {}
func (*AddItemRequest) Descriptor() ([]byte, []int) { func (*AddItemRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{1} return fileDescriptor_demo_bbfc9458084e7e4b, []int{1}
} }
func (m *AddItemRequest) XXX_Unmarshal(b []byte) error { func (m *AddItemRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_AddItemRequest.Unmarshal(m, b) return xxx_messageInfo_AddItemRequest.Unmarshal(m, b)
@ -126,7 +126,7 @@ func (m *EmptyCartRequest) Reset() { *m = EmptyCartRequest{} }
func (m *EmptyCartRequest) String() string { return proto.CompactTextString(m) } func (m *EmptyCartRequest) String() string { return proto.CompactTextString(m) }
func (*EmptyCartRequest) ProtoMessage() {} func (*EmptyCartRequest) ProtoMessage() {}
func (*EmptyCartRequest) Descriptor() ([]byte, []int) { func (*EmptyCartRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{2} return fileDescriptor_demo_bbfc9458084e7e4b, []int{2}
} }
func (m *EmptyCartRequest) XXX_Unmarshal(b []byte) error { func (m *EmptyCartRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_EmptyCartRequest.Unmarshal(m, b) return xxx_messageInfo_EmptyCartRequest.Unmarshal(m, b)
@ -164,7 +164,7 @@ func (m *GetCartRequest) Reset() { *m = GetCartRequest{} }
func (m *GetCartRequest) String() string { return proto.CompactTextString(m) } func (m *GetCartRequest) String() string { return proto.CompactTextString(m) }
func (*GetCartRequest) ProtoMessage() {} func (*GetCartRequest) ProtoMessage() {}
func (*GetCartRequest) Descriptor() ([]byte, []int) { func (*GetCartRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{3} return fileDescriptor_demo_bbfc9458084e7e4b, []int{3}
} }
func (m *GetCartRequest) XXX_Unmarshal(b []byte) error { func (m *GetCartRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetCartRequest.Unmarshal(m, b) return xxx_messageInfo_GetCartRequest.Unmarshal(m, b)
@ -203,7 +203,7 @@ func (m *Cart) Reset() { *m = Cart{} }
func (m *Cart) String() string { return proto.CompactTextString(m) } func (m *Cart) String() string { return proto.CompactTextString(m) }
func (*Cart) ProtoMessage() {} func (*Cart) ProtoMessage() {}
func (*Cart) Descriptor() ([]byte, []int) { func (*Cart) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{4} return fileDescriptor_demo_bbfc9458084e7e4b, []int{4}
} }
func (m *Cart) XXX_Unmarshal(b []byte) error { func (m *Cart) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Cart.Unmarshal(m, b) return xxx_messageInfo_Cart.Unmarshal(m, b)
@ -247,7 +247,7 @@ func (m *Empty) Reset() { *m = Empty{} }
func (m *Empty) String() string { return proto.CompactTextString(m) } func (m *Empty) String() string { return proto.CompactTextString(m) }
func (*Empty) ProtoMessage() {} func (*Empty) ProtoMessage() {}
func (*Empty) Descriptor() ([]byte, []int) { func (*Empty) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{5} return fileDescriptor_demo_bbfc9458084e7e4b, []int{5}
} }
func (m *Empty) XXX_Unmarshal(b []byte) error { func (m *Empty) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Empty.Unmarshal(m, b) return xxx_messageInfo_Empty.Unmarshal(m, b)
@ -279,7 +279,7 @@ func (m *ListRecommendationsRequest) Reset() { *m = ListRecommendationsR
func (m *ListRecommendationsRequest) String() string { return proto.CompactTextString(m) } func (m *ListRecommendationsRequest) String() string { return proto.CompactTextString(m) }
func (*ListRecommendationsRequest) ProtoMessage() {} func (*ListRecommendationsRequest) ProtoMessage() {}
func (*ListRecommendationsRequest) Descriptor() ([]byte, []int) { func (*ListRecommendationsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{6} return fileDescriptor_demo_bbfc9458084e7e4b, []int{6}
} }
func (m *ListRecommendationsRequest) XXX_Unmarshal(b []byte) error { func (m *ListRecommendationsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListRecommendationsRequest.Unmarshal(m, b) return xxx_messageInfo_ListRecommendationsRequest.Unmarshal(m, b)
@ -324,7 +324,7 @@ func (m *ListRecommendationsResponse) Reset() { *m = ListRecommendations
func (m *ListRecommendationsResponse) String() string { return proto.CompactTextString(m) } func (m *ListRecommendationsResponse) String() string { return proto.CompactTextString(m) }
func (*ListRecommendationsResponse) ProtoMessage() {} func (*ListRecommendationsResponse) ProtoMessage() {}
func (*ListRecommendationsResponse) Descriptor() ([]byte, []int) { func (*ListRecommendationsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{7} return fileDescriptor_demo_bbfc9458084e7e4b, []int{7}
} }
func (m *ListRecommendationsResponse) XXX_Unmarshal(b []byte) error { func (m *ListRecommendationsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListRecommendationsResponse.Unmarshal(m, b) return xxx_messageInfo_ListRecommendationsResponse.Unmarshal(m, b)
@ -356,7 +356,7 @@ type Product struct {
Name string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` Name string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"`
Description string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"` Description string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"`
Picture string `protobuf:"bytes,4,opt,name=picture" json:"picture,omitempty"` Picture string `protobuf:"bytes,4,opt,name=picture" json:"picture,omitempty"`
PriceUsd *MoneyAmount `protobuf:"bytes,5,opt,name=price_usd,json=priceUsd" json:"price_usd,omitempty"` PriceUsd *Money `protobuf:"bytes,5,opt,name=price_usd,json=priceUsd" json:"price_usd,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -366,7 +366,7 @@ func (m *Product) Reset() { *m = Product{} }
func (m *Product) String() string { return proto.CompactTextString(m) } func (m *Product) String() string { return proto.CompactTextString(m) }
func (*Product) ProtoMessage() {} func (*Product) ProtoMessage() {}
func (*Product) Descriptor() ([]byte, []int) { func (*Product) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{8} return fileDescriptor_demo_bbfc9458084e7e4b, []int{8}
} }
func (m *Product) XXX_Unmarshal(b []byte) error { func (m *Product) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Product.Unmarshal(m, b) return xxx_messageInfo_Product.Unmarshal(m, b)
@ -414,7 +414,7 @@ func (m *Product) GetPicture() string {
return "" return ""
} }
func (m *Product) GetPriceUsd() *MoneyAmount { func (m *Product) GetPriceUsd() *Money {
if m != nil { if m != nil {
return m.PriceUsd return m.PriceUsd
} }
@ -432,7 +432,7 @@ func (m *ListProductsResponse) Reset() { *m = ListProductsResponse{} }
func (m *ListProductsResponse) String() string { return proto.CompactTextString(m) } func (m *ListProductsResponse) String() string { return proto.CompactTextString(m) }
func (*ListProductsResponse) ProtoMessage() {} func (*ListProductsResponse) ProtoMessage() {}
func (*ListProductsResponse) Descriptor() ([]byte, []int) { func (*ListProductsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{9} return fileDescriptor_demo_bbfc9458084e7e4b, []int{9}
} }
func (m *ListProductsResponse) XXX_Unmarshal(b []byte) error { func (m *ListProductsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListProductsResponse.Unmarshal(m, b) return xxx_messageInfo_ListProductsResponse.Unmarshal(m, b)
@ -470,7 +470,7 @@ func (m *GetProductRequest) Reset() { *m = GetProductRequest{} }
func (m *GetProductRequest) String() string { return proto.CompactTextString(m) } func (m *GetProductRequest) String() string { return proto.CompactTextString(m) }
func (*GetProductRequest) ProtoMessage() {} func (*GetProductRequest) ProtoMessage() {}
func (*GetProductRequest) Descriptor() ([]byte, []int) { func (*GetProductRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{10} return fileDescriptor_demo_bbfc9458084e7e4b, []int{10}
} }
func (m *GetProductRequest) XXX_Unmarshal(b []byte) error { func (m *GetProductRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetProductRequest.Unmarshal(m, b) return xxx_messageInfo_GetProductRequest.Unmarshal(m, b)
@ -508,7 +508,7 @@ func (m *SearchProductsRequest) Reset() { *m = SearchProductsRequest{} }
func (m *SearchProductsRequest) String() string { return proto.CompactTextString(m) } func (m *SearchProductsRequest) String() string { return proto.CompactTextString(m) }
func (*SearchProductsRequest) ProtoMessage() {} func (*SearchProductsRequest) ProtoMessage() {}
func (*SearchProductsRequest) Descriptor() ([]byte, []int) { func (*SearchProductsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{11} return fileDescriptor_demo_bbfc9458084e7e4b, []int{11}
} }
func (m *SearchProductsRequest) XXX_Unmarshal(b []byte) error { func (m *SearchProductsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SearchProductsRequest.Unmarshal(m, b) return xxx_messageInfo_SearchProductsRequest.Unmarshal(m, b)
@ -546,7 +546,7 @@ func (m *SearchProductsResponse) Reset() { *m = SearchProductsResponse{}
func (m *SearchProductsResponse) String() string { return proto.CompactTextString(m) } func (m *SearchProductsResponse) String() string { return proto.CompactTextString(m) }
func (*SearchProductsResponse) ProtoMessage() {} func (*SearchProductsResponse) ProtoMessage() {}
func (*SearchProductsResponse) Descriptor() ([]byte, []int) { func (*SearchProductsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{12} return fileDescriptor_demo_bbfc9458084e7e4b, []int{12}
} }
func (m *SearchProductsResponse) XXX_Unmarshal(b []byte) error { func (m *SearchProductsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SearchProductsResponse.Unmarshal(m, b) return xxx_messageInfo_SearchProductsResponse.Unmarshal(m, b)
@ -585,7 +585,7 @@ func (m *GetQuoteRequest) Reset() { *m = GetQuoteRequest{} }
func (m *GetQuoteRequest) String() string { return proto.CompactTextString(m) } func (m *GetQuoteRequest) String() string { return proto.CompactTextString(m) }
func (*GetQuoteRequest) ProtoMessage() {} func (*GetQuoteRequest) ProtoMessage() {}
func (*GetQuoteRequest) Descriptor() ([]byte, []int) { func (*GetQuoteRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{13} return fileDescriptor_demo_bbfc9458084e7e4b, []int{13}
} }
func (m *GetQuoteRequest) XXX_Unmarshal(b []byte) error { func (m *GetQuoteRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetQuoteRequest.Unmarshal(m, b) return xxx_messageInfo_GetQuoteRequest.Unmarshal(m, b)
@ -620,7 +620,7 @@ func (m *GetQuoteRequest) GetItems() []*CartItem {
} }
type GetQuoteResponse struct { type GetQuoteResponse struct {
CostUsd *MoneyAmount `protobuf:"bytes,1,opt,name=cost_usd,json=costUsd" json:"cost_usd,omitempty"` CostUsd *Money `protobuf:"bytes,1,opt,name=cost_usd,json=costUsd" json:"cost_usd,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -630,7 +630,7 @@ func (m *GetQuoteResponse) Reset() { *m = GetQuoteResponse{} }
func (m *GetQuoteResponse) String() string { return proto.CompactTextString(m) } func (m *GetQuoteResponse) String() string { return proto.CompactTextString(m) }
func (*GetQuoteResponse) ProtoMessage() {} func (*GetQuoteResponse) ProtoMessage() {}
func (*GetQuoteResponse) Descriptor() ([]byte, []int) { func (*GetQuoteResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{14} return fileDescriptor_demo_bbfc9458084e7e4b, []int{14}
} }
func (m *GetQuoteResponse) XXX_Unmarshal(b []byte) error { func (m *GetQuoteResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetQuoteResponse.Unmarshal(m, b) return xxx_messageInfo_GetQuoteResponse.Unmarshal(m, b)
@ -650,7 +650,7 @@ func (m *GetQuoteResponse) XXX_DiscardUnknown() {
var xxx_messageInfo_GetQuoteResponse proto.InternalMessageInfo var xxx_messageInfo_GetQuoteResponse proto.InternalMessageInfo
func (m *GetQuoteResponse) GetCostUsd() *MoneyAmount { func (m *GetQuoteResponse) GetCostUsd() *Money {
if m != nil { if m != nil {
return m.CostUsd return m.CostUsd
} }
@ -669,7 +669,7 @@ func (m *ShipOrderRequest) Reset() { *m = ShipOrderRequest{} }
func (m *ShipOrderRequest) String() string { return proto.CompactTextString(m) } func (m *ShipOrderRequest) String() string { return proto.CompactTextString(m) }
func (*ShipOrderRequest) ProtoMessage() {} func (*ShipOrderRequest) ProtoMessage() {}
func (*ShipOrderRequest) Descriptor() ([]byte, []int) { func (*ShipOrderRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{15} return fileDescriptor_demo_bbfc9458084e7e4b, []int{15}
} }
func (m *ShipOrderRequest) XXX_Unmarshal(b []byte) error { func (m *ShipOrderRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ShipOrderRequest.Unmarshal(m, b) return xxx_messageInfo_ShipOrderRequest.Unmarshal(m, b)
@ -714,7 +714,7 @@ func (m *ShipOrderResponse) Reset() { *m = ShipOrderResponse{} }
func (m *ShipOrderResponse) String() string { return proto.CompactTextString(m) } func (m *ShipOrderResponse) String() string { return proto.CompactTextString(m) }
func (*ShipOrderResponse) ProtoMessage() {} func (*ShipOrderResponse) ProtoMessage() {}
func (*ShipOrderResponse) Descriptor() ([]byte, []int) { func (*ShipOrderResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{16} return fileDescriptor_demo_bbfc9458084e7e4b, []int{16}
} }
func (m *ShipOrderResponse) XXX_Unmarshal(b []byte) error { func (m *ShipOrderResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ShipOrderResponse.Unmarshal(m, b) return xxx_messageInfo_ShipOrderResponse.Unmarshal(m, b)
@ -742,9 +742,9 @@ func (m *ShipOrderResponse) GetTrackingId() string {
} }
type Address struct { type Address struct {
StreetAddress_1 string `protobuf:"bytes,1,opt,name=street_address_1,json=streetAddress1" json:"street_address_1,omitempty"` StreetAddress string `protobuf:"bytes,1,opt,name=street_address,json=streetAddress" json:"street_address,omitempty"`
StreetAddress_2 string `protobuf:"bytes,2,opt,name=street_address_2,json=streetAddress2" json:"street_address_2,omitempty"` City string `protobuf:"bytes,2,opt,name=city" json:"city,omitempty"`
City string `protobuf:"bytes,3,opt,name=city" json:"city,omitempty"` State string `protobuf:"bytes,3,opt,name=state" json:"state,omitempty"`
Country string `protobuf:"bytes,4,opt,name=country" json:"country,omitempty"` Country string `protobuf:"bytes,4,opt,name=country" json:"country,omitempty"`
ZipCode int32 `protobuf:"varint,5,opt,name=zip_code,json=zipCode" json:"zip_code,omitempty"` ZipCode int32 `protobuf:"varint,5,opt,name=zip_code,json=zipCode" json:"zip_code,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
@ -756,7 +756,7 @@ func (m *Address) Reset() { *m = Address{} }
func (m *Address) String() string { return proto.CompactTextString(m) } func (m *Address) String() string { return proto.CompactTextString(m) }
func (*Address) ProtoMessage() {} func (*Address) ProtoMessage() {}
func (*Address) Descriptor() ([]byte, []int) { func (*Address) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{17} return fileDescriptor_demo_bbfc9458084e7e4b, []int{17}
} }
func (m *Address) XXX_Unmarshal(b []byte) error { func (m *Address) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Address.Unmarshal(m, b) return xxx_messageInfo_Address.Unmarshal(m, b)
@ -776,16 +776,9 @@ func (m *Address) XXX_DiscardUnknown() {
var xxx_messageInfo_Address proto.InternalMessageInfo var xxx_messageInfo_Address proto.InternalMessageInfo
func (m *Address) GetStreetAddress_1() string { func (m *Address) GetStreetAddress() string {
if m != nil { if m != nil {
return m.StreetAddress_1 return m.StreetAddress
}
return ""
}
func (m *Address) GetStreetAddress_2() string {
if m != nil {
return m.StreetAddress_2
} }
return "" return ""
} }
@ -797,6 +790,13 @@ func (m *Address) GetCity() string {
return "" return ""
} }
func (m *Address) GetState() string {
if m != nil {
return m.State
}
return ""
}
func (m *Address) GetCountry() string { func (m *Address) GetCountry() string {
if m != nil { if m != nil {
return m.Country return m.Country
@ -811,58 +811,20 @@ func (m *Address) GetZipCode() int32 {
return 0 return 0
} }
// Describes a money amount without currency. For example, decimal=2 and // Represents an amount of money with its currency type.
// fractional=500 (or fractional=5) makes up 2.5 units.
type MoneyAmount struct {
Decimal uint32 `protobuf:"varint,1,opt,name=decimal" json:"decimal,omitempty"`
Fractional uint32 `protobuf:"varint,2,opt,name=fractional" json:"fractional,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *MoneyAmount) Reset() { *m = MoneyAmount{} }
func (m *MoneyAmount) String() string { return proto.CompactTextString(m) }
func (*MoneyAmount) ProtoMessage() {}
func (*MoneyAmount) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{18}
}
func (m *MoneyAmount) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_MoneyAmount.Unmarshal(m, b)
}
func (m *MoneyAmount) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_MoneyAmount.Marshal(b, m, deterministic)
}
func (dst *MoneyAmount) XXX_Merge(src proto.Message) {
xxx_messageInfo_MoneyAmount.Merge(dst, src)
}
func (m *MoneyAmount) XXX_Size() int {
return xxx_messageInfo_MoneyAmount.Size(m)
}
func (m *MoneyAmount) XXX_DiscardUnknown() {
xxx_messageInfo_MoneyAmount.DiscardUnknown(m)
}
var xxx_messageInfo_MoneyAmount proto.InternalMessageInfo
func (m *MoneyAmount) GetDecimal() uint32 {
if m != nil {
return m.Decimal
}
return 0
}
func (m *MoneyAmount) GetFractional() uint32 {
if m != nil {
return m.Fractional
}
return 0
}
type Money struct { type Money struct {
// The 3-letter currency code defined in ISO 4217. // The 3-letter currency code defined in ISO 4217.
CurrencyCode string `protobuf:"bytes,1,opt,name=currency_code,json=currencyCode" json:"currency_code,omitempty"` CurrencyCode string `protobuf:"bytes,1,opt,name=currency_code,json=currencyCode" json:"currency_code,omitempty"`
Amount *MoneyAmount `protobuf:"bytes,2,opt,name=amount" json:"amount,omitempty"` // The whole units of the amount.
// For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar.
Units int64 `protobuf:"varint,2,opt,name=units" json:"units,omitempty"`
// Number of nano (10^-9) units of the amount.
// The value must be between -999,999,999 and +999,999,999 inclusive.
// If `units` is positive, `nanos` must be positive or zero.
// If `units` is zero, `nanos` can be positive, zero, or negative.
// If `units` is negative, `nanos` must be negative or zero.
// For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
Nanos int32 `protobuf:"varint,3,opt,name=nanos" json:"nanos,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -872,7 +834,7 @@ func (m *Money) Reset() { *m = Money{} }
func (m *Money) String() string { return proto.CompactTextString(m) } func (m *Money) String() string { return proto.CompactTextString(m) }
func (*Money) ProtoMessage() {} func (*Money) ProtoMessage() {}
func (*Money) Descriptor() ([]byte, []int) { func (*Money) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{19} return fileDescriptor_demo_bbfc9458084e7e4b, []int{18}
} }
func (m *Money) XXX_Unmarshal(b []byte) error { func (m *Money) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Money.Unmarshal(m, b) return xxx_messageInfo_Money.Unmarshal(m, b)
@ -899,11 +861,18 @@ func (m *Money) GetCurrencyCode() string {
return "" return ""
} }
func (m *Money) GetAmount() *MoneyAmount { func (m *Money) GetUnits() int64 {
if m != nil { if m != nil {
return m.Amount return m.Units
} }
return nil return 0
}
func (m *Money) GetNanos() int32 {
if m != nil {
return m.Nanos
}
return 0
} }
type GetSupportedCurrenciesResponse struct { type GetSupportedCurrenciesResponse struct {
@ -918,7 +887,7 @@ func (m *GetSupportedCurrenciesResponse) Reset() { *m = GetSupportedCurr
func (m *GetSupportedCurrenciesResponse) String() string { return proto.CompactTextString(m) } func (m *GetSupportedCurrenciesResponse) String() string { return proto.CompactTextString(m) }
func (*GetSupportedCurrenciesResponse) ProtoMessage() {} func (*GetSupportedCurrenciesResponse) ProtoMessage() {}
func (*GetSupportedCurrenciesResponse) Descriptor() ([]byte, []int) { func (*GetSupportedCurrenciesResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{20} return fileDescriptor_demo_bbfc9458084e7e4b, []int{19}
} }
func (m *GetSupportedCurrenciesResponse) XXX_Unmarshal(b []byte) error { func (m *GetSupportedCurrenciesResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetSupportedCurrenciesResponse.Unmarshal(m, b) return xxx_messageInfo_GetSupportedCurrenciesResponse.Unmarshal(m, b)
@ -958,7 +927,7 @@ func (m *CurrencyConversionRequest) Reset() { *m = CurrencyConversionReq
func (m *CurrencyConversionRequest) String() string { return proto.CompactTextString(m) } func (m *CurrencyConversionRequest) String() string { return proto.CompactTextString(m) }
func (*CurrencyConversionRequest) ProtoMessage() {} func (*CurrencyConversionRequest) ProtoMessage() {}
func (*CurrencyConversionRequest) Descriptor() ([]byte, []int) { func (*CurrencyConversionRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{21} return fileDescriptor_demo_bbfc9458084e7e4b, []int{20}
} }
func (m *CurrencyConversionRequest) XXX_Unmarshal(b []byte) error { func (m *CurrencyConversionRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CurrencyConversionRequest.Unmarshal(m, b) return xxx_messageInfo_CurrencyConversionRequest.Unmarshal(m, b)
@ -1006,7 +975,7 @@ func (m *CreditCardInfo) Reset() { *m = CreditCardInfo{} }
func (m *CreditCardInfo) String() string { return proto.CompactTextString(m) } func (m *CreditCardInfo) String() string { return proto.CompactTextString(m) }
func (*CreditCardInfo) ProtoMessage() {} func (*CreditCardInfo) ProtoMessage() {}
func (*CreditCardInfo) Descriptor() ([]byte, []int) { func (*CreditCardInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{22} return fileDescriptor_demo_bbfc9458084e7e4b, []int{21}
} }
func (m *CreditCardInfo) XXX_Unmarshal(b []byte) error { func (m *CreditCardInfo) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CreditCardInfo.Unmarshal(m, b) return xxx_messageInfo_CreditCardInfo.Unmarshal(m, b)
@ -1066,7 +1035,7 @@ func (m *ChargeRequest) Reset() { *m = ChargeRequest{} }
func (m *ChargeRequest) String() string { return proto.CompactTextString(m) } func (m *ChargeRequest) String() string { return proto.CompactTextString(m) }
func (*ChargeRequest) ProtoMessage() {} func (*ChargeRequest) ProtoMessage() {}
func (*ChargeRequest) Descriptor() ([]byte, []int) { func (*ChargeRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{23} return fileDescriptor_demo_bbfc9458084e7e4b, []int{22}
} }
func (m *ChargeRequest) XXX_Unmarshal(b []byte) error { func (m *ChargeRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChargeRequest.Unmarshal(m, b) return xxx_messageInfo_ChargeRequest.Unmarshal(m, b)
@ -1111,7 +1080,7 @@ func (m *ChargeResponse) Reset() { *m = ChargeResponse{} }
func (m *ChargeResponse) String() string { return proto.CompactTextString(m) } func (m *ChargeResponse) String() string { return proto.CompactTextString(m) }
func (*ChargeResponse) ProtoMessage() {} func (*ChargeResponse) ProtoMessage() {}
func (*ChargeResponse) Descriptor() ([]byte, []int) { func (*ChargeResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{24} return fileDescriptor_demo_bbfc9458084e7e4b, []int{23}
} }
func (m *ChargeResponse) XXX_Unmarshal(b []byte) error { func (m *ChargeResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChargeResponse.Unmarshal(m, b) return xxx_messageInfo_ChargeResponse.Unmarshal(m, b)
@ -1150,7 +1119,7 @@ func (m *OrderItem) Reset() { *m = OrderItem{} }
func (m *OrderItem) String() string { return proto.CompactTextString(m) } func (m *OrderItem) String() string { return proto.CompactTextString(m) }
func (*OrderItem) ProtoMessage() {} func (*OrderItem) ProtoMessage() {}
func (*OrderItem) Descriptor() ([]byte, []int) { func (*OrderItem) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{25} return fileDescriptor_demo_bbfc9458084e7e4b, []int{24}
} }
func (m *OrderItem) XXX_Unmarshal(b []byte) error { func (m *OrderItem) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_OrderItem.Unmarshal(m, b) return xxx_messageInfo_OrderItem.Unmarshal(m, b)
@ -1199,7 +1168,7 @@ func (m *OrderResult) Reset() { *m = OrderResult{} }
func (m *OrderResult) String() string { return proto.CompactTextString(m) } func (m *OrderResult) String() string { return proto.CompactTextString(m) }
func (*OrderResult) ProtoMessage() {} func (*OrderResult) ProtoMessage() {}
func (*OrderResult) Descriptor() ([]byte, []int) { func (*OrderResult) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{26} return fileDescriptor_demo_bbfc9458084e7e4b, []int{25}
} }
func (m *OrderResult) XXX_Unmarshal(b []byte) error { func (m *OrderResult) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_OrderResult.Unmarshal(m, b) return xxx_messageInfo_OrderResult.Unmarshal(m, b)
@ -1266,7 +1235,7 @@ func (m *SendOrderConfirmationRequest) Reset() { *m = SendOrderConfirmat
func (m *SendOrderConfirmationRequest) String() string { return proto.CompactTextString(m) } func (m *SendOrderConfirmationRequest) String() string { return proto.CompactTextString(m) }
func (*SendOrderConfirmationRequest) ProtoMessage() {} func (*SendOrderConfirmationRequest) ProtoMessage() {}
func (*SendOrderConfirmationRequest) Descriptor() ([]byte, []int) { func (*SendOrderConfirmationRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{27} return fileDescriptor_demo_bbfc9458084e7e4b, []int{26}
} }
func (m *SendOrderConfirmationRequest) XXX_Unmarshal(b []byte) error { func (m *SendOrderConfirmationRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SendOrderConfirmationRequest.Unmarshal(m, b) return xxx_messageInfo_SendOrderConfirmationRequest.Unmarshal(m, b)
@ -1313,7 +1282,7 @@ func (m *CreateOrderRequest) Reset() { *m = CreateOrderRequest{} }
func (m *CreateOrderRequest) String() string { return proto.CompactTextString(m) } func (m *CreateOrderRequest) String() string { return proto.CompactTextString(m) }
func (*CreateOrderRequest) ProtoMessage() {} func (*CreateOrderRequest) ProtoMessage() {}
func (*CreateOrderRequest) Descriptor() ([]byte, []int) { func (*CreateOrderRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{28} return fileDescriptor_demo_bbfc9458084e7e4b, []int{27}
} }
func (m *CreateOrderRequest) XXX_Unmarshal(b []byte) error { func (m *CreateOrderRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CreateOrderRequest.Unmarshal(m, b) return xxx_messageInfo_CreateOrderRequest.Unmarshal(m, b)
@ -1366,7 +1335,7 @@ func (m *CreateOrderResponse) Reset() { *m = CreateOrderResponse{} }
func (m *CreateOrderResponse) String() string { return proto.CompactTextString(m) } func (m *CreateOrderResponse) String() string { return proto.CompactTextString(m) }
func (*CreateOrderResponse) ProtoMessage() {} func (*CreateOrderResponse) ProtoMessage() {}
func (*CreateOrderResponse) Descriptor() ([]byte, []int) { func (*CreateOrderResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{29} return fileDescriptor_demo_bbfc9458084e7e4b, []int{28}
} }
func (m *CreateOrderResponse) XXX_Unmarshal(b []byte) error { func (m *CreateOrderResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CreateOrderResponse.Unmarshal(m, b) return xxx_messageInfo_CreateOrderResponse.Unmarshal(m, b)
@ -1415,7 +1384,7 @@ func (m *PlaceOrderRequest) Reset() { *m = PlaceOrderRequest{} }
func (m *PlaceOrderRequest) String() string { return proto.CompactTextString(m) } func (m *PlaceOrderRequest) String() string { return proto.CompactTextString(m) }
func (*PlaceOrderRequest) ProtoMessage() {} func (*PlaceOrderRequest) ProtoMessage() {}
func (*PlaceOrderRequest) Descriptor() ([]byte, []int) { func (*PlaceOrderRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{30} return fileDescriptor_demo_bbfc9458084e7e4b, []int{29}
} }
func (m *PlaceOrderRequest) XXX_Unmarshal(b []byte) error { func (m *PlaceOrderRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PlaceOrderRequest.Unmarshal(m, b) return xxx_messageInfo_PlaceOrderRequest.Unmarshal(m, b)
@ -1481,7 +1450,7 @@ func (m *PlaceOrderResponse) Reset() { *m = PlaceOrderResponse{} }
func (m *PlaceOrderResponse) String() string { return proto.CompactTextString(m) } func (m *PlaceOrderResponse) String() string { return proto.CompactTextString(m) }
func (*PlaceOrderResponse) ProtoMessage() {} func (*PlaceOrderResponse) ProtoMessage() {}
func (*PlaceOrderResponse) Descriptor() ([]byte, []int) { func (*PlaceOrderResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{31} return fileDescriptor_demo_bbfc9458084e7e4b, []int{30}
} }
func (m *PlaceOrderResponse) XXX_Unmarshal(b []byte) error { func (m *PlaceOrderResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PlaceOrderResponse.Unmarshal(m, b) return xxx_messageInfo_PlaceOrderResponse.Unmarshal(m, b)
@ -1527,7 +1496,6 @@ func init() {
proto.RegisterType((*ShipOrderRequest)(nil), "hipstershop.ShipOrderRequest") proto.RegisterType((*ShipOrderRequest)(nil), "hipstershop.ShipOrderRequest")
proto.RegisterType((*ShipOrderResponse)(nil), "hipstershop.ShipOrderResponse") proto.RegisterType((*ShipOrderResponse)(nil), "hipstershop.ShipOrderResponse")
proto.RegisterType((*Address)(nil), "hipstershop.Address") proto.RegisterType((*Address)(nil), "hipstershop.Address")
proto.RegisterType((*MoneyAmount)(nil), "hipstershop.MoneyAmount")
proto.RegisterType((*Money)(nil), "hipstershop.Money") proto.RegisterType((*Money)(nil), "hipstershop.Money")
proto.RegisterType((*GetSupportedCurrenciesResponse)(nil), "hipstershop.GetSupportedCurrenciesResponse") proto.RegisterType((*GetSupportedCurrenciesResponse)(nil), "hipstershop.GetSupportedCurrenciesResponse")
proto.RegisterType((*CurrencyConversionRequest)(nil), "hipstershop.CurrencyConversionRequest") proto.RegisterType((*CurrencyConversionRequest)(nil), "hipstershop.CurrencyConversionRequest")
@ -2294,100 +2262,98 @@ var _CheckoutService_serviceDesc = grpc.ServiceDesc{
Metadata: "demo.proto", Metadata: "demo.proto",
} }
func init() { proto.RegisterFile("demo.proto", fileDescriptor_demo_40506d781b7ed975) } func init() { proto.RegisterFile("demo.proto", fileDescriptor_demo_bbfc9458084e7e4b) }
var fileDescriptor_demo_40506d781b7ed975 = []byte{ var fileDescriptor_demo_bbfc9458084e7e4b = []byte{
// 1466 bytes of a gzipped FileDescriptorProto // 1435 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x58, 0xdd, 0x72, 0xd3, 0xc6, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x58, 0xdd, 0x72, 0xd3, 0x46,
0x17, 0x8f, 0x9c, 0x38, 0xb6, 0x8f, 0x63, 0x27, 0x59, 0x12, 0xfe, 0x46, 0x81, 0x90, 0xff, 0x66, 0x14, 0x8e, 0x1c, 0x3b, 0xb6, 0x8f, 0x63, 0x27, 0x59, 0x12, 0x6a, 0x14, 0x7e, 0xd2, 0xcd, 0x40,
0x4a, 0x43, 0xa1, 0x19, 0x30, 0xed, 0x70, 0x51, 0x5a, 0xca, 0x98, 0x8c, 0xf1, 0x0c, 0x14, 0xaa, 0xa1, 0x40, 0xca, 0xa4, 0x9d, 0xe1, 0xa2, 0xb4, 0x94, 0x31, 0x19, 0xe3, 0x19, 0x28, 0x54, 0x81,
0x40, 0xa7, 0x1d, 0x3a, 0x78, 0x84, 0xb4, 0xc1, 0x2a, 0xd6, 0x07, 0xab, 0x55, 0xa6, 0x66, 0x7a, 0x0e, 0x1d, 0x3a, 0xf5, 0x08, 0x69, 0xc1, 0x2a, 0x91, 0x56, 0xd9, 0x5d, 0x65, 0x6a, 0xa6, 0x57,
0x45, 0x5f, 0xa4, 0x57, 0xbd, 0xe8, 0x03, 0xb4, 0xef, 0xd0, 0xfb, 0xbe, 0x42, 0x9f, 0xa3, 0xb3, 0xf4, 0x01, 0x7a, 0xdf, 0x47, 0xe8, 0x03, 0xb4, 0xef, 0xd0, 0xfb, 0xbe, 0x42, 0x9f, 0xa3, 0xb3,
0xab, 0x5d, 0x7d, 0x59, 0x4a, 0xc2, 0x4d, 0x7b, 0xe7, 0xdd, 0xfd, 0xed, 0x39, 0xbf, 0x3d, 0xdf, 0x2b, 0xad, 0xfe, 0x6c, 0x25, 0xe1, 0xa6, 0xbd, 0xd3, 0xee, 0x7e, 0x7b, 0xce, 0xb7, 0xe7, 0xdf,
0x32, 0x80, 0x4d, 0x5c, 0x7f, 0x3f, 0xa0, 0x3e, 0xf3, 0x51, 0x7b, 0xe2, 0x04, 0x21, 0x23, 0x34, 0x06, 0x70, 0x89, 0x4f, 0x77, 0x42, 0x46, 0x05, 0x45, 0x9d, 0x89, 0x17, 0x72, 0x41, 0x18, 0x9f,
0x9c, 0xf8, 0x01, 0x3e, 0x80, 0xe6, 0xc0, 0xa4, 0x6c, 0xc4, 0x88, 0x8b, 0x2e, 0x01, 0x04, 0xd4, 0xd0, 0x10, 0xef, 0x41, 0x6b, 0x60, 0x33, 0x31, 0x12, 0xc4, 0x47, 0x17, 0x00, 0x42, 0x46, 0xdd,
0xb7, 0x23, 0x8b, 0x8d, 0x1d, 0xbb, 0xa7, 0xed, 0x68, 0x7b, 0x2d, 0xa3, 0x25, 0x77, 0x46, 0x36, 0xc8, 0x11, 0x63, 0xcf, 0xed, 0x1b, 0x5b, 0xc6, 0xd5, 0xb6, 0xd5, 0x4e, 0x76, 0x46, 0x2e, 0x32,
0xd2, 0xa1, 0xf9, 0x26, 0x32, 0x3d, 0xe6, 0xb0, 0x59, 0xaf, 0xb6, 0xa3, 0xed, 0xd5, 0x8d, 0x64, 0xa1, 0x75, 0x18, 0xd9, 0x81, 0xf0, 0xc4, 0xb4, 0x5f, 0xdb, 0x32, 0xae, 0x36, 0xac, 0x74, 0x8d,
0x8d, 0x9f, 0x42, 0xf7, 0x9e, 0x6d, 0x73, 0x29, 0x06, 0x79, 0x13, 0x91, 0x90, 0xa1, 0xff, 0x41, 0x9f, 0x42, 0xef, 0x9e, 0xeb, 0x4a, 0x29, 0x16, 0x39, 0x8c, 0x08, 0x17, 0xe8, 0x03, 0x68, 0x46,
0x23, 0x0a, 0x09, 0x4d, 0x25, 0x2d, 0xf3, 0xe5, 0xc8, 0x46, 0x57, 0x61, 0xc9, 0x61, 0xc4, 0x15, 0x9c, 0xb0, 0x4c, 0xd2, 0x92, 0x5c, 0x8e, 0x5c, 0x74, 0x0d, 0xea, 0x9e, 0x20, 0xbe, 0x12, 0xd1,
0x22, 0xda, 0xfd, 0xcd, 0xfd, 0x0c, 0x9b, 0x7d, 0x45, 0xc5, 0x10, 0x10, 0x7c, 0x0d, 0xd6, 0x0e, 0xd9, 0xdd, 0xd8, 0xc9, 0xb1, 0xd9, 0xd1, 0x54, 0x2c, 0x05, 0xc1, 0xd7, 0x61, 0x75, 0xcf, 0x0f,
0xdc, 0x80, 0xcd, 0xf8, 0xf6, 0x69, 0x72, 0xf1, 0x55, 0xe8, 0x0e, 0x09, 0x3b, 0x13, 0xf4, 0x21, 0xc5, 0x54, 0x6e, 0x9f, 0x24, 0x17, 0x5f, 0x83, 0xde, 0x90, 0x88, 0x53, 0x41, 0x1f, 0x42, 0x5d,
0x2c, 0x71, 0x5c, 0x35, 0xc7, 0x6b, 0x50, 0xe7, 0x04, 0xc2, 0x5e, 0x6d, 0x67, 0xb1, 0x9a, 0x64, 0xe2, 0xaa, 0x39, 0x5e, 0x87, 0x86, 0x24, 0xc0, 0xfb, 0xb5, 0xad, 0xc5, 0x6a, 0x92, 0x31, 0x06,
0x8c, 0xc1, 0x0d, 0xa8, 0x0b, 0x96, 0xf8, 0x1b, 0xd0, 0x1f, 0x3a, 0x21, 0x33, 0x88, 0xe5, 0xbb, 0x37, 0xa1, 0xa1, 0x58, 0xe2, 0x6f, 0xc1, 0x7c, 0xe8, 0x71, 0x61, 0x11, 0x87, 0xfa, 0x3e, 0x09,
0x2e, 0xf1, 0x6c, 0x93, 0x39, 0xbe, 0x17, 0x9e, 0x6a, 0x90, 0xcb, 0xd0, 0x4e, 0xcd, 0x1e, 0xab, 0x5c, 0x5b, 0x78, 0x34, 0xe0, 0x27, 0x1a, 0xe4, 0x12, 0x74, 0x32, 0xb3, 0xc7, 0x2a, 0xdb, 0x16,
0x6c, 0x19, 0x90, 0xd8, 0x3d, 0xc4, 0x5f, 0xc0, 0x56, 0xa9, 0xdc, 0x30, 0xf0, 0xbd, 0x90, 0x14, 0xa4, 0x76, 0xe7, 0xf8, 0x4b, 0xd8, 0x9c, 0x2b, 0x97, 0x87, 0x34, 0xe0, 0xa4, 0x7c, 0xdf, 0x98,
0xef, 0x6b, 0x73, 0xf7, 0x7f, 0xd1, 0xa0, 0xf1, 0x24, 0x5e, 0xa2, 0x2e, 0xd4, 0x12, 0x02, 0x35, 0xb9, 0xff, 0x9b, 0x01, 0xcd, 0x27, 0xf1, 0x12, 0xf5, 0xa0, 0x96, 0x12, 0xa8, 0x79, 0x2e, 0x42,
0xc7, 0x46, 0x08, 0x96, 0x3c, 0xd3, 0x25, 0xc2, 0x1b, 0x2d, 0x43, 0xfc, 0x46, 0x3b, 0xd0, 0xb6, 0x50, 0x0f, 0x6c, 0x9f, 0x28, 0x6f, 0xb4, 0x2d, 0xf5, 0x8d, 0xb6, 0xa0, 0xe3, 0x12, 0xee, 0x30,
0x49, 0x68, 0x51, 0x27, 0xe0, 0x8a, 0x7a, 0x8b, 0xe2, 0x28, 0xbb, 0x85, 0x7a, 0xd0, 0x08, 0x1c, 0x2f, 0x94, 0x8a, 0xfa, 0x8b, 0xea, 0x28, 0xbf, 0x85, 0xfa, 0xd0, 0x0c, 0x3d, 0x47, 0x44, 0x8c,
0x8b, 0x45, 0x94, 0xf4, 0x96, 0xc4, 0xa9, 0x5a, 0xa2, 0x4f, 0xa1, 0x15, 0x50, 0xc7, 0x22, 0xe3, 0xf4, 0xeb, 0xea, 0x54, 0x2f, 0xd1, 0x27, 0xd0, 0x0e, 0x99, 0xe7, 0x90, 0x71, 0xc4, 0xdd, 0x7e,
0x28, 0xb4, 0x7b, 0x75, 0xe1, 0xe2, 0x5e, 0xce, 0x7a, 0x8f, 0x7c, 0x8f, 0xcc, 0xee, 0xb9, 0x7e, 0x43, 0xb9, 0x18, 0x15, 0xac, 0xf7, 0x88, 0x06, 0x64, 0x6a, 0xb5, 0x14, 0xe8, 0x19, 0x77, 0xf1,
0xe4, 0x31, 0xa3, 0x29, 0xa0, 0xcf, 0x42, 0x1b, 0x3f, 0x80, 0x0d, 0xfe, 0x44, 0xc9, 0x32, 0x7d, 0x03, 0x58, 0x97, 0x8f, 0x4b, 0xf8, 0x65, 0xaf, 0xba, 0x05, 0xad, 0xe4, 0x09, 0xf1, 0x93, 0x3a,
0xdb, 0x0d, 0x68, 0xca, 0x87, 0xc4, 0x0f, 0x6b, 0xf7, 0x37, 0x72, 0xd2, 0xe4, 0x05, 0x23, 0x41, 0xbb, 0xeb, 0x05, 0x39, 0xc9, 0x05, 0x2b, 0x45, 0xe1, 0x6d, 0x58, 0x1b, 0x12, 0x2d, 0x48, 0x5b,
0xe1, 0x5d, 0x58, 0x1f, 0x12, 0x25, 0x48, 0xd9, 0xbe, 0xf0, 0x6a, 0xfc, 0x31, 0x6c, 0x1e, 0x12, 0xbd, 0xf4, 0x5e, 0x7c, 0x13, 0x36, 0xf6, 0x89, 0xcd, 0x9c, 0x49, 0xa6, 0x30, 0x06, 0xae, 0x43,
0x93, 0x5a, 0x93, 0x54, 0x61, 0x0c, 0xdc, 0x80, 0xfa, 0x9b, 0x88, 0xd0, 0x99, 0xc4, 0xc6, 0x0b, 0xe3, 0x30, 0x22, 0x6c, 0x9a, 0x60, 0xe3, 0x05, 0x7e, 0x00, 0x67, 0xcb, 0xf0, 0x84, 0xdf, 0x0e,
0xfc, 0x00, 0xce, 0x17, 0xe1, 0x92, 0xdf, 0x3e, 0x34, 0x28, 0x09, 0xa3, 0xe9, 0x29, 0xf4, 0x14, 0x34, 0x19, 0xe1, 0xd1, 0xc1, 0x09, 0xf4, 0x34, 0x08, 0x07, 0xb0, 0x32, 0x24, 0xe2, 0x9b, 0x88,
0x08, 0x7b, 0xb0, 0x3a, 0x24, 0xec, 0xeb, 0xc8, 0x67, 0x44, 0xa9, 0xdc, 0x87, 0x86, 0x69, 0xdb, 0x0a, 0xa2, 0x55, 0xee, 0x40, 0xd3, 0x76, 0x5d, 0x46, 0x38, 0x57, 0x4a, 0xcb, 0x22, 0xee, 0xc5,
0x94, 0x84, 0xa1, 0x50, 0x5a, 0x14, 0x71, 0x2f, 0x3e, 0x33, 0x14, 0xe8, 0xfd, 0x62, 0x73, 0x08, 0x67, 0x96, 0x06, 0xbd, 0x5f, 0x54, 0xde, 0x83, 0xd5, 0x4c, 0x5f, 0xc2, 0xf9, 0x26, 0xb4, 0x1c,
0x6b, 0xa9, 0x3e, 0xc9, 0xf9, 0x16, 0x34, 0x2d, 0x3f, 0x64, 0xc2, 0x43, 0xda, 0x29, 0x1e, 0x6a, 0xca, 0x85, 0xf2, 0x8d, 0x51, 0xe9, 0x9b, 0xa6, 0xc4, 0x48, 0xd7, 0x50, 0x58, 0xdd, 0x9f, 0x78,
0x70, 0x24, 0x77, 0x90, 0x0f, 0x6b, 0x87, 0x13, 0x27, 0x78, 0x4c, 0x6d, 0x42, 0xff, 0x15, 0xe6, 0xe1, 0x63, 0xe6, 0x12, 0xf6, 0x9f, 0x70, 0xfe, 0x0c, 0xd6, 0x72, 0x0a, 0xb3, 0xf0, 0x16, 0xcc,
0x9f, 0xc0, 0x7a, 0x46, 0x61, 0x1a, 0xea, 0x8c, 0x9a, 0xd6, 0x6b, 0xc7, 0x7b, 0x95, 0xe6, 0x11, 0x76, 0xde, 0x78, 0xc1, 0xeb, 0x2c, 0x77, 0x40, 0x6f, 0x8d, 0x5c, 0xfc, 0xab, 0x01, 0xcd, 0x44,
0xa8, 0xad, 0x91, 0x8d, 0x7f, 0xd5, 0xa0, 0x21, 0xf5, 0xa2, 0x3d, 0x58, 0x0b, 0x19, 0x25, 0x84, 0x2f, 0xba, 0x0c, 0x3d, 0x2e, 0x18, 0x21, 0x62, 0x9c, 0x67, 0xd9, 0xb6, 0xba, 0xf1, 0xae, 0x86,
0x8d, 0x25, 0x81, 0xf1, 0x4d, 0x79, 0xa3, 0x1b, 0xef, 0x4b, 0xe0, 0xcd, 0x12, 0x64, 0x5f, 0x26, 0x21, 0xa8, 0x3b, 0xba, 0x8c, 0xb5, 0x2d, 0xf5, 0x2d, 0x03, 0x80, 0x0b, 0x5b, 0x90, 0x24, 0xde,
0x44, 0x1e, 0xd9, 0xe7, 0xe9, 0x62, 0xf1, 0xfa, 0x17, 0xe7, 0x84, 0xf8, 0xcd, 0x93, 0xc1, 0xe2, 0xe3, 0x85, 0x8c, 0x74, 0x87, 0x46, 0x81, 0x60, 0x53, 0x1d, 0xe9, 0xc9, 0x12, 0x9d, 0x83, 0xd6,
0xc6, 0xa2, 0x33, 0x95, 0x0c, 0x72, 0x89, 0x2e, 0x40, 0xf3, 0xad, 0x13, 0x8c, 0x2d, 0xdf, 0x26, 0x5b, 0x2f, 0x1c, 0x3b, 0xd4, 0x25, 0x2a, 0xd0, 0x1b, 0x56, 0xf3, 0xad, 0x17, 0x0e, 0xa8, 0x4b,
0x22, 0x17, 0xea, 0x46, 0xe3, 0xad, 0x13, 0x0c, 0x7c, 0x9b, 0xe0, 0x21, 0xb4, 0x33, 0x76, 0xe6, 0xf0, 0x73, 0x68, 0x28, 0x53, 0xa2, 0x6d, 0xe8, 0x3a, 0x11, 0x63, 0x24, 0x70, 0xa6, 0x31, 0x30,
0x32, 0x6c, 0x62, 0x39, 0xae, 0x39, 0x15, 0x14, 0x3b, 0x86, 0x5a, 0xa2, 0x6d, 0x80, 0x23, 0x6a, 0x66, 0xb3, 0xac, 0x37, 0x25, 0x5a, 0x2a, 0x8e, 0x02, 0x4f, 0x70, 0xc5, 0x66, 0xd1, 0x8a, 0x17,
0x5a, 0x3c, 0xed, 0xcc, 0xa9, 0x60, 0xd5, 0x31, 0x32, 0x3b, 0xf8, 0x05, 0xd4, 0x85, 0x20, 0xb4, 0x72, 0x37, 0xb0, 0x03, 0xca, 0x15, 0x9d, 0x86, 0x15, 0x2f, 0xf0, 0x10, 0x2e, 0x0e, 0x89, 0xd8,
0x0b, 0x1d, 0x2b, 0xa2, 0x94, 0x78, 0xd6, 0x2c, 0xd6, 0x18, 0xbf, 0x75, 0x45, 0x6d, 0x72, 0xb5, 0x8f, 0xc2, 0x90, 0x32, 0x41, 0xdc, 0x41, 0x2c, 0xc7, 0x23, 0x59, 0x5c, 0x5e, 0x86, 0x5e, 0x41,
0xe8, 0x06, 0x2c, 0x9b, 0x42, 0xa3, 0x2c, 0xbf, 0xd5, 0x9e, 0x97, 0x38, 0x3c, 0x84, 0xed, 0x21, 0xa5, 0x2e, 0x08, 0xdd, 0xbc, 0x4e, 0x8e, 0xbf, 0x87, 0x73, 0x83, 0x74, 0x23, 0x38, 0x22, 0x8c,
0x61, 0x87, 0x51, 0x10, 0xf8, 0x94, 0x11, 0x7b, 0x10, 0x4b, 0x73, 0x48, 0x9a, 0x03, 0x1f, 0x40, 0x7b, 0x34, 0xd0, 0x4e, 0xbe, 0x02, 0xf5, 0x57, 0x8c, 0xfa, 0xc7, 0xc4, 0x88, 0x3a, 0x97, 0x25,
0x37, 0xa7, 0x58, 0x95, 0xa0, 0x4e, 0x56, 0x73, 0x88, 0xbf, 0x87, 0x0b, 0x83, 0x64, 0xc3, 0x3b, 0x4d, 0xd0, 0xf8, 0x61, 0xb1, 0x25, 0x97, 0x04, 0x55, 0x06, 0xf8, 0xc7, 0x80, 0xde, 0x80, 0x11,
0x26, 0x34, 0x74, 0x7c, 0x4f, 0x85, 0xd2, 0x15, 0x58, 0x3a, 0xa2, 0xbe, 0x2b, 0xe3, 0x08, 0xcd, 0xd7, 0x93, 0xf5, 0xd8, 0x1d, 0x05, 0xaf, 0x28, 0xba, 0x01, 0xc8, 0x51, 0x3b, 0x63, 0xc7, 0x66,
0xb3, 0x32, 0xc4, 0x39, 0x2f, 0xa2, 0xcc, 0x8f, 0x9f, 0x17, 0x3b, 0x68, 0x99, 0xf9, 0xc2, 0x9e, 0xee, 0x38, 0x88, 0xfc, 0x97, 0x84, 0x25, 0xf6, 0x58, 0x75, 0x52, 0xec, 0xd7, 0x6a, 0x1f, 0x5d,
0x7f, 0x6b, 0xd0, 0x1d, 0x50, 0x62, 0x3b, 0xbc, 0x03, 0xd8, 0x23, 0xef, 0xc8, 0x47, 0xd7, 0x01, 0x81, 0x95, 0x3c, 0xda, 0x39, 0x3a, 0x4a, 0x5a, 0x4e, 0x37, 0x83, 0x0e, 0x8e, 0x8e, 0xd0, 0x17,
0x59, 0x62, 0x67, 0x6c, 0x99, 0xd4, 0x1e, 0x7b, 0x91, 0xfb, 0x92, 0x50, 0x69, 0x95, 0x35, 0x2b, 0xb0, 0x99, 0xc7, 0x91, 0x9f, 0x42, 0x8f, 0xa9, 0xf2, 0x38, 0x9e, 0x12, 0x9b, 0x25, 0xb6, 0xeb,
0xc1, 0x7e, 0x25, 0xf6, 0xd1, 0x15, 0x58, 0xcd, 0xa2, 0xad, 0xe3, 0x63, 0xd9, 0xe4, 0x3a, 0x29, 0x67, 0x77, 0xf6, 0x52, 0xc0, 0x77, 0xc4, 0x66, 0xe8, 0x2e, 0x9c, 0xaf, 0xb8, 0xee, 0xd3, 0x40,
0x74, 0x70, 0x7c, 0x8c, 0x3e, 0x87, 0xad, 0x2c, 0x8e, 0xfc, 0x18, 0x38, 0x54, 0x14, 0xe4, 0xf1, 0x4c, 0x94, 0xcb, 0x1b, 0xd6, 0xb9, 0x79, 0xf7, 0x1f, 0x49, 0x00, 0x9e, 0x42, 0x77, 0x30, 0xb1,
0x8c, 0x98, 0x54, 0x04, 0x46, 0xdd, 0xe8, 0xa5, 0x77, 0x0e, 0x12, 0xc0, 0x77, 0xc4, 0xa4, 0xe8, 0xd9, 0xeb, 0x34, 0xa7, 0x3f, 0x86, 0x25, 0xdb, 0x97, 0x11, 0x72, 0x8c, 0xf1, 0x12, 0x04, 0xba,
0x2e, 0x5c, 0xac, 0xb8, 0xee, 0xfa, 0x1e, 0x9b, 0x88, 0x08, 0xaa, 0x1b, 0x17, 0xca, 0xee, 0x3f, 0x03, 0x9d, 0x9c, 0xf6, 0xa4, 0x21, 0x6e, 0x16, 0x33, 0xa4, 0x60, 0x44, 0x0b, 0x32, 0x26, 0xf8,
0xe2, 0x00, 0x3c, 0x83, 0xce, 0x60, 0x62, 0xd2, 0x57, 0x49, 0xfd, 0xf8, 0x28, 0x71, 0x69, 0xb5, 0x36, 0xf4, 0xb4, 0xea, 0xcc, 0xf5, 0x82, 0xd9, 0x01, 0xb7, 0x1d, 0xf5, 0x84, 0x34, 0x59, 0xba,
0xf1, 0x24, 0x02, 0xdd, 0x81, 0x76, 0x46, 0xbb, 0x8c, 0x81, 0xad, 0x7c, 0x1e, 0xe6, 0x8c, 0x68, 0xb9, 0xdd, 0x91, 0x8b, 0x7f, 0x80, 0xb6, 0xca, 0x30, 0xd5, 0xf3, 0x75, 0x37, 0x36, 0x4e, 0xec,
0x40, 0xca, 0x04, 0xdf, 0x86, 0xae, 0x52, 0x9d, 0xba, 0x9e, 0x51, 0xd3, 0x0b, 0xe3, 0x68, 0x4c, 0xc6, 0x32, 0x2a, 0x64, 0x65, 0x48, 0x78, 0xce, 0x8d, 0x0a, 0x79, 0x8e, 0xdf, 0xd5, 0xa0, 0xa3,
0x53, 0xb2, 0x93, 0xd9, 0x1d, 0xd9, 0xf8, 0x05, 0xb4, 0x44, 0x1e, 0x8b, 0x29, 0x43, 0xf5, 0x7f, 0x53, 0x38, 0x3a, 0x10, 0x32, 0x51, 0xa8, 0x5c, 0x66, 0x84, 0x9a, 0x6a, 0x3d, 0x72, 0xd1, 0x2d,
0xed, 0xd4, 0xfe, 0xcf, 0xa3, 0x82, 0xd7, 0x1f, 0xc9, 0xb3, 0x34, 0x2a, 0xf8, 0x39, 0x7e, 0x57, 0x58, 0xe7, 0x13, 0x2f, 0x0c, 0x65, 0x6e, 0xe7, 0x93, 0x3c, 0x8e, 0x26, 0xa4, 0xcf, 0x9e, 0xa6,
0x83, 0xb6, 0x2a, 0x14, 0xd1, 0x94, 0xf1, 0xbc, 0xf3, 0xf9, 0x32, 0x25, 0xd4, 0x10, 0xeb, 0x91, 0xc9, 0x8e, 0x6e, 0x43, 0x37, 0xbd, 0xa1, 0xd8, 0x2c, 0x56, 0xb2, 0x59, 0xd6, 0xc0, 0x01, 0xe5,
0x8d, 0x6e, 0xc0, 0x46, 0x38, 0x71, 0x82, 0x80, 0x57, 0x90, 0x6c, 0x29, 0x89, 0xa3, 0x09, 0xa9, 0x02, 0xdd, 0x85, 0xd5, 0xf4, 0xa2, 0xae, 0x0d, 0xf5, 0x63, 0x2a, 0xd8, 0x8a, 0x46, 0xeb, 0x9a,
0xb3, 0xa7, 0x49, 0x49, 0x41, 0xb7, 0xa1, 0x93, 0xdc, 0x10, 0x6c, 0x16, 0x2b, 0xd9, 0xac, 0x28, 0x71, 0x43, 0x57, 0xb2, 0x86, 0xaa, 0x64, 0x67, 0x0b, 0xb7, 0x52, 0x83, 0xea, 0x52, 0xe6, 0xc2,
0xe0, 0xc0, 0x0f, 0x19, 0xba, 0x0b, 0x6b, 0xc9, 0x45, 0x55, 0x27, 0x97, 0x4e, 0xa8, 0x93, 0xab, 0xf9, 0x7d, 0x12, 0xb8, 0x6a, 0x7f, 0x40, 0x83, 0x57, 0x1e, 0xf3, 0x55, 0xd8, 0xe4, 0xda, 0x0d,
0x0a, 0xad, 0x0a, 0xd8, 0x75, 0x55, 0x2f, 0xeb, 0xa2, 0x5e, 0x9e, 0xcf, 0xdd, 0x4a, 0x0c, 0xaa, 0xf1, 0x6d, 0xef, 0x40, 0xb7, 0x1b, 0xb5, 0x40, 0x3b, 0xd0, 0x50, 0xa6, 0x49, 0x6c, 0xdc, 0x9f,
0x0a, 0xa6, 0x0d, 0x17, 0x0f, 0x89, 0x67, 0x8b, 0xfd, 0x81, 0xef, 0x1d, 0x39, 0xd4, 0x15, 0x61, 0xd5, 0x11, 0xdb, 0xd4, 0x8a, 0x61, 0xf8, 0x9d, 0x01, 0x68, 0xc0, 0x88, 0x2d, 0x48, 0xa1, 0x48,
0x93, 0x69, 0x6d, 0xc4, 0x35, 0x9d, 0xa9, 0x6a, 0x6d, 0x62, 0x81, 0xf6, 0xa1, 0x2e, 0x4c, 0x53, 0x57, 0x8e, 0x1a, 0xdb, 0xd0, 0x55, 0x07, 0xba, 0x16, 0x24, 0x86, 0x5e, 0x96, 0x9b, 0xba, 0x1c,
0x5a, 0x0f, 0x32, 0x36, 0x35, 0x62, 0x18, 0x7e, 0xa7, 0x01, 0x1a, 0x50, 0x62, 0x32, 0x92, 0x6b, 0xe4, 0x4b, 0xfc, 0xe2, 0x29, 0x4a, 0x3c, 0xfe, 0x19, 0xce, 0x14, 0x38, 0x24, 0xd1, 0x98, 0xda,
0x05, 0x95, 0xc3, 0xcd, 0x2e, 0x74, 0xc4, 0x81, 0xaa, 0x05, 0xd2, 0xd0, 0x2b, 0x7c, 0x53, 0x95, 0xcb, 0x38, 0x85, 0xbd, 0x66, 0xfd, 0x5a, 0x3b, 0x9d, 0x5f, 0xf1, 0xdf, 0x06, 0xac, 0x3d, 0x39,
0x83, 0x6c, 0x23, 0x59, 0x3c, 0x43, 0x23, 0xc1, 0x3f, 0xc1, 0xb9, 0x1c, 0x07, 0x19, 0x8d, 0x89, 0xb0, 0x9d, 0xff, 0xd1, 0x02, 0x99, 0x33, 0x1b, 0x79, 0x67, 0x96, 0xd2, 0x7b, 0xe9, 0xfd, 0xd2,
0xbd, 0xb4, 0x33, 0xd8, 0x6b, 0xde, 0xaf, 0xb5, 0xb3, 0xf9, 0x15, 0xff, 0xa5, 0xc1, 0xfa, 0x93, 0xfb, 0x3e, 0xa0, 0xfc, 0xb3, 0xd2, 0xa9, 0x23, 0x09, 0x10, 0xe3, 0x54, 0x01, 0xb2, 0xfb, 0x97,
0xa9, 0x69, 0xfd, 0x87, 0x16, 0x48, 0x9d, 0x59, 0xcf, 0x3a, 0xb3, 0x90, 0xde, 0xcb, 0xef, 0x97, 0x01, 0x1d, 0x99, 0xc6, 0xfb, 0x84, 0x1d, 0x79, 0x0e, 0x41, 0x77, 0x54, 0xab, 0x54, 0x99, 0xbf,
0xde, 0xf7, 0x01, 0x65, 0x9f, 0x95, 0x4c, 0x38, 0x32, 0x40, 0xb4, 0x33, 0x05, 0x48, 0xff, 0x4f, 0x59, 0x7e, 0x53, 0x6e, 0x7a, 0x37, 0x8b, 0x76, 0x8f, 0xc7, 0xdb, 0x05, 0xf4, 0x39, 0x34, 0x93,
0x0d, 0xda, 0x3c, 0x8d, 0x0f, 0x09, 0x3d, 0x76, 0x2c, 0x82, 0xee, 0x88, 0x86, 0x2c, 0x32, 0x7f, 0x11, 0xbb, 0x74, 0xbb, 0x38, 0x78, 0x9b, 0x6b, 0x33, 0x65, 0x04, 0x2f, 0xa0, 0xaf, 0xa0, 0x9d,
0xab, 0xf8, 0xa6, 0xcc, 0xf7, 0x82, 0x9e, 0xb7, 0x7b, 0x3c, 0x50, 0x2f, 0xa0, 0xcf, 0xa0, 0x21, 0x0e, 0xf3, 0xe8, 0xc2, 0xac, 0xfc, 0xbc, 0x80, 0xb9, 0xea, 0x77, 0x7f, 0x31, 0x60, 0xa3, 0x38,
0x87, 0xfa, 0xc2, 0xed, 0xfc, 0xa8, 0xaf, 0xaf, 0xcf, 0x95, 0x11, 0xbc, 0x80, 0xbe, 0x84, 0x56, 0x04, 0xeb, 0x67, 0xfd, 0x08, 0x67, 0xe6, 0x4c, 0xc8, 0xe8, 0xa3, 0x82, 0x98, 0xea, 0xd9, 0xdc,
0xf2, 0xf9, 0x80, 0x2e, 0xcd, 0xcb, 0xcf, 0x0a, 0x28, 0x55, 0xdf, 0xff, 0x59, 0x83, 0xcd, 0xfc, 0xbc, 0x7a, 0x32, 0x30, 0x76, 0x80, 0x64, 0x51, 0x83, 0x8d, 0x64, 0xba, 0x1b, 0xd8, 0xc2, 0x3e,
0xd8, 0xad, 0x9e, 0xf5, 0x03, 0x9c, 0x2b, 0x99, 0xc9, 0xd1, 0x87, 0x39, 0x31, 0xd5, 0x5f, 0x03, 0xa0, 0xaf, 0x35, 0x8b, 0x21, 0x2c, 0xe7, 0x47, 0x59, 0x34, 0xe7, 0x15, 0xe6, 0x87, 0x33, 0x9a,
0xfa, 0xde, 0xe9, 0xc0, 0xd8, 0x01, 0x9c, 0x45, 0x0d, 0x36, 0xe5, 0x24, 0x39, 0x30, 0x99, 0x39, 0xca, 0x93, 0x25, 0x5e, 0x40, 0xf7, 0x01, 0xb2, 0x49, 0x16, 0x5d, 0x2c, 0x9b, 0xba, 0x38, 0xe2,
0xf5, 0x5f, 0x29, 0x16, 0x43, 0x58, 0xc9, 0x8e, 0xcd, 0xa8, 0xe4, 0x15, 0xfa, 0xff, 0xe7, 0x34, 0x9a, 0x73, 0x07, 0x4f, 0xbc, 0x80, 0x5e, 0x40, 0xaf, 0x38, 0xbb, 0x22, 0x5c, 0x40, 0xce, 0x9d,
0x15, 0xa7, 0x58, 0xbc, 0x80, 0xee, 0x03, 0xa4, 0x53, 0x33, 0xda, 0x2e, 0x9a, 0x3a, 0x3f, 0x4e, 0x83, 0xcd, 0xed, 0x63, 0x31, 0xa9, 0x15, 0x7e, 0x37, 0x60, 0x65, 0x3f, 0xc9, 0x43, 0xfd, 0xfe,
0xeb, 0xa5, 0x43, 0x2e, 0x5e, 0x40, 0xcf, 0xa1, 0x9b, 0x9f, 0x93, 0x11, 0xce, 0x21, 0x4b, 0x67, 0x11, 0xb4, 0xf4, 0xc8, 0x89, 0xce, 0x97, 0x49, 0xe7, 0x27, 0x5f, 0xf3, 0x42, 0xc5, 0x69, 0x6a,
0x6e, 0x7d, 0xf7, 0x44, 0x4c, 0x62, 0x85, 0xdf, 0x34, 0x58, 0x3d, 0x94, 0x79, 0xa8, 0xde, 0x3f, 0x81, 0x87, 0xd0, 0x4e, 0x27, 0xc1, 0x52, 0xb0, 0x94, 0x47, 0x52, 0xf3, 0x62, 0xd5, 0x71, 0x4a,
0x82, 0xa6, 0x1a, 0x6f, 0xd1, 0xc5, 0x22, 0xe9, 0xec, 0x94, 0xad, 0x5f, 0xaa, 0x38, 0x4d, 0x2c, 0xf6, 0x4f, 0x03, 0x56, 0x74, 0x72, 0x6b, 0xb2, 0x2f, 0xe0, 0xec, 0xfc, 0x49, 0x6a, 0xae, 0xdb,
0xf0, 0x10, 0x5a, 0xc9, 0xbc, 0x59, 0x08, 0x96, 0xe2, 0xe0, 0xab, 0x6f, 0x57, 0x1d, 0x27, 0x64, 0xae, 0x97, 0x09, 0x1f, 0x33, 0x82, 0xe1, 0x05, 0x34, 0x84, 0x66, 0x3c, 0x55, 0x09, 0x74, 0xa5,
0xff, 0xd0, 0x60, 0x55, 0x25, 0xb7, 0x22, 0xfb, 0x1c, 0xce, 0x97, 0x4f, 0x52, 0xa5, 0x6e, 0xbb, 0x98, 0x0b, 0x55, 0x33, 0x97, 0x39, 0xa7, 0xd2, 0xe1, 0x85, 0xdd, 0x67, 0xd0, 0x7b, 0x62, 0x4f,
0x56, 0x24, 0x7c, 0xc2, 0x08, 0x86, 0x17, 0xd0, 0x10, 0x1a, 0xf1, 0x54, 0xc5, 0xd0, 0x95, 0x7c, 0x7d, 0x12, 0xa4, 0x19, 0x3c, 0x80, 0xa5, 0xb8, 0xed, 0x23, 0xb3, 0x28, 0x39, 0x3f, 0x86, 0x98,
0x2e, 0x54, 0xcd, 0x5c, 0x7a, 0x49, 0xa5, 0xc3, 0x0b, 0xfd, 0x67, 0xd0, 0x7d, 0x62, 0xce, 0x5c, 0x9b, 0x73, 0xcf, 0x52, 0x83, 0x4c, 0x60, 0x79, 0x4f, 0xd6, 0x28, 0x2d, 0xf4, 0xb9, 0xfc, 0x55,
0xe2, 0x25, 0x19, 0x3c, 0x80, 0xe5, 0xb8, 0xed, 0x23, 0x3d, 0x2f, 0x39, 0x3b, 0x86, 0xe8, 0x5b, 0x34, 0xa7, 0x5b, 0xa1, 0x6b, 0xa5, 0x68, 0xa8, 0xee, 0x68, 0x15, 0x39, 0xfb, 0x87, 0x34, 0xfd,
0xa5, 0x67, 0x89, 0x41, 0x26, 0xb0, 0x72, 0xc0, 0x6b, 0x94, 0x12, 0xfa, 0x2d, 0xff, 0x02, 0x2b, 0x84, 0x38, 0x6f, 0x68, 0x94, 0x3e, 0xc1, 0x82, 0x4e, 0xae, 0x61, 0xa0, 0x4b, 0xe5, 0x92, 0x58,
0xe9, 0x56, 0xe8, 0x6a, 0x21, 0x1a, 0xaa, 0x3b, 0x5a, 0x45, 0xce, 0xfe, 0xce, 0x4d, 0x3f, 0x21, 0x6a, 0x67, 0xe6, 0x56, 0x35, 0x20, 0xb5, 0xf8, 0x63, 0x80, 0xac, 0x5c, 0x96, 0x52, 0x66, 0xa6,
0xd6, 0x6b, 0x3f, 0x4a, 0x9e, 0x60, 0x40, 0x3b, 0xd3, 0x30, 0xd0, 0xe5, 0x62, 0x49, 0x2c, 0xb4, 0x3d, 0x98, 0x97, 0x2a, 0xcf, 0xb5, 0xc0, 0x97, 0x4b, 0xea, 0xcf, 0x92, 0x4f, 0xff, 0x0d, 0x00,
0x33, 0x7d, 0xa7, 0x1a, 0x90, 0x58, 0xfc, 0x31, 0x40, 0x5a, 0x2e, 0x0b, 0x29, 0x33, 0xd7, 0x1e, 0x00, 0xff, 0xff, 0x1d, 0x9c, 0xae, 0xb8, 0x3a, 0x11, 0x00, 0x00,
0xf4, 0xcb, 0x95, 0xe7, 0x4a, 0xe0, 0xcb, 0x65, 0xf1, 0xf7, 0xcc, 0xad, 0x7f, 0x02, 0x00, 0x00,
0xff, 0xff, 0xdd, 0xe8, 0xfb, 0x77, 0xac, 0x11, 0x00, 0x00,
} }

View file

@ -3,6 +3,7 @@ package main
import ( import (
"context" "context"
"fmt" "fmt"
"frontend/money"
"html/template" "html/template"
"log" "log"
"net/http" "net/http"
@ -16,7 +17,10 @@ import (
) )
var ( var (
templates = template.Must(template.ParseGlob("templates/*.html")) templates = template.Must(template.New("").
Funcs(template.FuncMap{
"renderMoney": renderMoney,
}).ParseGlob("templates/*.html"))
) )
func ensureSessionID(next http.HandlerFunc) http.HandlerFunc { func ensureSessionID(next http.HandlerFunc) http.HandlerFunc {
@ -44,7 +48,7 @@ func ensureSessionID(next http.HandlerFunc) http.HandlerFunc {
} }
func (fe *frontendServer) homeHandler(w http.ResponseWriter, r *http.Request) { func (fe *frontendServer) homeHandler(w http.ResponseWriter, r *http.Request) {
log.Printf("[home] session_id=%+v currency=%s", sessionID(r), currentCurrency(r)) log.Printf("[home] session_id=%s currency=%s", sessionID(r), currentCurrency(r))
currencies, err := fe.getCurrencies(r.Context()) currencies, err := fe.getCurrencies(r.Context())
if err != nil { if err != nil {
http.Error(w, fmt.Sprintf("could not retrieve currencies: %+v", err), http.StatusInternalServerError) http.Error(w, fmt.Sprintf("could not retrieve currencies: %+v", err), http.StatusInternalServerError)
@ -67,10 +71,7 @@ func (fe *frontendServer) homeHandler(w http.ResponseWriter, r *http.Request) {
} }
ps := make([]productView, len(products)) ps := make([]productView, len(products))
for i, p := range products { for i, p := range products {
price, err := fe.convertCurrency(r.Context(), &pb.Money{ price, err := fe.convertCurrency(r.Context(), p.GetPriceUsd(), currentCurrency(r))
Amount: p.PriceUsd,
CurrencyCode: defaultCurrency,
}, currentCurrency(r))
if err != nil { if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError) http.Error(w, err.Error(), http.StatusInternalServerError)
return return
@ -113,9 +114,7 @@ func (fe *frontendServer) productHandler(w http.ResponseWriter, r *http.Request)
return return
} }
price, err := fe.convertCurrency(r.Context(), &pb.Money{ price, err := fe.convertCurrency(r.Context(), p.GetPriceUsd(), currentCurrency(r))
Amount: p.GetPriceUsd(),
CurrencyCode: defaultCurrency}, currentCurrency(r))
if err != nil { if err != nil {
http.Error(w, fmt.Sprintf("failed to convert currency: %+v", err), http.StatusInternalServerError) http.Error(w, fmt.Sprintf("failed to convert currency: %+v", err), http.StatusInternalServerError)
return return
@ -126,7 +125,6 @@ func (fe *frontendServer) productHandler(w http.ResponseWriter, r *http.Request)
http.Error(w, fmt.Sprintf("failed to get product recommendations: %+v", err), http.StatusInternalServerError) http.Error(w, fmt.Sprintf("failed to get product recommendations: %+v", err), http.StatusInternalServerError)
return return
} }
log.Printf("cart size=%d", len(cart))
product := struct { product := struct {
Item *pb.Product Item *pb.Product
@ -152,7 +150,7 @@ func (fe *frontendServer) addToCartHandler(w http.ResponseWriter, r *http.Reques
http.Error(w, "invalid form input", http.StatusBadRequest) http.Error(w, "invalid form input", http.StatusBadRequest)
return return
} }
log.Printf("[addToCart] product_id=%s qty=%d session_id=%+v", productID, quantity, sessionID(r)) log.Printf("[addToCart] product_id=%s qty=%d session_id=%s", productID, quantity, sessionID(r))
p, err := fe.getProduct(r.Context(), productID) p, err := fe.getProduct(r.Context(), productID)
if err != nil { if err != nil {
@ -169,7 +167,7 @@ func (fe *frontendServer) addToCartHandler(w http.ResponseWriter, r *http.Reques
} }
func (fe *frontendServer) emptyCartHandler(w http.ResponseWriter, r *http.Request) { func (fe *frontendServer) emptyCartHandler(w http.ResponseWriter, r *http.Request) {
log.Printf("[emptyCart] session_id=%+v", sessionID(r)) log.Printf("[emptyCart] session_id=%s", sessionID(r))
if err := fe.emptyCart(r.Context(), sessionID(r)); err != nil { if err := fe.emptyCart(r.Context(), sessionID(r)); err != nil {
http.Error(w, fmt.Sprintf("failed to empty cart: %+v", err), http.StatusInternalServerError) http.Error(w, fmt.Sprintf("failed to empty cart: %+v", err), http.StatusInternalServerError)
@ -180,7 +178,7 @@ func (fe *frontendServer) emptyCartHandler(w http.ResponseWriter, r *http.Reques
} }
func (fe *frontendServer) viewCartHandler(w http.ResponseWriter, r *http.Request) { func (fe *frontendServer) viewCartHandler(w http.ResponseWriter, r *http.Request) {
log.Printf("[viewCart] session_id=%+v", sessionID(r)) log.Printf("[viewCart] session_id=%s", sessionID(r))
currencies, err := fe.getCurrencies(r.Context()) currencies, err := fe.getCurrencies(r.Context())
if err != nil { if err != nil {
http.Error(w, fmt.Sprintf("could not retrieve currencies: %+v", err), http.StatusInternalServerError) http.Error(w, fmt.Sprintf("could not retrieve currencies: %+v", err), http.StatusInternalServerError)
@ -198,47 +196,132 @@ func (fe *frontendServer) viewCartHandler(w http.ResponseWriter, r *http.Request
return return
} }
shippingCost, err := fe.getShippingQuote(r.Context(), cart, currentCurrency(r))
if err != nil {
http.Error(w, fmt.Sprintf("failed to get shipping quote: %+v", err), http.StatusInternalServerError)
return
}
type cartItemView struct { type cartItemView struct {
Item *pb.Product Item *pb.Product
Quantity int32 Quantity int32
Price *pb.Money Price *pb.Money
} }
items := make([]cartItemView, len(cart)) items := make([]cartItemView, len(cart))
totalPrice := pb.Money{CurrencyCode: currentCurrency(r)}
for i, item := range cart { for i, item := range cart {
p, err := fe.getProduct(r.Context(), item.GetProductId()) p, err := fe.getProduct(r.Context(), item.GetProductId())
if err != nil { if err != nil {
http.Error(w, fmt.Sprintf("could not retrieve product #%s: %+v", item.GetProductId(), err), http.StatusInternalServerError) http.Error(w, fmt.Sprintf("could not retrieve product #%s: %+v", item.GetProductId(), err), http.StatusInternalServerError)
return return
} }
price, err := fe.convertCurrency(r.Context(), &pb.Money{ price, err := fe.convertCurrency(r.Context(), p.GetPriceUsd(), currentCurrency(r))
Amount: p.GetPriceUsd(),
CurrencyCode: defaultCurrency}, currentCurrency(r))
if err != nil { if err != nil {
http.Error(w, fmt.Sprintf("could not convert currency for product #%s: %+v", item.GetProductId(), err), http.StatusInternalServerError) http.Error(w, fmt.Sprintf("could not convert currency for product #%s: %+v", item.GetProductId(), err), http.StatusInternalServerError)
return return
} }
multPrice := multMoney(*price.GetAmount(), uint32(item.GetQuantity())) multPrice := money.MultiplySlow(*price, uint32(item.GetQuantity()))
items[i] = cartItemView{ items[i] = cartItemView{
Item: p, Item: p,
Quantity: item.GetQuantity(), Quantity: item.GetQuantity(),
Price: &pb.Money{Amount: &multPrice, CurrencyCode: price.GetCurrencyCode()}} Price: &multPrice}
totalPrice = money.Must(money.Sum(totalPrice, multPrice))
} }
totalPrice = money.Must(money.Sum(totalPrice, *shippingCost))
year := time.Now().Year()
if err := templates.ExecuteTemplate(w, "cart", map[string]interface{}{ if err := templates.ExecuteTemplate(w, "cart", map[string]interface{}{
"user_currency": currentCurrency(r), "user_currency": currentCurrency(r),
"currencies": currencies, "currencies": currencies,
"session_id": sessionID(r), "session_id": sessionID(r),
"recommendations": recommendations, "recommendations": recommendations,
"cart_size": len(cart), "cart_size": len(cart),
"shipping_cost": shippingCost,
"total_cost": totalPrice,
"items": items, "items": items,
"expiration_years": []int{year, year + 1, year + 2, year + 3, year + 4},
}); err != nil { }); err != nil {
log.Println(err) log.Println(err)
} }
} }
func (fe *frontendServer) placeOrderHandler(w http.ResponseWriter, r *http.Request) {
log.Printf("[checkout] session_id=%s", sessionID(r))
var (
email = r.FormValue("email")
streetAddress = r.FormValue("street_address")
zipCode, _ = strconv.ParseInt(r.FormValue("zip_code"), 10, 32)
city = r.FormValue("city")
state = r.FormValue("state")
country = r.FormValue("country")
ccNumber = r.FormValue("credit_card_number")
ccMonth, _ = strconv.ParseInt(r.FormValue("credit_card_expiration_month"), 10, 32)
ccYear, _ = strconv.ParseInt(r.FormValue("credit_card_expiration_year"), 10, 32)
ccCVV, _ = strconv.ParseInt(r.FormValue("credit_card_cvv"), 10, 32)
)
order, err := pb.NewCheckoutServiceClient(fe.checkoutSvcConn).
PlaceOrder(r.Context(), &pb.PlaceOrderRequest{
Email: email,
CreditCard: &pb.CreditCardInfo{
CreditCardNumber: ccNumber,
CreditCardExpirationMonth: int32(ccMonth),
CreditCardExpirationYear: int32(ccYear),
CreditCardCvv: int32(ccCVV)},
UserId: sessionID(r),
UserCurrency: currentCurrency(r),
Address: &pb.Address{
StreetAddress: streetAddress,
City: city,
State: state,
ZipCode: int32(zipCode),
Country: country},
})
if err != nil {
http.Error(w, fmt.Sprintf("failed to complete the order: %+v", err), http.StatusInternalServerError)
return
}
log.Printf("order #%s completed", order.GetOrder().GetOrderId())
order.GetOrder().GetItems()
recommendations, _ := fe.getRecommendations(r.Context(), sessionID(r), nil)
if err := templates.ExecuteTemplate(w, "order", map[string]interface{}{
"session_id": sessionID(r),
"user_currency": currentCurrency(r),
"order": order.GetOrder(),
"recommendations": recommendations,
}); err != nil {
log.Println(err)
}
}
func (fe *frontendServer) prepareCheckoutHandler(w http.ResponseWriter, r *http.Request) {
streetAddress := r.FormValue("street_address")
city := r.FormValue("city")
state := r.FormValue("state")
country := r.FormValue("country")
zipCode, _ := strconv.ParseInt(r.FormValue("country"), 10, 32)
log.Printf("[prepareCheckout] session_id=%+v", sessionID(r))
_, _ = pb.NewCheckoutServiceClient(fe.checkoutSvcConn).CreateOrder(r.Context(),
&pb.CreateOrderRequest{
UserId: sessionID(r),
UserCurrency: currentCurrency(r),
Address: &pb.Address{
StreetAddress: streetAddress,
City: city,
State: state,
ZipCode: int32(zipCode),
Country: country,
},
})
}
func (fe *frontendServer) logoutHandler(w http.ResponseWriter, r *http.Request) { func (fe *frontendServer) logoutHandler(w http.ResponseWriter, r *http.Request) {
log.Printf("[home] session_id=%+v", sessionID(r)) log.Printf("[logout] session_id=%s", sessionID(r))
for _, c := range r.Cookies() { for _, c := range r.Cookies() {
c.Expires = time.Now().Add(-time.Hour * 24 * 365) c.Expires = time.Now().Add(-time.Hour * 24 * 365)
c.MaxAge = -1 c.MaxAge = -1
@ -250,7 +333,7 @@ func (fe *frontendServer) logoutHandler(w http.ResponseWriter, r *http.Request)
func (fe *frontendServer) setCurrencyHandler(w http.ResponseWriter, r *http.Request) { func (fe *frontendServer) setCurrencyHandler(w http.ResponseWriter, r *http.Request) {
cur := r.FormValue("currency_code") cur := r.FormValue("currency_code")
log.Printf("[setCurrency] session_id=%+v code=%s", sessionID(r), cur) log.Printf("[setCurrency] session_id=%s code=%s", sessionID(r), cur)
if cur != "" { if cur != "" {
http.SetCookie(w, &http.Cookie{ http.SetCookie(w, &http.Cookie{
Name: cookieCurrency, Name: cookieCurrency,
@ -289,3 +372,7 @@ func cartIDs(c []*pb.CartItem) []string {
} }
return out return out
} }
func renderMoney(money pb.Money) string {
return fmt.Sprintf("%s %d.%02d", money.GetCurrencyCode(), money.GetUnits(), money.GetNanos()/10000000)
}

View file

@ -40,6 +40,12 @@ type frontendServer struct {
recommendationSvcAddr string recommendationSvcAddr string
recommendationSvcConn *grpc.ClientConn recommendationSvcConn *grpc.ClientConn
checkoutSvcAddr string
checkoutSvcConn *grpc.ClientConn
shippingSvcAddr string
shippingSvcConn *grpc.ClientConn
} }
func main() { func main() {
@ -55,6 +61,8 @@ func main() {
mustMapEnv(&svc.currencySvcAddr, "CURRENCY_SERVICE_ADDR") mustMapEnv(&svc.currencySvcAddr, "CURRENCY_SERVICE_ADDR")
mustMapEnv(&svc.cartSvcAddr, "CART_SERVICE_ADDR") mustMapEnv(&svc.cartSvcAddr, "CART_SERVICE_ADDR")
mustMapEnv(&svc.recommendationSvcAddr, "RECOMMENDATION_SERVICE_ADDR") mustMapEnv(&svc.recommendationSvcAddr, "RECOMMENDATION_SERVICE_ADDR")
mustMapEnv(&svc.checkoutSvcAddr, "CHECKOUT_SERVICE_ADDR")
mustMapEnv(&svc.shippingSvcAddr, "SHIPPING_SERVICE_ADDR")
var err error var err error
svc.currencySvcConn, err = grpc.DialContext(ctx, svc.currencySvcAddr, grpc.WithInsecure()) svc.currencySvcConn, err = grpc.DialContext(ctx, svc.currencySvcAddr, grpc.WithInsecure())
@ -71,7 +79,15 @@ func main() {
} }
svc.recommendationSvcConn, err = grpc.DialContext(ctx, svc.recommendationSvcAddr, grpc.WithInsecure()) svc.recommendationSvcConn, err = grpc.DialContext(ctx, svc.recommendationSvcAddr, grpc.WithInsecure())
if err != nil { if err != nil {
log.Fatalf("failed to connect recommendation service at %s: %+v", svc.recommendationSvcConn, err) log.Fatalf("failed to connect recommendation service at %s: %+v", svc.recommendationSvcAddr, err)
}
svc.shippingSvcConn, err = grpc.DialContext(ctx, svc.shippingSvcAddr, grpc.WithInsecure())
if err != nil {
log.Fatalf("failed to connect shipping service at %s: %+v", svc.shippingSvcAddr, err)
}
svc.checkoutSvcConn, err = grpc.DialContext(ctx, svc.checkoutSvcAddr, grpc.WithInsecure())
if err != nil {
log.Fatalf("failed to connect checkout service at %s: %+v", svc.checkoutSvcAddr, err)
} }
r := mux.NewRouter() r := mux.NewRouter()
@ -82,6 +98,7 @@ func main() {
r.HandleFunc("/cart/empty", ensureSessionID(svc.emptyCartHandler)).Methods(http.MethodPost) r.HandleFunc("/cart/empty", ensureSessionID(svc.emptyCartHandler)).Methods(http.MethodPost)
r.HandleFunc("/setCurrency", ensureSessionID(svc.setCurrencyHandler)).Methods(http.MethodPost) r.HandleFunc("/setCurrency", ensureSessionID(svc.setCurrencyHandler)).Methods(http.MethodPost)
r.HandleFunc("/logout", svc.logoutHandler).Methods(http.MethodGet) r.HandleFunc("/logout", svc.logoutHandler).Methods(http.MethodGet)
r.HandleFunc("/cart/checkout", ensureSessionID(svc.placeOrderHandler)).Methods(http.MethodPost)
r.PathPrefix("/static/").Handler(http.StripPrefix("/static/", http.FileServer(http.Dir("./static/")))) r.PathPrefix("/static/").Handler(http.StripPrefix("/static/", http.FileServer(http.Dir("./static/"))))
log.Printf("starting server on :" + srvPort) log.Printf("starting server on :" + srvPort)
log.Fatal(http.ListenAndServe("localhost:"+srvPort, r)) log.Fatal(http.ListenAndServe("localhost:"+srvPort, r))

View file

@ -1,50 +0,0 @@
package main
import (
"math"
pb "frontend/genproto"
)
// TODO(ahmetb): any logic below is flawed because I just realized we have no
// way of representing amounts like 17.07 because Fractional cannot store 07.
func multMoney(m pb.MoneyAmount, n uint32) pb.MoneyAmount {
out := m
for n > 1 {
out = sum(out, m)
n--
}
return out
}
func sum(m1, m2 pb.MoneyAmount) pb.MoneyAmount {
// TODO(ahmetb) this is copied from ./checkoutservice/money.go, find a
// better mult function.
f1, f2 := float64(m1.Fractional), float64(m2.Fractional)
lg1 := math.Max(1, math.Ceil(math.Log10(f1)))
if f1 == math.Pow(10, lg1) {
lg1++
}
lg2 := math.Max(1, math.Ceil(math.Log10(f2)))
if f2 == math.Pow(10, lg2) {
lg2++
}
lgMax := math.Max(lg1, lg2)
dSum := m1.Decimal + m2.Decimal
o1 := f1 * math.Pow(10, lgMax-lg1)
o2 := f2 * math.Pow(10, lgMax-lg2)
fSum := o1 + o2
if fSum >= math.Pow(10, lgMax) {
fSum -= math.Pow(10, lgMax)
dSum++
}
for int(fSum)%10 == 0 && fSum != 0 {
fSum = float64(int(fSum) / 10)
}
return pb.MoneyAmount{
Decimal: dSum,
Fractional: uint32(fSum)}
}

117
src/frontend/money/money.go Normal file
View file

@ -0,0 +1,117 @@
package money
import (
"errors"
pb "frontend/genproto"
)
const (
nanosMin = -999999999
nanosMax = +999999999
nanosMod = 1000000000
)
var (
ErrInvalidValue = errors.New("one of the specified money values is invalid")
ErrMismatchingCurrency = errors.New("mismatching currency codes")
)
// IsValid checks if specified value has a valid units/nanos signs and ranges.
func IsValid(m pb.Money) bool {
return signMatches(m) && validNanos(m.GetNanos())
}
func signMatches(m pb.Money) bool {
return m.GetNanos() == 0 || m.GetUnits() == 0 || (m.GetNanos() < 0) == (m.GetUnits() < 0)
}
func validNanos(nanos int32) bool { return nanosMin <= nanos && nanos <= nanosMax }
// IsZero returns true if the specified money value is equal to zero.
func IsZero(m pb.Money) bool { return m.GetUnits() == 0 && m.GetNanos() == 0 }
// IsPositive returns true if the specified money value is valid and is
// positive.
func IsPositive(m pb.Money) bool {
return IsValid(m) && m.GetUnits() > 0 || (m.GetUnits() == 0 && m.GetNanos() > 0)
}
// IsNegative returns true if the specified money value is valid and is
// negative.
func IsNegative(m pb.Money) bool {
return IsValid(m) && m.GetUnits() < 0 || (m.GetUnits() == 0 && m.GetNanos() < 0)
}
// AreSameCurrency returns true if values l and r have a currency code and
// they are the same values.
func AreSameCurrency(l, r pb.Money) bool {
return l.GetCurrencyCode() == r.GetCurrencyCode() && l.GetCurrencyCode() != ""
}
// AreEquals returns true if values l and r are the equal, including the
// currency. This does not check validity of the provided values.
func AreEquals(l, r pb.Money) bool {
return l.GetCurrencyCode() == r.GetCurrencyCode() &&
l.GetUnits() == r.GetUnits() && l.GetNanos() == r.GetNanos()
}
// Negate returns the same amount with the sign negated.
func Negate(m pb.Money) pb.Money {
return pb.Money{
Units: -m.GetUnits(),
Nanos: -m.GetNanos(),
CurrencyCode: m.GetCurrencyCode()}
}
// Must panics if the given error is not nil. This can be used with other
// functions like: "m := Must(Sum(a,b))".
func Must(v pb.Money, err error) pb.Money {
if err != nil {
panic(err)
}
return v
}
// Sum adds two values. Returns an error if one of the values are invalid or
// currency codes are not matching (unless currency code is unspecified for
// both).
func Sum(l, r pb.Money) (pb.Money, error) {
if !IsValid(l) || !IsValid(r) {
return pb.Money{}, ErrInvalidValue
} else if l.GetCurrencyCode() != r.GetCurrencyCode() {
return pb.Money{}, ErrMismatchingCurrency
}
units := l.GetUnits() + r.GetUnits()
nanos := l.GetNanos() + r.GetNanos()
if (units == 0 && nanos == 0) || (units > 0 && nanos >= 0) || (units < 0 && nanos <= 0) {
// same sign <units, nanos>
units += int64(nanos / nanosMod)
nanos = nanos % nanosMod
} else {
// different sign. nanos guaranteed to not to go over the limit
if units > 0 {
units--
nanos += nanosMod
} else {
units++
nanos -= nanosMod
}
}
return pb.Money{
Units: units,
Nanos: nanos,
CurrencyCode: l.GetCurrencyCode()}, nil
}
// MultiplySlow is a slow multiplication operation done through adding the value
// to itself n-1 times.
func MultiplySlow(m pb.Money, n uint32) pb.Money {
out := m
for n > 1 {
out = Must(Sum(out, m))
n--
}
return out
}

View file

@ -0,0 +1,231 @@
package money
import (
"fmt"
"reflect"
"testing"
pb "frontend/genproto"
)
func mmc(u int64, n int32, c string) pb.Money { return pb.Money{Units: u, Nanos: n, CurrencyCode: c} }
func mm(u int64, n int32) pb.Money { return mmc(u, n, "") }
func TestIsValid(t *testing.T) {
tests := []struct {
name string
in pb.Money
want bool
}{
{"valid -/-", mm(-981273891273, -999999999), true},
{"invalid -/+", mm(-981273891273, +999999999), false},
{"valid +/+", mm(981273891273, 999999999), true},
{"invalid +/-", mm(981273891273, -999999999), false},
{"invalid +/+overflow", mm(3, 1000000000), false},
{"invalid +/-overflow", mm(3, -1000000000), false},
{"invalid -/+overflow", mm(-3, 1000000000), false},
{"invalid -/-overflow", mm(-3, -1000000000), false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := IsValid(tt.in); got != tt.want {
t.Errorf("IsValid(%v) = %v, want %v", tt.in, got, tt.want)
}
})
}
}
func TestIsZero(t *testing.T) {
tests := []struct {
name string
in pb.Money
want bool
}{
{"zero", mm(0, 0), true},
{"not-zero (-/+)", mm(-1, +1), false},
{"not-zero (-/-)", mm(-1, -1), false},
{"not-zero (+/+)", mm(+1, +1), false},
{"not-zero (+/-)", mm(+1, -1), false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := IsZero(tt.in); got != tt.want {
t.Errorf("IsZero(%v) = %v, want %v", tt.in, got, tt.want)
}
})
}
}
func TestIsPositive(t *testing.T) {
tests := []struct {
name string
in pb.Money
want bool
}{
{"zero", mm(0, 0), false},
{"positive (+/+)", mm(+1, +1), true},
{"invalid (-/+)", mm(-1, +1), false},
{"negative (-/-)", mm(-1, -1), false},
{"invalid (+/-)", mm(+1, -1), false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := IsPositive(tt.in); got != tt.want {
t.Errorf("IsPositive(%v) = %v, want %v", tt.in, got, tt.want)
}
})
}
}
func TestIsNegative(t *testing.T) {
tests := []struct {
name string
in pb.Money
want bool
}{
{"zero", mm(0, 0), false},
{"positive (+/+)", mm(+1, +1), false},
{"invalid (-/+)", mm(-1, +1), false},
{"negative (-/-)", mm(-1, -1), true},
{"invalid (+/-)", mm(+1, -1), false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := IsNegative(tt.in); got != tt.want {
t.Errorf("IsNegative(%v) = %v, want %v", tt.in, got, tt.want)
}
})
}
}
func TestAreSameCurrency(t *testing.T) {
type args struct {
l pb.Money
r pb.Money
}
tests := []struct {
name string
args args
want bool
}{
{"both empty currency", args{mmc(1, 0, ""), mmc(2, 0, "")}, false},
{"left empty currency", args{mmc(1, 0, ""), mmc(2, 0, "USD")}, false},
{"right empty currency", args{mmc(1, 0, "USD"), mmc(2, 0, "")}, false},
{"mismatching", args{mmc(1, 0, "USD"), mmc(2, 0, "CAD")}, false},
{"matching", args{mmc(1, 0, "USD"), mmc(2, 0, "USD")}, true},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := AreSameCurrency(tt.args.l, tt.args.r); got != tt.want {
t.Errorf("AreSameCurrency([%v],[%v]) = %v, want %v", tt.args.l, tt.args.r, got, tt.want)
}
})
}
}
func TestAreEquals(t *testing.T) {
type args struct {
l pb.Money
r pb.Money
}
tests := []struct {
name string
args args
want bool
}{
{"equals", args{mmc(1, 2, "USD"), mmc(1, 2, "USD")}, true},
{"mismatching currency", args{mmc(1, 2, "USD"), mmc(1, 2, "CAD")}, false},
{"mismatching units", args{mmc(10, 20, "USD"), mmc(1, 20, "USD")}, false},
{"mismatching nanos", args{mmc(1, 2, "USD"), mmc(1, 20, "USD")}, false},
{"negated", args{mmc(1, 2, "USD"), mmc(-1, -2, "USD")}, false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := AreEquals(tt.args.l, tt.args.r); got != tt.want {
t.Errorf("AreEquals([%v],[%v]) = %v, want %v", tt.args.l, tt.args.r, got, tt.want)
}
})
}
}
func TestNegate(t *testing.T) {
tests := []struct {
name string
in pb.Money
want pb.Money
}{
{"zero", mm(0, 0), mm(0, 0)},
{"negative", mm(-1, -200), mm(1, 200)},
{"positive", mm(1, 200), mm(-1, -200)},
{"carries currency code", mmc(0, 0, "XXX"), mmc(0, 0, "XXX")},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := Negate(tt.in); !AreEquals(got, tt.want) {
t.Errorf("Negate([%v]) = %v, want %v", tt.in, got, tt.want)
}
})
}
}
func TestMust_pass(t *testing.T) {
v := Must(mm(2, 3), nil)
if !AreEquals(v, mm(2, 3)) {
t.Errorf("returned the wrong value: %v", v)
}
}
func TestMust_panic(t *testing.T) {
defer func() {
if r := recover(); r != nil {
t.Logf("panic captured: %v", r)
}
}()
Must(mm(2, 3), fmt.Errorf("some error"))
t.Fatal("this should not have executed due to the panic above")
}
func TestSum(t *testing.T) {
type args struct {
l pb.Money
r pb.Money
}
tests := []struct {
name string
args args
want pb.Money
wantErr error
}{
{"0+0=0", args{mm(0, 0), mm(0, 0)}, mm(0, 0), nil},
{"Error: currency code on left", args{mmc(0, 0, "XXX"), mm(0, 0)}, mm(0, 0), ErrMismatchingCurrency},
{"Error: currency code on right", args{mm(0, 0), mmc(0, 0, "YYY")}, mm(0, 0), ErrMismatchingCurrency},
{"Error: currency code mismatch", args{mmc(0, 0, "AAA"), mmc(0, 0, "BBB")}, mm(0, 0), ErrMismatchingCurrency},
{"Error: invalid +/-", args{mm(+1, -1), mm(0, 0)}, mm(0, 0), ErrInvalidValue},
{"Error: invalid -/+", args{mm(0, 0), mm(-1, +2)}, mm(0, 0), ErrInvalidValue},
{"Error: invalid nanos", args{mm(0, 1000000000), mm(1, 0)}, mm(0, 0), ErrInvalidValue},
{"both positive (no carry)", args{mm(2, 200000000), mm(2, 200000000)}, mm(4, 400000000), nil},
{"both positive (nanos=max)", args{mm(2, 111111111), mm(2, 888888888)}, mm(4, 999999999), nil},
{"both positive (carry)", args{mm(2, 200000000), mm(2, 900000000)}, mm(5, 100000000), nil},
{"both negative (no carry)", args{mm(-2, -200000000), mm(-2, -200000000)}, mm(-4, -400000000), nil},
{"both negative (carry)", args{mm(-2, -200000000), mm(-2, -900000000)}, mm(-5, -100000000), nil},
{"mixed (larger positive, just decimals)", args{mm(11, 0), mm(-2, 0)}, mm(9, 0), nil},
{"mixed (larger negative, just decimals)", args{mm(-11, 0), mm(2, 0)}, mm(-9, 0), nil},
{"mixed (larger positive, no borrow)", args{mm(11, 100000000), mm(-2, -100000000)}, mm(9, 0), nil},
{"mixed (larger positive, with borrow)", args{mm(11, 100000000), mm(-2, -9000000 /*.09*/)}, mm(9, 91000000 /*.091*/), nil},
{"mixed (larger negative, no borrow)", args{mm(-11, -100000000), mm(2, 100000000)}, mm(-9, 0), nil},
{"mixed (larger negative, with borrow)", args{mm(-11, -100000000), mm(2, 9000000 /*.09*/)}, mm(-9, -91000000 /*.091*/), nil},
{"0+negative", args{mm(0, 0), mm(-2, -100000000)}, mm(-2, -100000000), nil},
{"negative+0", args{mm(-2, -100000000), mm(0, 0)}, mm(-2, -100000000), nil},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := Sum(tt.args.l, tt.args.r)
if err != tt.wantErr {
t.Errorf("Sum([%v],[%v]): expected err=\"%v\" got=\"%v\"", tt.args.l, tt.args.r, tt.wantErr, err)
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("Sum([%v],[%v]) = %v, want %v", tt.args.l, tt.args.r, got, tt.want)
}
})
}
}

View file

@ -0,0 +1,13 @@
#!/bin/bash
set -ex
kubectl port-forward $(kubectl get pods -l app=currencyservice -o=name | head -n 1) 7000:31337 &
kubectl port-forward $(kubectl get pods -l app=recommendationservice -o=name | head -n 1) 8081:8080 &
kubectl port-forward $(kubectl get pods -l app=cartservice -o=name | head -n 1) 7070:7070 &
kubectl port-forward $(kubectl get pods -l app=productcatalogservice -o=name | head -n 1) 3550:3550 &
kubectl port-forward $(kubectl get pods -l app=checkoutservice -o=name | head -n 1) 5050:5050 &
set +x
trap "exit" INT TERM ERR
trap "kill 0" EXIT
wait

View file

@ -76,6 +76,21 @@ func (fe *frontendServer) convertCurrency(ctx context.Context, money *pb.Money,
ToCode: currency}) ToCode: currency})
} }
func (fe *frontendServer) getShippingQuote(ctx context.Context, items []*pb.CartItem, currency string) (*pb.Money, error) {
quote, err := pb.NewShippingServiceClient(fe.currencySvcConn).GetQuote(ctx,
&pb.GetQuoteRequest{
Address: nil,
Items: items})
if err != nil {
return nil, err
}
localized, err := fe.convertCurrency(ctx, quote.GetCostUsd(), currency)
if err != nil {
return nil, fmt.Errorf("failed to convert currency for shipping cost: %+v", err)
}
return localized, nil
}
func (fe *frontendServer) getRecommendations(ctx context.Context, userID string, productIDs []string) ([]*pb.Product, error) { func (fe *frontendServer) getRecommendations(ctx context.Context, userID string, productIDs []string) ([]*pb.Product, error) {
resp, err := pb.NewRecommendationServiceClient(fe.recommendationSvcConn).ListRecommendations(ctx, resp, err := pb.NewRecommendationServiceClient(fe.recommendationSvcConn).ListRecommendations(ctx,
&pb.ListRecommendationsRequest{UserId: userID, ProductIds: productIDs}) &pb.ListRecommendationsRequest{UserId: userID, ProductIds: productIDs})

View file

@ -4,12 +4,27 @@
<main role="main"> <main role="main">
<div class="py-5"> <div class="py-5">
<div class="container bg-light py-3 px-lg-5 py-lg-5"> <div class="container bg-light py-3 px-lg-5 py-lg-5">
<h1>Shopping Cart</h1>
{{ if eq (len $.items) 0 }} {{ if eq (len $.items) 0 }}
<p>Your shopping cart is empty.</p> <h3>Your shopping cart is empty!</h3>
<a class="btn btn-primary" href="/" role="button">Browse Products</a> <p>Items you add to your shopping cart will appear here.</p>
{{ end }} <a class="btn btn-primary" href="/" role="button">Browse Products &rarr; </a>
{{ else }}
<div class="row mb-3 py-2">
<div class="col">
<h3>{{ len $.items }} item
{{- if gt (len $.items) 1}}s{{end}}
in your Shopping Cart</h3>
</div>
<div class="col text-right">
<form method="POST" action="/cart/empty">
<button class="btn btn-secondary" type="submit">Empty cart</button>
<a class="btn btn-info" href="/" role="button">Browse more products &rarr; </a>
</form>
</div>
</div>
<hr>
{{ range $.items }} {{ range $.items }}
<div class="row pt-2 mb-2"> <div class="row pt-2 mb-2">
@ -24,26 +39,106 @@
<div class="col text-left"> <div class="col text-left">
Qty: {{.Quantity}}<br/> Qty: {{.Quantity}}<br/>
<strong> <strong>
{{.Price.CurrencyCode}} {{ renderMoney .Price}}
{{.Price.Amount.Decimal}}.
{{- .Price.Amount.Fractional}}{{- if lt .Price.Amount.Fractional 10}}0{{end}}
</strong> </strong>
</div> </div>
</div> </div>
{{ end }} {{ end }} <!-- range $.items-->
<div class="row pt-2 my-3">
<div class="col text-center">
<p class="text-muted my-0">Shipping Cost: <strong>{{ renderMoney .shipping_cost }}</strong></p>
Total Cost: <strong>{{ renderMoney .total_cost }}</strong>
</div>
</div>
{{ if $.items }} <hr/>
<div class="row mt-5"> <div class="row py-3 my-2">
<div class="col-8 offset-2"> <div class="col-12 col-lg-8 offset-lg-2">
<div class="d-flex justify-content-between align-items-center"> <h3>Checkout</h3>
<form method="POST" action="/cart/empty"> <form action="/cart/checkout" method="POST">
<button class="btn btn-secondary" type="submit">Empty Cart</button> <div class="form-row">
<div class="col-md-5 mb-4">
<label for="email">E-mail Address</label>
<input type="email" class="form-control" id="email"
name="email" value="someone@example.com" required>
</div>
<div class="col-md-5 mb-4">
<label for="street_address">Street Address</label>
<input type="text" class="form-control" name="street_address"
id="street_address" value="1600 Amphitheatre Parkway" required>
</div>
<div class="col-md-2 mb-4">
<label for="zip_code">Zip Code</label>
<input type="text" class="form-control"
name="zip_code" id="zip_code" value="94043" required pattern="\d{4,5}">
</div>
</div>
<div class="form-row">
<div class="col-md-5 mb-3">
<label for="city">City</label>
<input type="text" class="form-control" name="city" id="city"
value="Mountain View" required>
</div>
<div class="col-md-2 mb-3">
<label for="state">State</label>
<input type="text" class="form-control" name="state" id="state"
value="CA" required>
</div>
<div class="col-md-5 mb-3">
<label for="country">Country</label>
<input type="text" class="form-control" id="country"
placeholder="Country Name"
name="country" value="United States" required>
</div>
</div>
<div class="form-row">
<div class="col-md-6 mb-3">
<label for="credit_card_number">Credit Card Number</label>
<input type="text" class="form-control" id="credit_card_number"
name="credit_card_number"
placeholder="0000-0000-0000-0000"
value="4432-8015-6152-0454"
required pattern="\d{4}-\d{4}-\d{4}-\d{4}">
</div>
<div class="col-md-2 mb-3">
<label for="credit_card_expiration_month">Month</label>
<select name="credit_card_expiration_month" id="credit_card_expiration_month"
class="form-control">
<option value="1">January</option>
<option value="2">February</option>
<option value="3">March</option>
<option value="4">April</option>
<option value="5">May</option>
<option value="6">June</option>
<option value="7">July</option>
<option value="8">August</option>
<option value="9">September</option>
<option value="10">October</option>
<option value="11">November</option>
<option value="12">January</option>
</select>
</div>
<div class="col-md-2 mb-3">
<label for="credit_card_expiration_year">Year</label>
<select name="credit_card_expiration_year" id="credit_card_expiration_year"
class="form-control">
{{range $.expiration_years}}<option value="{{.}}">{{.}}</option>{{end}}
</select>
</div>
<div class="col-md-2 mb-3">
<label for="credit_card_cvv">CVV</label>
<input type="text" class="form-control" id="credit_card_cvv"
name="credit_card_cvv" value="672" required pattern="\d{3}">
</div>
</div>
<div class="form-row">
<button class="btn btn-primary" type="submit">Place your order &rarr;</button>
</div>
</form> </form>
<a class="btn btn-primary" href="/checkout" role="button">Proceed to Checkout</a>
</div> </div>
</div> </div>
</div> {{ end }} <!-- end if $.items -->
{{ end }}
{{ if $.recommendations}} {{ if $.recommendations}}
<hr/> <hr/>

View file

@ -1,6 +1,6 @@
{{ define "footer" }} {{ define "footer" }}
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js" integrity="sha384-smHYKdLADwkXOn1EmN1qk/HfnUcbVRZyYmZ4qpPea6sjB/pTJ0euyQp0Mk8ck+5T" crossorigin="anonymous"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js" integrity="sha384-smHYKdLADwkXOn1EmN1qk/HfnUcbVRZyYmZ4qpPea6sjB/pTJ0euyQp0Mk8ck+5T" crossorigin="anonymous"></script>
<small class="text-muted mx-auto">This is a demo application.</small> <small class="text-muted mx-auto">This is a demo application. ({{$.session_id}})</small>
</body> </body>
</html> </html>
{{ end }} {{ end }}

View file

@ -16,6 +16,7 @@
<a href="/" class="navbar-brand d-flex align-items-center"> <a href="/" class="navbar-brand d-flex align-items-center">
Hipster Shop Hipster Shop
</a> </a>
{{ if $.currencies }}
<form class="form-inline ml-auto" method="POST" action="/setCurrency" id="currency_form"> <form class="form-inline ml-auto" method="POST" action="/setCurrency" id="currency_form">
<select name="currency_code" class="form-control" <select name="currency_code" class="form-control"
onchange="document.getElementById('currency_form').submit();"> onchange="document.getElementById('currency_form').submit();">
@ -23,8 +24,9 @@
<option value="{{.}}" {{if eq . $.user_currency}}selected="selected"{{end}}>{{.}}</option> <option value="{{.}}" {{if eq . $.user_currency}}selected="selected"{{end}}>{{.}}</option>
{{end}} {{end}}
</select> </select>
<a class="btn btn-primary ml-2" href="/cart" role="button">View Cart ({{$.cart_size}})</a> <a class="btn btn-primary btn-light ml-2" href="/cart" role="button">View Cart ({{$.cart_size}})</a>
</form> </form>
{{ end }}
</div> </div>
</div> </div>
</header> </header>

View file

@ -38,9 +38,7 @@
</a> </a>
</div> </div>
<small class="text-muted"> <small class="text-muted">
{{.Price.CurrencyCode}} {{ renderMoney .Price }}
<strong>{{.Price.Amount.Decimal}}.{{.Price.Amount.Fractional}}
{{- if lt .Price.Amount.Fractional 10}}0{{end}}
</strong> </strong>
</small> </small>
</div> </div>

View file

@ -0,0 +1,20 @@
{{ define "order" }}
{{ template "header" . }}
<main role="main">
<div class="py-5">
<div class="container bg-light py-3 px-lg-5 py-lg-5">
<h3>
Your order is complete!
</h3>
<p>
Order Confirmation ID: {{ $.order }}
</p>
{{ template "recommendations" $.recommendations }}
</div>
</div>
</main>
{{ template "footer" . }}
{{ end }}

View file

@ -13,9 +13,7 @@
<h2>{{$.product.Item.Name}}</h2> <h2>{{$.product.Item.Name}}</h2>
<p class="text-muted"> <p class="text-muted">
{{$.product.Price.CurrencyCode}} {{ renderMoney $.product.Price}}
{{$.product.Price.Amount.Decimal}}.
{{- $.product.Price.Amount.Fractional}}{{- if lt $.product.Price.Amount.Fractional 10}}0{{end}}
</p> </p>
<hr/> <hr/>
<p> <p>
@ -30,15 +28,16 @@
<div class="input-group-prepend"> <div class="input-group-prepend">
<label class="input-group-text" for="quantity">Quantity</label> <label class="input-group-text" for="quantity">Quantity</label>
</div> </div>
<select name="quantity" id="quantity" class="custom-select"> <select name="quantity" id="quantity" class="custom-select form-control form-control-lg">
<option>1</option> <option>1</option>
<option>2</option> <option>2</option>
<option>3</option> <option>3</option>
<option>4</option> <option>4</option>
<option>5</option> <option>5</option>
<option>10</option>
</select> </select>
</div> </div>
<button type="submit" class="btn btn-secondary ml-3">Add to Cart</button> <button type="submit" class="btn btn-info btn-lg ml-3">Add to Cart</button>
</form> </form>
</div> </div>
</div> </div>

View file

@ -1,6 +1,6 @@
{{ define "recommendations" }} {{ define "recommendations" }}
<h5 class="text-muted">Similar products</h5> <h5 class="text-muted">Products you might like</h5>
<div class="row"> <div class="row my-2 py-3">
{{range . }} {{range . }}
<div class="col-3"> <div class="col-3">
<div class="card mb-3 box-shadow"> <div class="card mb-3 box-shadow">

View file

@ -58,7 +58,7 @@ module.exports = function charge(request) {
throw new ExpiredCreditCard(cardNumber.replace('-', ''), month, year); throw new ExpiredCreditCard(cardNumber.replace('-', ''), month, year);
console.log(`Transaction processed: ${cardType} ending ${cardNumber.substr(-4)} \ console.log(`Transaction processed: ${cardType} ending ${cardNumber.substr(-4)} \
Amount: ${amount.currency_code}${amount.amount.decimal}.${amount.amount.fractional}`) Amount: ${amount.currency_code}${amount.units}.${amount.nanos}`)
return { transaction_id: uuid() } return { transaction_id: uuid() }
} }

View file

@ -63,7 +63,7 @@ message Product {
string name = 2; string name = 2;
string description = 3; string description = 3;
string picture = 4; string picture = 4;
MoneyAmount price_usd = 5; Money price_usd = 5;
} }
message ListProductsResponse { message ListProductsResponse {
@ -95,7 +95,7 @@ message GetQuoteRequest {
} }
message GetQuoteResponse { message GetQuoteResponse {
MoneyAmount cost_usd = 1; Money cost_usd = 1;
} }
message ShipOrderRequest { message ShipOrderRequest {
@ -122,18 +122,22 @@ service CurrencyService {
rpc Convert(CurrencyConversionRequest) returns (Money) {} rpc Convert(CurrencyConversionRequest) returns (Money) {}
} }
// Represents an amount of money with its currency type.
// Describes a money amount without currency. For example, decimal=2 and
// fractional=500 (or fractional=5) makes up 2.5 units.
message MoneyAmount {
uint32 decimal = 1;
uint32 fractional = 2;
}
message Money { message Money {
// The 3-letter currency code defined in ISO 4217. // The 3-letter currency code defined in ISO 4217.
string currency_code = 1; string currency_code = 1;
MoneyAmount amount = 2;
// The whole units of the amount.
// For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar.
int64 units = 2;
// Number of nano (10^-9) units of the amount.
// The value must be between -999,999,999 and +999,999,999 inclusive.
// If `units` is positive, `nanos` must be positive or zero.
// If `units` is zero, `nanos` can be positive, zero, or negative.
// If `units` is negative, `nanos` must be negative or zero.
// For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
int32 nanos = 3;
} }
message GetSupportedCurrenciesResponse { message GetSupportedCurrenciesResponse {

View file

@ -35,7 +35,7 @@ func (m *CartItem) Reset() { *m = CartItem{} }
func (m *CartItem) String() string { return proto.CompactTextString(m) } func (m *CartItem) String() string { return proto.CompactTextString(m) }
func (*CartItem) ProtoMessage() {} func (*CartItem) ProtoMessage() {}
func (*CartItem) Descriptor() ([]byte, []int) { func (*CartItem) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{0} return fileDescriptor_demo_be349a9cb1cf0a0c, []int{0}
} }
func (m *CartItem) XXX_Unmarshal(b []byte) error { func (m *CartItem) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CartItem.Unmarshal(m, b) return xxx_messageInfo_CartItem.Unmarshal(m, b)
@ -81,7 +81,7 @@ func (m *AddItemRequest) Reset() { *m = AddItemRequest{} }
func (m *AddItemRequest) String() string { return proto.CompactTextString(m) } func (m *AddItemRequest) String() string { return proto.CompactTextString(m) }
func (*AddItemRequest) ProtoMessage() {} func (*AddItemRequest) ProtoMessage() {}
func (*AddItemRequest) Descriptor() ([]byte, []int) { func (*AddItemRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{1} return fileDescriptor_demo_be349a9cb1cf0a0c, []int{1}
} }
func (m *AddItemRequest) XXX_Unmarshal(b []byte) error { func (m *AddItemRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_AddItemRequest.Unmarshal(m, b) return xxx_messageInfo_AddItemRequest.Unmarshal(m, b)
@ -126,7 +126,7 @@ func (m *EmptyCartRequest) Reset() { *m = EmptyCartRequest{} }
func (m *EmptyCartRequest) String() string { return proto.CompactTextString(m) } func (m *EmptyCartRequest) String() string { return proto.CompactTextString(m) }
func (*EmptyCartRequest) ProtoMessage() {} func (*EmptyCartRequest) ProtoMessage() {}
func (*EmptyCartRequest) Descriptor() ([]byte, []int) { func (*EmptyCartRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{2} return fileDescriptor_demo_be349a9cb1cf0a0c, []int{2}
} }
func (m *EmptyCartRequest) XXX_Unmarshal(b []byte) error { func (m *EmptyCartRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_EmptyCartRequest.Unmarshal(m, b) return xxx_messageInfo_EmptyCartRequest.Unmarshal(m, b)
@ -164,7 +164,7 @@ func (m *GetCartRequest) Reset() { *m = GetCartRequest{} }
func (m *GetCartRequest) String() string { return proto.CompactTextString(m) } func (m *GetCartRequest) String() string { return proto.CompactTextString(m) }
func (*GetCartRequest) ProtoMessage() {} func (*GetCartRequest) ProtoMessage() {}
func (*GetCartRequest) Descriptor() ([]byte, []int) { func (*GetCartRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{3} return fileDescriptor_demo_be349a9cb1cf0a0c, []int{3}
} }
func (m *GetCartRequest) XXX_Unmarshal(b []byte) error { func (m *GetCartRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetCartRequest.Unmarshal(m, b) return xxx_messageInfo_GetCartRequest.Unmarshal(m, b)
@ -203,7 +203,7 @@ func (m *Cart) Reset() { *m = Cart{} }
func (m *Cart) String() string { return proto.CompactTextString(m) } func (m *Cart) String() string { return proto.CompactTextString(m) }
func (*Cart) ProtoMessage() {} func (*Cart) ProtoMessage() {}
func (*Cart) Descriptor() ([]byte, []int) { func (*Cart) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{4} return fileDescriptor_demo_be349a9cb1cf0a0c, []int{4}
} }
func (m *Cart) XXX_Unmarshal(b []byte) error { func (m *Cart) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Cart.Unmarshal(m, b) return xxx_messageInfo_Cart.Unmarshal(m, b)
@ -247,7 +247,7 @@ func (m *Empty) Reset() { *m = Empty{} }
func (m *Empty) String() string { return proto.CompactTextString(m) } func (m *Empty) String() string { return proto.CompactTextString(m) }
func (*Empty) ProtoMessage() {} func (*Empty) ProtoMessage() {}
func (*Empty) Descriptor() ([]byte, []int) { func (*Empty) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{5} return fileDescriptor_demo_be349a9cb1cf0a0c, []int{5}
} }
func (m *Empty) XXX_Unmarshal(b []byte) error { func (m *Empty) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Empty.Unmarshal(m, b) return xxx_messageInfo_Empty.Unmarshal(m, b)
@ -279,7 +279,7 @@ func (m *ListRecommendationsRequest) Reset() { *m = ListRecommendationsR
func (m *ListRecommendationsRequest) String() string { return proto.CompactTextString(m) } func (m *ListRecommendationsRequest) String() string { return proto.CompactTextString(m) }
func (*ListRecommendationsRequest) ProtoMessage() {} func (*ListRecommendationsRequest) ProtoMessage() {}
func (*ListRecommendationsRequest) Descriptor() ([]byte, []int) { func (*ListRecommendationsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{6} return fileDescriptor_demo_be349a9cb1cf0a0c, []int{6}
} }
func (m *ListRecommendationsRequest) XXX_Unmarshal(b []byte) error { func (m *ListRecommendationsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListRecommendationsRequest.Unmarshal(m, b) return xxx_messageInfo_ListRecommendationsRequest.Unmarshal(m, b)
@ -324,7 +324,7 @@ func (m *ListRecommendationsResponse) Reset() { *m = ListRecommendations
func (m *ListRecommendationsResponse) String() string { return proto.CompactTextString(m) } func (m *ListRecommendationsResponse) String() string { return proto.CompactTextString(m) }
func (*ListRecommendationsResponse) ProtoMessage() {} func (*ListRecommendationsResponse) ProtoMessage() {}
func (*ListRecommendationsResponse) Descriptor() ([]byte, []int) { func (*ListRecommendationsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{7} return fileDescriptor_demo_be349a9cb1cf0a0c, []int{7}
} }
func (m *ListRecommendationsResponse) XXX_Unmarshal(b []byte) error { func (m *ListRecommendationsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListRecommendationsResponse.Unmarshal(m, b) return xxx_messageInfo_ListRecommendationsResponse.Unmarshal(m, b)
@ -356,7 +356,7 @@ type Product struct {
Name string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` Name string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"`
Description string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"` Description string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"`
Picture string `protobuf:"bytes,4,opt,name=picture" json:"picture,omitempty"` Picture string `protobuf:"bytes,4,opt,name=picture" json:"picture,omitempty"`
PriceUsd *MoneyAmount `protobuf:"bytes,5,opt,name=price_usd,json=priceUsd" json:"price_usd,omitempty"` PriceUsd *Money `protobuf:"bytes,5,opt,name=price_usd,json=priceUsd" json:"price_usd,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -366,7 +366,7 @@ func (m *Product) Reset() { *m = Product{} }
func (m *Product) String() string { return proto.CompactTextString(m) } func (m *Product) String() string { return proto.CompactTextString(m) }
func (*Product) ProtoMessage() {} func (*Product) ProtoMessage() {}
func (*Product) Descriptor() ([]byte, []int) { func (*Product) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{8} return fileDescriptor_demo_be349a9cb1cf0a0c, []int{8}
} }
func (m *Product) XXX_Unmarshal(b []byte) error { func (m *Product) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Product.Unmarshal(m, b) return xxx_messageInfo_Product.Unmarshal(m, b)
@ -414,7 +414,7 @@ func (m *Product) GetPicture() string {
return "" return ""
} }
func (m *Product) GetPriceUsd() *MoneyAmount { func (m *Product) GetPriceUsd() *Money {
if m != nil { if m != nil {
return m.PriceUsd return m.PriceUsd
} }
@ -432,7 +432,7 @@ func (m *ListProductsResponse) Reset() { *m = ListProductsResponse{} }
func (m *ListProductsResponse) String() string { return proto.CompactTextString(m) } func (m *ListProductsResponse) String() string { return proto.CompactTextString(m) }
func (*ListProductsResponse) ProtoMessage() {} func (*ListProductsResponse) ProtoMessage() {}
func (*ListProductsResponse) Descriptor() ([]byte, []int) { func (*ListProductsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{9} return fileDescriptor_demo_be349a9cb1cf0a0c, []int{9}
} }
func (m *ListProductsResponse) XXX_Unmarshal(b []byte) error { func (m *ListProductsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListProductsResponse.Unmarshal(m, b) return xxx_messageInfo_ListProductsResponse.Unmarshal(m, b)
@ -470,7 +470,7 @@ func (m *GetProductRequest) Reset() { *m = GetProductRequest{} }
func (m *GetProductRequest) String() string { return proto.CompactTextString(m) } func (m *GetProductRequest) String() string { return proto.CompactTextString(m) }
func (*GetProductRequest) ProtoMessage() {} func (*GetProductRequest) ProtoMessage() {}
func (*GetProductRequest) Descriptor() ([]byte, []int) { func (*GetProductRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{10} return fileDescriptor_demo_be349a9cb1cf0a0c, []int{10}
} }
func (m *GetProductRequest) XXX_Unmarshal(b []byte) error { func (m *GetProductRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetProductRequest.Unmarshal(m, b) return xxx_messageInfo_GetProductRequest.Unmarshal(m, b)
@ -508,7 +508,7 @@ func (m *SearchProductsRequest) Reset() { *m = SearchProductsRequest{} }
func (m *SearchProductsRequest) String() string { return proto.CompactTextString(m) } func (m *SearchProductsRequest) String() string { return proto.CompactTextString(m) }
func (*SearchProductsRequest) ProtoMessage() {} func (*SearchProductsRequest) ProtoMessage() {}
func (*SearchProductsRequest) Descriptor() ([]byte, []int) { func (*SearchProductsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{11} return fileDescriptor_demo_be349a9cb1cf0a0c, []int{11}
} }
func (m *SearchProductsRequest) XXX_Unmarshal(b []byte) error { func (m *SearchProductsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SearchProductsRequest.Unmarshal(m, b) return xxx_messageInfo_SearchProductsRequest.Unmarshal(m, b)
@ -546,7 +546,7 @@ func (m *SearchProductsResponse) Reset() { *m = SearchProductsResponse{}
func (m *SearchProductsResponse) String() string { return proto.CompactTextString(m) } func (m *SearchProductsResponse) String() string { return proto.CompactTextString(m) }
func (*SearchProductsResponse) ProtoMessage() {} func (*SearchProductsResponse) ProtoMessage() {}
func (*SearchProductsResponse) Descriptor() ([]byte, []int) { func (*SearchProductsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{12} return fileDescriptor_demo_be349a9cb1cf0a0c, []int{12}
} }
func (m *SearchProductsResponse) XXX_Unmarshal(b []byte) error { func (m *SearchProductsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SearchProductsResponse.Unmarshal(m, b) return xxx_messageInfo_SearchProductsResponse.Unmarshal(m, b)
@ -585,7 +585,7 @@ func (m *GetQuoteRequest) Reset() { *m = GetQuoteRequest{} }
func (m *GetQuoteRequest) String() string { return proto.CompactTextString(m) } func (m *GetQuoteRequest) String() string { return proto.CompactTextString(m) }
func (*GetQuoteRequest) ProtoMessage() {} func (*GetQuoteRequest) ProtoMessage() {}
func (*GetQuoteRequest) Descriptor() ([]byte, []int) { func (*GetQuoteRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{13} return fileDescriptor_demo_be349a9cb1cf0a0c, []int{13}
} }
func (m *GetQuoteRequest) XXX_Unmarshal(b []byte) error { func (m *GetQuoteRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetQuoteRequest.Unmarshal(m, b) return xxx_messageInfo_GetQuoteRequest.Unmarshal(m, b)
@ -620,7 +620,7 @@ func (m *GetQuoteRequest) GetItems() []*CartItem {
} }
type GetQuoteResponse struct { type GetQuoteResponse struct {
CostUsd *MoneyAmount `protobuf:"bytes,1,opt,name=cost_usd,json=costUsd" json:"cost_usd,omitempty"` CostUsd *Money `protobuf:"bytes,1,opt,name=cost_usd,json=costUsd" json:"cost_usd,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -630,7 +630,7 @@ func (m *GetQuoteResponse) Reset() { *m = GetQuoteResponse{} }
func (m *GetQuoteResponse) String() string { return proto.CompactTextString(m) } func (m *GetQuoteResponse) String() string { return proto.CompactTextString(m) }
func (*GetQuoteResponse) ProtoMessage() {} func (*GetQuoteResponse) ProtoMessage() {}
func (*GetQuoteResponse) Descriptor() ([]byte, []int) { func (*GetQuoteResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{14} return fileDescriptor_demo_be349a9cb1cf0a0c, []int{14}
} }
func (m *GetQuoteResponse) XXX_Unmarshal(b []byte) error { func (m *GetQuoteResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetQuoteResponse.Unmarshal(m, b) return xxx_messageInfo_GetQuoteResponse.Unmarshal(m, b)
@ -650,7 +650,7 @@ func (m *GetQuoteResponse) XXX_DiscardUnknown() {
var xxx_messageInfo_GetQuoteResponse proto.InternalMessageInfo var xxx_messageInfo_GetQuoteResponse proto.InternalMessageInfo
func (m *GetQuoteResponse) GetCostUsd() *MoneyAmount { func (m *GetQuoteResponse) GetCostUsd() *Money {
if m != nil { if m != nil {
return m.CostUsd return m.CostUsd
} }
@ -669,7 +669,7 @@ func (m *ShipOrderRequest) Reset() { *m = ShipOrderRequest{} }
func (m *ShipOrderRequest) String() string { return proto.CompactTextString(m) } func (m *ShipOrderRequest) String() string { return proto.CompactTextString(m) }
func (*ShipOrderRequest) ProtoMessage() {} func (*ShipOrderRequest) ProtoMessage() {}
func (*ShipOrderRequest) Descriptor() ([]byte, []int) { func (*ShipOrderRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{15} return fileDescriptor_demo_be349a9cb1cf0a0c, []int{15}
} }
func (m *ShipOrderRequest) XXX_Unmarshal(b []byte) error { func (m *ShipOrderRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ShipOrderRequest.Unmarshal(m, b) return xxx_messageInfo_ShipOrderRequest.Unmarshal(m, b)
@ -714,7 +714,7 @@ func (m *ShipOrderResponse) Reset() { *m = ShipOrderResponse{} }
func (m *ShipOrderResponse) String() string { return proto.CompactTextString(m) } func (m *ShipOrderResponse) String() string { return proto.CompactTextString(m) }
func (*ShipOrderResponse) ProtoMessage() {} func (*ShipOrderResponse) ProtoMessage() {}
func (*ShipOrderResponse) Descriptor() ([]byte, []int) { func (*ShipOrderResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{16} return fileDescriptor_demo_be349a9cb1cf0a0c, []int{16}
} }
func (m *ShipOrderResponse) XXX_Unmarshal(b []byte) error { func (m *ShipOrderResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ShipOrderResponse.Unmarshal(m, b) return xxx_messageInfo_ShipOrderResponse.Unmarshal(m, b)
@ -756,7 +756,7 @@ func (m *Address) Reset() { *m = Address{} }
func (m *Address) String() string { return proto.CompactTextString(m) } func (m *Address) String() string { return proto.CompactTextString(m) }
func (*Address) ProtoMessage() {} func (*Address) ProtoMessage() {}
func (*Address) Descriptor() ([]byte, []int) { func (*Address) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{17} return fileDescriptor_demo_be349a9cb1cf0a0c, []int{17}
} }
func (m *Address) XXX_Unmarshal(b []byte) error { func (m *Address) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Address.Unmarshal(m, b) return xxx_messageInfo_Address.Unmarshal(m, b)
@ -811,58 +811,20 @@ func (m *Address) GetZipCode() int32 {
return 0 return 0
} }
// Describes a money amount without currency. For example, decimal=2 and // Represents an amount of money with its currency type.
// fractional=500 (or fractional=5) makes up 2.5 units.
type MoneyAmount struct {
Decimal uint32 `protobuf:"varint,1,opt,name=decimal" json:"decimal,omitempty"`
Fractional uint32 `protobuf:"varint,2,opt,name=fractional" json:"fractional,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *MoneyAmount) Reset() { *m = MoneyAmount{} }
func (m *MoneyAmount) String() string { return proto.CompactTextString(m) }
func (*MoneyAmount) ProtoMessage() {}
func (*MoneyAmount) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{18}
}
func (m *MoneyAmount) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_MoneyAmount.Unmarshal(m, b)
}
func (m *MoneyAmount) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_MoneyAmount.Marshal(b, m, deterministic)
}
func (dst *MoneyAmount) XXX_Merge(src proto.Message) {
xxx_messageInfo_MoneyAmount.Merge(dst, src)
}
func (m *MoneyAmount) XXX_Size() int {
return xxx_messageInfo_MoneyAmount.Size(m)
}
func (m *MoneyAmount) XXX_DiscardUnknown() {
xxx_messageInfo_MoneyAmount.DiscardUnknown(m)
}
var xxx_messageInfo_MoneyAmount proto.InternalMessageInfo
func (m *MoneyAmount) GetDecimal() uint32 {
if m != nil {
return m.Decimal
}
return 0
}
func (m *MoneyAmount) GetFractional() uint32 {
if m != nil {
return m.Fractional
}
return 0
}
type Money struct { type Money struct {
// The 3-letter currency code defined in ISO 4217. // The 3-letter currency code defined in ISO 4217.
CurrencyCode string `protobuf:"bytes,1,opt,name=currency_code,json=currencyCode" json:"currency_code,omitempty"` CurrencyCode string `protobuf:"bytes,1,opt,name=currency_code,json=currencyCode" json:"currency_code,omitempty"`
Amount *MoneyAmount `protobuf:"bytes,2,opt,name=amount" json:"amount,omitempty"` // The whole units of the amount.
// For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar.
Units int64 `protobuf:"varint,2,opt,name=units" json:"units,omitempty"`
// Number of nano (10^-9) units of the amount.
// The value must be between -999,999,999 and +999,999,999 inclusive.
// If `units` is positive, `nanos` must be positive or zero.
// If `units` is zero, `nanos` can be positive, zero, or negative.
// If `units` is negative, `nanos` must be negative or zero.
// For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
Nanos int32 `protobuf:"varint,3,opt,name=nanos" json:"nanos,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -872,7 +834,7 @@ func (m *Money) Reset() { *m = Money{} }
func (m *Money) String() string { return proto.CompactTextString(m) } func (m *Money) String() string { return proto.CompactTextString(m) }
func (*Money) ProtoMessage() {} func (*Money) ProtoMessage() {}
func (*Money) Descriptor() ([]byte, []int) { func (*Money) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{19} return fileDescriptor_demo_be349a9cb1cf0a0c, []int{18}
} }
func (m *Money) XXX_Unmarshal(b []byte) error { func (m *Money) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Money.Unmarshal(m, b) return xxx_messageInfo_Money.Unmarshal(m, b)
@ -899,11 +861,18 @@ func (m *Money) GetCurrencyCode() string {
return "" return ""
} }
func (m *Money) GetAmount() *MoneyAmount { func (m *Money) GetUnits() int64 {
if m != nil { if m != nil {
return m.Amount return m.Units
} }
return nil return 0
}
func (m *Money) GetNanos() int32 {
if m != nil {
return m.Nanos
}
return 0
} }
type GetSupportedCurrenciesResponse struct { type GetSupportedCurrenciesResponse struct {
@ -918,7 +887,7 @@ func (m *GetSupportedCurrenciesResponse) Reset() { *m = GetSupportedCurr
func (m *GetSupportedCurrenciesResponse) String() string { return proto.CompactTextString(m) } func (m *GetSupportedCurrenciesResponse) String() string { return proto.CompactTextString(m) }
func (*GetSupportedCurrenciesResponse) ProtoMessage() {} func (*GetSupportedCurrenciesResponse) ProtoMessage() {}
func (*GetSupportedCurrenciesResponse) Descriptor() ([]byte, []int) { func (*GetSupportedCurrenciesResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{20} return fileDescriptor_demo_be349a9cb1cf0a0c, []int{19}
} }
func (m *GetSupportedCurrenciesResponse) XXX_Unmarshal(b []byte) error { func (m *GetSupportedCurrenciesResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetSupportedCurrenciesResponse.Unmarshal(m, b) return xxx_messageInfo_GetSupportedCurrenciesResponse.Unmarshal(m, b)
@ -958,7 +927,7 @@ func (m *CurrencyConversionRequest) Reset() { *m = CurrencyConversionReq
func (m *CurrencyConversionRequest) String() string { return proto.CompactTextString(m) } func (m *CurrencyConversionRequest) String() string { return proto.CompactTextString(m) }
func (*CurrencyConversionRequest) ProtoMessage() {} func (*CurrencyConversionRequest) ProtoMessage() {}
func (*CurrencyConversionRequest) Descriptor() ([]byte, []int) { func (*CurrencyConversionRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{21} return fileDescriptor_demo_be349a9cb1cf0a0c, []int{20}
} }
func (m *CurrencyConversionRequest) XXX_Unmarshal(b []byte) error { func (m *CurrencyConversionRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CurrencyConversionRequest.Unmarshal(m, b) return xxx_messageInfo_CurrencyConversionRequest.Unmarshal(m, b)
@ -1006,7 +975,7 @@ func (m *CreditCardInfo) Reset() { *m = CreditCardInfo{} }
func (m *CreditCardInfo) String() string { return proto.CompactTextString(m) } func (m *CreditCardInfo) String() string { return proto.CompactTextString(m) }
func (*CreditCardInfo) ProtoMessage() {} func (*CreditCardInfo) ProtoMessage() {}
func (*CreditCardInfo) Descriptor() ([]byte, []int) { func (*CreditCardInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{22} return fileDescriptor_demo_be349a9cb1cf0a0c, []int{21}
} }
func (m *CreditCardInfo) XXX_Unmarshal(b []byte) error { func (m *CreditCardInfo) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CreditCardInfo.Unmarshal(m, b) return xxx_messageInfo_CreditCardInfo.Unmarshal(m, b)
@ -1066,7 +1035,7 @@ func (m *ChargeRequest) Reset() { *m = ChargeRequest{} }
func (m *ChargeRequest) String() string { return proto.CompactTextString(m) } func (m *ChargeRequest) String() string { return proto.CompactTextString(m) }
func (*ChargeRequest) ProtoMessage() {} func (*ChargeRequest) ProtoMessage() {}
func (*ChargeRequest) Descriptor() ([]byte, []int) { func (*ChargeRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{23} return fileDescriptor_demo_be349a9cb1cf0a0c, []int{22}
} }
func (m *ChargeRequest) XXX_Unmarshal(b []byte) error { func (m *ChargeRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChargeRequest.Unmarshal(m, b) return xxx_messageInfo_ChargeRequest.Unmarshal(m, b)
@ -1111,7 +1080,7 @@ func (m *ChargeResponse) Reset() { *m = ChargeResponse{} }
func (m *ChargeResponse) String() string { return proto.CompactTextString(m) } func (m *ChargeResponse) String() string { return proto.CompactTextString(m) }
func (*ChargeResponse) ProtoMessage() {} func (*ChargeResponse) ProtoMessage() {}
func (*ChargeResponse) Descriptor() ([]byte, []int) { func (*ChargeResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{24} return fileDescriptor_demo_be349a9cb1cf0a0c, []int{23}
} }
func (m *ChargeResponse) XXX_Unmarshal(b []byte) error { func (m *ChargeResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChargeResponse.Unmarshal(m, b) return xxx_messageInfo_ChargeResponse.Unmarshal(m, b)
@ -1150,7 +1119,7 @@ func (m *OrderItem) Reset() { *m = OrderItem{} }
func (m *OrderItem) String() string { return proto.CompactTextString(m) } func (m *OrderItem) String() string { return proto.CompactTextString(m) }
func (*OrderItem) ProtoMessage() {} func (*OrderItem) ProtoMessage() {}
func (*OrderItem) Descriptor() ([]byte, []int) { func (*OrderItem) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{25} return fileDescriptor_demo_be349a9cb1cf0a0c, []int{24}
} }
func (m *OrderItem) XXX_Unmarshal(b []byte) error { func (m *OrderItem) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_OrderItem.Unmarshal(m, b) return xxx_messageInfo_OrderItem.Unmarshal(m, b)
@ -1199,7 +1168,7 @@ func (m *OrderResult) Reset() { *m = OrderResult{} }
func (m *OrderResult) String() string { return proto.CompactTextString(m) } func (m *OrderResult) String() string { return proto.CompactTextString(m) }
func (*OrderResult) ProtoMessage() {} func (*OrderResult) ProtoMessage() {}
func (*OrderResult) Descriptor() ([]byte, []int) { func (*OrderResult) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{26} return fileDescriptor_demo_be349a9cb1cf0a0c, []int{25}
} }
func (m *OrderResult) XXX_Unmarshal(b []byte) error { func (m *OrderResult) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_OrderResult.Unmarshal(m, b) return xxx_messageInfo_OrderResult.Unmarshal(m, b)
@ -1266,7 +1235,7 @@ func (m *SendOrderConfirmationRequest) Reset() { *m = SendOrderConfirmat
func (m *SendOrderConfirmationRequest) String() string { return proto.CompactTextString(m) } func (m *SendOrderConfirmationRequest) String() string { return proto.CompactTextString(m) }
func (*SendOrderConfirmationRequest) ProtoMessage() {} func (*SendOrderConfirmationRequest) ProtoMessage() {}
func (*SendOrderConfirmationRequest) Descriptor() ([]byte, []int) { func (*SendOrderConfirmationRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{27} return fileDescriptor_demo_be349a9cb1cf0a0c, []int{26}
} }
func (m *SendOrderConfirmationRequest) XXX_Unmarshal(b []byte) error { func (m *SendOrderConfirmationRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SendOrderConfirmationRequest.Unmarshal(m, b) return xxx_messageInfo_SendOrderConfirmationRequest.Unmarshal(m, b)
@ -1313,7 +1282,7 @@ func (m *CreateOrderRequest) Reset() { *m = CreateOrderRequest{} }
func (m *CreateOrderRequest) String() string { return proto.CompactTextString(m) } func (m *CreateOrderRequest) String() string { return proto.CompactTextString(m) }
func (*CreateOrderRequest) ProtoMessage() {} func (*CreateOrderRequest) ProtoMessage() {}
func (*CreateOrderRequest) Descriptor() ([]byte, []int) { func (*CreateOrderRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{28} return fileDescriptor_demo_be349a9cb1cf0a0c, []int{27}
} }
func (m *CreateOrderRequest) XXX_Unmarshal(b []byte) error { func (m *CreateOrderRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CreateOrderRequest.Unmarshal(m, b) return xxx_messageInfo_CreateOrderRequest.Unmarshal(m, b)
@ -1366,7 +1335,7 @@ func (m *CreateOrderResponse) Reset() { *m = CreateOrderResponse{} }
func (m *CreateOrderResponse) String() string { return proto.CompactTextString(m) } func (m *CreateOrderResponse) String() string { return proto.CompactTextString(m) }
func (*CreateOrderResponse) ProtoMessage() {} func (*CreateOrderResponse) ProtoMessage() {}
func (*CreateOrderResponse) Descriptor() ([]byte, []int) { func (*CreateOrderResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{29} return fileDescriptor_demo_be349a9cb1cf0a0c, []int{28}
} }
func (m *CreateOrderResponse) XXX_Unmarshal(b []byte) error { func (m *CreateOrderResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CreateOrderResponse.Unmarshal(m, b) return xxx_messageInfo_CreateOrderResponse.Unmarshal(m, b)
@ -1415,7 +1384,7 @@ func (m *PlaceOrderRequest) Reset() { *m = PlaceOrderRequest{} }
func (m *PlaceOrderRequest) String() string { return proto.CompactTextString(m) } func (m *PlaceOrderRequest) String() string { return proto.CompactTextString(m) }
func (*PlaceOrderRequest) ProtoMessage() {} func (*PlaceOrderRequest) ProtoMessage() {}
func (*PlaceOrderRequest) Descriptor() ([]byte, []int) { func (*PlaceOrderRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{30} return fileDescriptor_demo_be349a9cb1cf0a0c, []int{29}
} }
func (m *PlaceOrderRequest) XXX_Unmarshal(b []byte) error { func (m *PlaceOrderRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PlaceOrderRequest.Unmarshal(m, b) return xxx_messageInfo_PlaceOrderRequest.Unmarshal(m, b)
@ -1481,7 +1450,7 @@ func (m *PlaceOrderResponse) Reset() { *m = PlaceOrderResponse{} }
func (m *PlaceOrderResponse) String() string { return proto.CompactTextString(m) } func (m *PlaceOrderResponse) String() string { return proto.CompactTextString(m) }
func (*PlaceOrderResponse) ProtoMessage() {} func (*PlaceOrderResponse) ProtoMessage() {}
func (*PlaceOrderResponse) Descriptor() ([]byte, []int) { func (*PlaceOrderResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{31} return fileDescriptor_demo_be349a9cb1cf0a0c, []int{30}
} }
func (m *PlaceOrderResponse) XXX_Unmarshal(b []byte) error { func (m *PlaceOrderResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PlaceOrderResponse.Unmarshal(m, b) return xxx_messageInfo_PlaceOrderResponse.Unmarshal(m, b)
@ -1527,7 +1496,6 @@ func init() {
proto.RegisterType((*ShipOrderRequest)(nil), "hipstershop.ShipOrderRequest") proto.RegisterType((*ShipOrderRequest)(nil), "hipstershop.ShipOrderRequest")
proto.RegisterType((*ShipOrderResponse)(nil), "hipstershop.ShipOrderResponse") proto.RegisterType((*ShipOrderResponse)(nil), "hipstershop.ShipOrderResponse")
proto.RegisterType((*Address)(nil), "hipstershop.Address") proto.RegisterType((*Address)(nil), "hipstershop.Address")
proto.RegisterType((*MoneyAmount)(nil), "hipstershop.MoneyAmount")
proto.RegisterType((*Money)(nil), "hipstershop.Money") proto.RegisterType((*Money)(nil), "hipstershop.Money")
proto.RegisterType((*GetSupportedCurrenciesResponse)(nil), "hipstershop.GetSupportedCurrenciesResponse") proto.RegisterType((*GetSupportedCurrenciesResponse)(nil), "hipstershop.GetSupportedCurrenciesResponse")
proto.RegisterType((*CurrencyConversionRequest)(nil), "hipstershop.CurrencyConversionRequest") proto.RegisterType((*CurrencyConversionRequest)(nil), "hipstershop.CurrencyConversionRequest")
@ -2294,100 +2262,99 @@ var _CheckoutService_serviceDesc = grpc.ServiceDesc{
Metadata: "demo.proto", Metadata: "demo.proto",
} }
func init() { proto.RegisterFile("demo.proto", fileDescriptor_demo_40506d781b7ed975) } func init() { proto.RegisterFile("demo.proto", fileDescriptor_demo_be349a9cb1cf0a0c) }
var fileDescriptor_demo_40506d781b7ed975 = []byte{ var fileDescriptor_demo_be349a9cb1cf0a0c = []byte{
// 1466 bytes of a gzipped FileDescriptorProto // 1442 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x58, 0xdd, 0x72, 0xd3, 0xc6, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x58, 0xdf, 0x72, 0xd3, 0xc6,
0x17, 0x8f, 0x9c, 0x38, 0xb6, 0x8f, 0x63, 0x27, 0x59, 0x12, 0xfe, 0x46, 0x81, 0x90, 0xff, 0x66, 0x17, 0x8e, 0x92, 0x38, 0x8e, 0x8f, 0x63, 0x27, 0x59, 0x12, 0x7e, 0x46, 0xe1, 0x4f, 0x7e, 0x9b,
0x4a, 0x43, 0xa1, 0x19, 0x30, 0xed, 0x70, 0x51, 0x5a, 0xca, 0x98, 0x8c, 0xf1, 0x0c, 0x14, 0xaa, 0x29, 0x0d, 0x05, 0x52, 0x70, 0x3b, 0xc3, 0x45, 0x69, 0x29, 0x63, 0x32, 0xc6, 0x33, 0x50, 0xa8,
0x40, 0xa7, 0x1d, 0x3a, 0x78, 0x84, 0xb4, 0xc1, 0x2a, 0xd6, 0x07, 0xab, 0x55, 0xa6, 0x66, 0x7a, 0x02, 0x1d, 0x3a, 0x74, 0xea, 0x11, 0xd2, 0x82, 0x55, 0x22, 0xad, 0x58, 0xad, 0x32, 0x35, 0xd3,
0x45, 0x5f, 0xa4, 0x57, 0xbd, 0xe8, 0x03, 0xb4, 0xef, 0xd0, 0xfb, 0xbe, 0x42, 0x9f, 0xa3, 0xb3, 0x2b, 0xfa, 0x16, 0x7d, 0x80, 0x5e, 0xf4, 0x01, 0xda, 0x77, 0xe8, 0x7d, 0x5f, 0xa1, 0xcf, 0xd1,
0xab, 0x5d, 0x7d, 0x59, 0x4a, 0xc2, 0x4d, 0x7b, 0xe7, 0xdd, 0xfd, 0xed, 0x39, 0xbf, 0x3d, 0xdf, 0xd9, 0xd5, 0xae, 0xfe, 0x59, 0x4a, 0xc2, 0x4d, 0x7b, 0xa7, 0xdd, 0xfd, 0xf6, 0x9c, 0x6f, 0xcf,
0x32, 0x80, 0x4d, 0x5c, 0x7f, 0x3f, 0xa0, 0x3e, 0xf3, 0x51, 0x7b, 0xe2, 0x04, 0x21, 0x23, 0x34, 0x9e, 0x73, 0xf6, 0xb3, 0x01, 0x5c, 0xe2, 0xd3, 0xbd, 0x90, 0x51, 0x4e, 0x51, 0x7b, 0xe2, 0x85,
0x9c, 0xf8, 0x01, 0x3e, 0x80, 0xe6, 0xc0, 0xa4, 0x6c, 0xc4, 0x88, 0x8b, 0x2e, 0x01, 0x04, 0xd4, 0x11, 0x27, 0x2c, 0x9a, 0xd0, 0x10, 0xef, 0xc3, 0xf2, 0xc0, 0x66, 0x7c, 0xc4, 0x89, 0x8f, 0x2e,
0xb7, 0x23, 0x8b, 0x8d, 0x1d, 0xbb, 0xa7, 0xed, 0x68, 0x7b, 0x2d, 0xa3, 0x25, 0x77, 0x46, 0x36, 0x00, 0x84, 0x8c, 0xba, 0xb1, 0xc3, 0xc7, 0x9e, 0xdb, 0x33, 0xb6, 0x8d, 0xdd, 0x96, 0xd5, 0x52,
0xd2, 0xa1, 0xf9, 0x26, 0x32, 0x3d, 0xe6, 0xb0, 0x59, 0xaf, 0xb6, 0xa3, 0xed, 0xd5, 0x8d, 0x64, 0x33, 0x23, 0x17, 0x99, 0xb0, 0xfc, 0x26, 0xb6, 0x03, 0xee, 0xf1, 0x69, 0x6f, 0x7e, 0xdb, 0xd8,
0x8d, 0x9f, 0x42, 0xf7, 0x9e, 0x6d, 0x73, 0x29, 0x06, 0x79, 0x13, 0x91, 0x90, 0xa1, 0xff, 0x41, 0x6d, 0x58, 0xe9, 0x18, 0x3f, 0x81, 0xee, 0x5d, 0xd7, 0x15, 0x56, 0x2c, 0xf2, 0x26, 0x26, 0x11,
0x23, 0x0a, 0x09, 0x4d, 0x25, 0x2d, 0xf3, 0xe5, 0xc8, 0x46, 0x57, 0x61, 0xc9, 0x61, 0xc4, 0x15, 0x47, 0xff, 0x83, 0x66, 0x1c, 0x11, 0x96, 0x59, 0x5a, 0x12, 0xc3, 0x91, 0x8b, 0xae, 0xc0, 0xa2,
0x22, 0xda, 0xfd, 0xcd, 0xfd, 0x0c, 0x9b, 0x7d, 0x45, 0xc5, 0x10, 0x10, 0x7c, 0x0d, 0xd6, 0x0e, 0xc7, 0x89, 0x2f, 0x4d, 0xb4, 0xfb, 0x9b, 0x7b, 0x39, 0x36, 0x7b, 0x9a, 0x8a, 0x25, 0x21, 0xf8,
0xdc, 0x80, 0xcd, 0xf8, 0xf6, 0x69, 0x72, 0xf1, 0x55, 0xe8, 0x0e, 0x09, 0x3b, 0x13, 0xf4, 0x21, 0x2a, 0xac, 0xed, 0xfb, 0x21, 0x9f, 0x8a, 0xe9, 0x93, 0xec, 0xe2, 0x2b, 0xd0, 0x1d, 0x12, 0x7e,
0x2c, 0x71, 0x5c, 0x35, 0xc7, 0x6b, 0x50, 0xe7, 0x04, 0xc2, 0x5e, 0x6d, 0x67, 0xb1, 0x9a, 0x64, 0x2a, 0xe8, 0x03, 0x58, 0x14, 0xb8, 0x7a, 0x8e, 0x57, 0xa1, 0x21, 0x08, 0x44, 0xbd, 0xf9, 0xed,
0x8c, 0xc1, 0x0d, 0xa8, 0x0b, 0x96, 0xf8, 0x1b, 0xd0, 0x1f, 0x3a, 0x21, 0x33, 0x88, 0xe5, 0xbb, 0x85, 0x7a, 0x92, 0x09, 0x06, 0x37, 0xa1, 0x21, 0x59, 0xe2, 0x6f, 0xc0, 0x7c, 0xe0, 0x45, 0xdc,
0x2e, 0xf1, 0x6c, 0x93, 0x39, 0xbe, 0x17, 0x9e, 0x6a, 0x90, 0xcb, 0xd0, 0x4e, 0xcd, 0x1e, 0xab, 0x22, 0x0e, 0xf5, 0x7d, 0x12, 0xb8, 0x36, 0xf7, 0x68, 0x10, 0x9d, 0x18, 0x90, 0x4b, 0xd0, 0xce,
0x6c, 0x19, 0x90, 0xd8, 0x3d, 0xc4, 0x5f, 0xc0, 0x56, 0xa9, 0xdc, 0x30, 0xf0, 0xbd, 0x90, 0x14, 0xc2, 0x9e, 0xb8, 0x6c, 0x59, 0x90, 0xc6, 0x3d, 0xc2, 0x5f, 0xc0, 0x56, 0xa5, 0xdd, 0x28, 0xa4,
0xef, 0x6b, 0x73, 0xf7, 0x7f, 0xd1, 0xa0, 0xf1, 0x24, 0x5e, 0xa2, 0x2e, 0xd4, 0x12, 0x02, 0x35, 0x41, 0x44, 0xca, 0xfb, 0x8d, 0x99, 0xfd, 0xbf, 0x18, 0xd0, 0x7c, 0x9c, 0x0c, 0x51, 0x17, 0xe6,
0xc7, 0x46, 0x08, 0x96, 0x3c, 0xd3, 0x25, 0xc2, 0x1b, 0x2d, 0x43, 0xfc, 0x46, 0x3b, 0xd0, 0xb6, 0x53, 0x02, 0xf3, 0x9e, 0x8b, 0x10, 0x2c, 0x06, 0xb6, 0x4f, 0xe4, 0x6d, 0xb4, 0x2c, 0xf9, 0x8d,
0x49, 0x68, 0x51, 0x27, 0xe0, 0x8a, 0x7a, 0x8b, 0xe2, 0x28, 0xbb, 0x85, 0x7a, 0xd0, 0x08, 0x1c, 0xb6, 0xa1, 0xed, 0x92, 0xc8, 0x61, 0x5e, 0x28, 0x1c, 0xf5, 0x16, 0xe4, 0x52, 0x7e, 0x0a, 0xf5,
0x8b, 0x45, 0x94, 0xf4, 0x96, 0xc4, 0xa9, 0x5a, 0xa2, 0x4f, 0xa1, 0x15, 0x50, 0xc7, 0x22, 0xe3, 0xa0, 0x19, 0x7a, 0x0e, 0x8f, 0x19, 0xe9, 0x2d, 0xca, 0x55, 0x3d, 0x44, 0x1f, 0x43, 0x2b, 0x64,
0x28, 0xb4, 0x7b, 0x75, 0xe1, 0xe2, 0x5e, 0xce, 0x7a, 0x8f, 0x7c, 0x8f, 0xcc, 0xee, 0xb9, 0x7e, 0x9e, 0x43, 0xc6, 0x71, 0xe4, 0xf6, 0x1a, 0xf2, 0x8a, 0x51, 0x21, 0x7a, 0x0f, 0x69, 0x40, 0xa6,
0xe4, 0x31, 0xa3, 0x29, 0xa0, 0xcf, 0x42, 0x1b, 0x3f, 0x80, 0x0d, 0xfe, 0x44, 0xc9, 0x32, 0x7d, 0xd6, 0xb2, 0x04, 0x3d, 0x8d, 0x5c, 0x7c, 0x1f, 0x36, 0xc4, 0xe1, 0x14, 0xbf, 0xec, 0x54, 0x37,
0xdb, 0x0d, 0x68, 0xca, 0x87, 0xc4, 0x0f, 0x6b, 0xf7, 0x37, 0x72, 0xd2, 0xe4, 0x05, 0x23, 0x41, 0x60, 0x59, 0x1d, 0x21, 0x39, 0x52, 0xbb, 0xbf, 0x51, 0xb0, 0xa3, 0x36, 0x58, 0x29, 0x0a, 0xef,
0xe1, 0x5d, 0x58, 0x1f, 0x12, 0x25, 0x48, 0xd9, 0xbe, 0xf0, 0x6a, 0xfc, 0x31, 0x6c, 0x1e, 0x12, 0xc0, 0xfa, 0x90, 0x68, 0x43, 0x3a, 0xea, 0xa5, 0xf3, 0xe2, 0xeb, 0xb0, 0x79, 0x40, 0x6c, 0xe6,
0x93, 0x5a, 0x93, 0x54, 0x61, 0x0c, 0xdc, 0x80, 0xfa, 0x9b, 0x88, 0xd0, 0x99, 0xc4, 0xc6, 0x0b, 0x4c, 0x32, 0x87, 0x09, 0x70, 0x03, 0x1a, 0x6f, 0x62, 0xc2, 0xa6, 0x0a, 0x9b, 0x0c, 0xf0, 0x7d,
0xfc, 0x00, 0xce, 0x17, 0xe1, 0x92, 0xdf, 0x3e, 0x34, 0x28, 0x09, 0xa3, 0xe9, 0x29, 0xf4, 0x14, 0x38, 0x5b, 0x86, 0x2b, 0x7e, 0x7b, 0xd0, 0x64, 0x24, 0x8a, 0x0f, 0x4f, 0xa0, 0xa7, 0x41, 0x38,
0x08, 0x7b, 0xb0, 0x3a, 0x24, 0xec, 0xeb, 0xc8, 0x67, 0x44, 0xa9, 0xdc, 0x87, 0x86, 0x69, 0xdb, 0x80, 0xd5, 0x21, 0xe1, 0x5f, 0xc7, 0x94, 0x13, 0xed, 0x72, 0x0f, 0x9a, 0xb6, 0xeb, 0x32, 0x12,
0x94, 0x84, 0xa1, 0x50, 0x5a, 0x14, 0x71, 0x2f, 0x3e, 0x33, 0x14, 0xe8, 0xfd, 0x62, 0x73, 0x08, 0x45, 0xd2, 0x69, 0xd9, 0xc4, 0xdd, 0x64, 0xcd, 0xd2, 0xa0, 0xf7, 0xcb, 0xca, 0xbb, 0xb0, 0x96,
0x6b, 0xa9, 0x3e, 0xc9, 0xf9, 0x16, 0x34, 0x2d, 0x3f, 0x64, 0xc2, 0x43, 0xda, 0x29, 0x1e, 0x6a, 0xf9, 0x53, 0x9c, 0xaf, 0xc3, 0xb2, 0x43, 0x23, 0x2e, 0xef, 0xc6, 0xa8, 0xbd, 0x9b, 0xa6, 0xc0,
0x70, 0x24, 0x77, 0x90, 0x0f, 0x6b, 0x87, 0x13, 0x27, 0x78, 0x4c, 0x6d, 0x42, 0xff, 0x15, 0xe6, 0x88, 0xab, 0xa1, 0xb0, 0x76, 0x30, 0xf1, 0xc2, 0x47, 0xcc, 0x25, 0xec, 0x5f, 0xe1, 0xfc, 0x29,
0x9f, 0xc0, 0x7a, 0x46, 0x61, 0x1a, 0xea, 0x8c, 0x9a, 0xd6, 0x6b, 0xc7, 0x7b, 0x95, 0xe6, 0x11, 0xac, 0xe7, 0x1c, 0x66, 0xe9, 0xcd, 0x99, 0xed, 0xbc, 0xf6, 0x82, 0x57, 0x59, 0xed, 0x80, 0x9e,
0xa8, 0xad, 0x91, 0x8d, 0x7f, 0xd5, 0xa0, 0x21, 0xf5, 0xa2, 0x3d, 0x58, 0x0b, 0x19, 0x25, 0x84, 0x1a, 0xb9, 0xf8, 0x57, 0x03, 0x9a, 0xca, 0x2f, 0xda, 0x85, 0xb5, 0x88, 0x33, 0x42, 0xf8, 0x58,
0x8d, 0x25, 0x81, 0xf1, 0x4d, 0x79, 0xa3, 0x1b, 0xef, 0x4b, 0xe0, 0xcd, 0x12, 0x64, 0x5f, 0x26, 0x11, 0x18, 0xdf, 0x54, 0x3b, 0xba, 0xc9, 0xbc, 0x02, 0xde, 0xac, 0x40, 0xf6, 0x55, 0x11, 0x14,
0x44, 0x1e, 0xd9, 0xe7, 0xe9, 0x62, 0xf1, 0xfa, 0x17, 0xe7, 0x84, 0xf8, 0xcd, 0x93, 0xc1, 0xe2, 0x91, 0x7d, 0x51, 0x22, 0x8e, 0xe8, 0x79, 0x49, 0x1d, 0xc8, 0x6f, 0x51, 0x00, 0x0e, 0x8d, 0x03,
0xc6, 0xa2, 0x33, 0x95, 0x0c, 0x72, 0x89, 0x2e, 0x40, 0xf3, 0xad, 0x13, 0x8c, 0x2d, 0xdf, 0x26, 0xce, 0xa6, 0xba, 0x00, 0xd4, 0x10, 0x9d, 0x83, 0xe5, 0xb7, 0x5e, 0x38, 0x76, 0xa8, 0x4b, 0x64,
0x22, 0x17, 0xea, 0x46, 0xe3, 0xad, 0x13, 0x0c, 0x7c, 0x9b, 0xe0, 0x21, 0xb4, 0x33, 0x76, 0xe6, 0xfe, 0x37, 0xac, 0xe6, 0x5b, 0x2f, 0x1c, 0x50, 0x97, 0xe0, 0x67, 0xd0, 0x90, 0x11, 0x46, 0x3b,
0x32, 0x6c, 0x62, 0x39, 0xae, 0x39, 0x15, 0x14, 0x3b, 0x86, 0x5a, 0xa2, 0x6d, 0x80, 0x23, 0x6a, 0xd0, 0x71, 0x62, 0xc6, 0x48, 0xe0, 0x4c, 0x13, 0x60, 0x42, 0x71, 0x45, 0x4f, 0x0a, 0xb4, 0x48,
0x5a, 0x3c, 0xed, 0xcc, 0xa9, 0x60, 0xd5, 0x31, 0x32, 0x3b, 0xf8, 0x05, 0xd4, 0x85, 0x20, 0xb4, 0xc8, 0x38, 0xf0, 0x78, 0x24, 0x59, 0x2d, 0x58, 0xc9, 0x40, 0xcc, 0x06, 0x76, 0x40, 0x23, 0xc9,
0x0b, 0x1d, 0x2b, 0xa2, 0x94, 0x78, 0xd6, 0x2c, 0xd6, 0x18, 0xbf, 0x75, 0x45, 0x6d, 0x72, 0xb5, 0xa6, 0x61, 0x25, 0x03, 0x3c, 0x84, 0x8b, 0x43, 0xc2, 0x0f, 0xe2, 0x30, 0xa4, 0x8c, 0x13, 0x77,
0xe8, 0x06, 0x2c, 0x9b, 0x42, 0xa3, 0x2c, 0xbf, 0xd5, 0x9e, 0x97, 0x38, 0x3c, 0x84, 0xed, 0x21, 0x90, 0xd8, 0xf1, 0x48, 0x96, 0xae, 0x1f, 0x40, 0xb7, 0xe0, 0x52, 0xf7, 0x89, 0x4e, 0xde, 0x67,
0x61, 0x87, 0x51, 0x10, 0xf8, 0x94, 0x11, 0x7b, 0x10, 0x4b, 0x73, 0x48, 0x9a, 0x03, 0x1f, 0x40, 0x84, 0xbf, 0x83, 0x73, 0x83, 0x74, 0x22, 0x38, 0x22, 0x2c, 0xf2, 0x68, 0xa0, 0xef, 0xfe, 0x32,
0x37, 0xa7, 0x58, 0x95, 0xa0, 0x4e, 0x56, 0x73, 0x88, 0xbf, 0x87, 0x0b, 0x83, 0x64, 0xc3, 0x3b, 0x2c, 0xbe, 0x64, 0xd4, 0x3f, 0x26, 0x75, 0xe4, 0xba, 0xe8, 0x74, 0x9c, 0x26, 0x07, 0x4b, 0x22,
0x26, 0x34, 0x74, 0x7c, 0x4f, 0x85, 0xd2, 0x15, 0x58, 0x3a, 0xa2, 0xbe, 0x2b, 0xe3, 0x08, 0xcd, 0xba, 0xc4, 0xa9, 0x0c, 0xc0, 0xdf, 0x06, 0x74, 0x07, 0x8c, 0xb8, 0x9e, 0x68, 0xd3, 0xee, 0x28,
0xb3, 0x32, 0xc4, 0x39, 0x2f, 0xa2, 0xcc, 0x8f, 0x9f, 0x17, 0x3b, 0x68, 0x99, 0xf9, 0xc2, 0x9e, 0x78, 0x49, 0xd1, 0x35, 0x40, 0x8e, 0x9c, 0x19, 0x3b, 0x36, 0x73, 0xc7, 0x41, 0xec, 0xbf, 0x20,
0x7f, 0x6b, 0xd0, 0x1d, 0x50, 0x62, 0x3b, 0xbc, 0x03, 0xd8, 0x23, 0xef, 0xc8, 0x47, 0xd7, 0x01, 0x4c, 0xc5, 0x63, 0xcd, 0x49, 0xb1, 0x5f, 0xc9, 0x79, 0x74, 0x19, 0x56, 0xf3, 0x68, 0xe7, 0xe8,
0x59, 0x62, 0x67, 0x6c, 0x99, 0xd4, 0x1e, 0x7b, 0x91, 0xfb, 0x92, 0x50, 0x69, 0x95, 0x35, 0x2b, 0x48, 0xbd, 0x44, 0x9d, 0x0c, 0x3a, 0x38, 0x3a, 0x42, 0x9f, 0xc3, 0x56, 0x1e, 0x47, 0x7e, 0x0c,
0xc1, 0x7e, 0x25, 0xf6, 0xd1, 0x15, 0x58, 0xcd, 0xa2, 0xad, 0xe3, 0x63, 0xd9, 0xe4, 0x3a, 0x29, 0x3d, 0x26, 0xbb, 0xe6, 0x78, 0x4a, 0x6c, 0xa6, 0x62, 0xd7, 0xcb, 0xf6, 0xec, 0xa7, 0x80, 0x6f,
0x74, 0x70, 0x7c, 0x8c, 0x3e, 0x87, 0xad, 0x2c, 0x8e, 0xfc, 0x18, 0x38, 0x54, 0x14, 0xe4, 0xf1, 0x89, 0xcd, 0xd0, 0x1d, 0x38, 0x5f, 0xb3, 0xdd, 0xa7, 0x01, 0x9f, 0xc8, 0x2b, 0x6f, 0x58, 0xe7,
0x8c, 0x98, 0x54, 0x04, 0x46, 0xdd, 0xe8, 0xa5, 0x77, 0x0e, 0x12, 0xc0, 0x77, 0xc4, 0xa4, 0xe8, 0xaa, 0xf6, 0x3f, 0x14, 0x00, 0x3c, 0x85, 0xce, 0x60, 0x62, 0xb3, 0x57, 0x69, 0xa9, 0x7f, 0x04,
0x2e, 0x5c, 0xac, 0xb8, 0xee, 0xfa, 0x1e, 0x9b, 0x88, 0x08, 0xaa, 0x1b, 0x17, 0xca, 0xee, 0x3f, 0x4b, 0xb6, 0x2f, 0x32, 0xe4, 0x98, 0xe0, 0x29, 0x04, 0xba, 0x0d, 0xed, 0x9c, 0x77, 0xf5, 0x4e,
0xe2, 0x00, 0x3c, 0x83, 0xce, 0x60, 0x62, 0xd2, 0x57, 0x49, 0xfd, 0xf8, 0x28, 0x71, 0x69, 0xb5, 0x6e, 0x15, 0x0b, 0xa7, 0x10, 0x44, 0x0b, 0x32, 0x26, 0xf8, 0x16, 0x74, 0xb5, 0xeb, 0xec, 0xea,
0xf1, 0x24, 0x02, 0xdd, 0x81, 0x76, 0x46, 0xbb, 0x8c, 0x81, 0xad, 0x7c, 0x1e, 0xe6, 0x8c, 0x68, 0x39, 0xb3, 0x83, 0xc8, 0x76, 0xe4, 0x11, 0xd2, 0x1a, 0xea, 0xe4, 0x66, 0x47, 0x2e, 0xfe, 0x1e,
0x40, 0xca, 0x04, 0xdf, 0x86, 0xae, 0x52, 0x9d, 0xba, 0x9e, 0x51, 0xd3, 0x0b, 0xe3, 0x68, 0x4c, 0x5a, 0xb2, 0xf0, 0xa4, 0x14, 0xd0, 0x8f, 0xb4, 0x71, 0xe2, 0x23, 0x2d, 0xb2, 0x42, 0x34, 0x0c,
0x53, 0xb2, 0x93, 0xd9, 0x1d, 0xd9, 0xf8, 0x05, 0xb4, 0x44, 0x1e, 0x8b, 0x29, 0x43, 0xf5, 0x7f, 0xc5, 0xb3, 0x32, 0x2b, 0xc4, 0x3a, 0x7e, 0x37, 0x0f, 0x6d, 0x5d, 0xd9, 0xf1, 0x21, 0x17, 0x85,
0xed, 0xd4, 0xfe, 0xcf, 0xa3, 0x82, 0xd7, 0x1f, 0xc9, 0xb3, 0x34, 0x2a, 0xf8, 0x39, 0x7e, 0x57, 0x42, 0xc5, 0x30, 0x23, 0xd4, 0x94, 0xe3, 0x91, 0x8b, 0x6e, 0xc0, 0x46, 0x34, 0xf1, 0xc2, 0x50,
0x83, 0xb6, 0x2a, 0x14, 0xd1, 0x94, 0xf1, 0xbc, 0xf3, 0xf9, 0x32, 0x25, 0xd4, 0x10, 0xeb, 0x91, 0x94, 0x7c, 0xbe, 0xf6, 0x93, 0x6c, 0x42, 0x7a, 0xed, 0x49, 0xda, 0x03, 0xd0, 0x2d, 0xe8, 0xa4,
0x8d, 0x6e, 0xc0, 0x46, 0x38, 0x71, 0x82, 0x80, 0x57, 0x90, 0x6c, 0x29, 0x89, 0xa3, 0x09, 0xa9, 0x3b, 0x24, 0x9b, 0x85, 0x5a, 0x36, 0x2b, 0x1a, 0x38, 0xa0, 0x11, 0x47, 0x77, 0x60, 0x2d, 0xdd,
0xb3, 0xa7, 0x49, 0x49, 0x41, 0xb7, 0xa1, 0x93, 0xdc, 0x10, 0x6c, 0x16, 0x2b, 0xd9, 0xac, 0x28, 0xa8, 0x1b, 0xdb, 0xe2, 0x31, 0x8d, 0x6d, 0x55, 0xa3, 0x75, 0xc7, 0xb9, 0xa6, 0x1b, 0x5c, 0x43,
0xe0, 0xc0, 0x0f, 0x19, 0xba, 0x0b, 0x6b, 0xc9, 0x45, 0x55, 0x27, 0x97, 0x4e, 0xa8, 0x93, 0xab, 0x36, 0xb8, 0xb3, 0x85, 0x5d, 0x69, 0x40, 0x75, 0x87, 0x73, 0xe1, 0xfc, 0x01, 0x09, 0x5c, 0x39,
0x0a, 0xad, 0x0a, 0xd8, 0x75, 0x55, 0x2f, 0xeb, 0xa2, 0x5e, 0x9e, 0xcf, 0xdd, 0x4a, 0x0c, 0xaa, 0x3f, 0xa0, 0xc1, 0x4b, 0x8f, 0xf9, 0x32, 0x6d, 0x72, 0xaf, 0x10, 0xf1, 0x6d, 0xef, 0x50, 0xbf,
0x0a, 0xa6, 0x0d, 0x17, 0x0f, 0x89, 0x67, 0x8b, 0xfd, 0x81, 0xef, 0x1d, 0x39, 0xd4, 0x15, 0x61, 0x42, 0x72, 0x80, 0xf6, 0xa0, 0x21, 0x43, 0xa3, 0x62, 0xdc, 0x9b, 0xf5, 0x91, 0xc4, 0xd4, 0x4a,
0x93, 0x69, 0x6d, 0xc4, 0x35, 0x9d, 0xa9, 0x6a, 0x6d, 0x62, 0x81, 0xf6, 0xa1, 0x2e, 0x4c, 0x53, 0x60, 0xf8, 0x9d, 0x01, 0x68, 0xc0, 0x88, 0xcd, 0x49, 0xa1, 0x77, 0xd7, 0x2a, 0x90, 0x1d, 0xe8,
0x5a, 0x0f, 0x32, 0x36, 0x35, 0x62, 0x18, 0x7e, 0xa7, 0x01, 0x1a, 0x50, 0x62, 0x32, 0x92, 0x6b, 0xc8, 0x05, 0xdd, 0x0b, 0x54, 0xa0, 0x57, 0xc4, 0xa4, 0x6e, 0x07, 0xf9, 0xce, 0xbf, 0x70, 0x8a,
0x05, 0x95, 0xc3, 0xcd, 0x2e, 0x74, 0xc4, 0x81, 0xaa, 0x05, 0xd2, 0xd0, 0x2b, 0x7c, 0x53, 0x95, 0xce, 0x8f, 0x7f, 0x82, 0x33, 0x05, 0x0e, 0x2a, 0x1b, 0xd3, 0x78, 0x19, 0xa7, 0x88, 0xd7, 0xec,
0x83, 0x6c, 0x23, 0x59, 0x3c, 0x43, 0x23, 0xc1, 0x3f, 0xc1, 0xb9, 0x1c, 0x07, 0x19, 0x8d, 0x89, 0xbd, 0xce, 0x9f, 0xee, 0x5e, 0xf1, 0x5f, 0x06, 0xac, 0x3f, 0x3e, 0xb4, 0x9d, 0xff, 0x30, 0x02,
0xbd, 0xb4, 0x33, 0xd8, 0x6b, 0xde, 0xaf, 0xb5, 0xb3, 0xf9, 0x15, 0xff, 0xa5, 0xc1, 0xfa, 0x93, 0xd9, 0x65, 0x36, 0xf2, 0x97, 0x59, 0x2a, 0xef, 0xa5, 0xf7, 0x2b, 0xef, 0x7b, 0x80, 0xf2, 0xc7,
0xa9, 0x69, 0xfd, 0x87, 0x16, 0x48, 0x9d, 0x59, 0xcf, 0x3a, 0xb3, 0x90, 0xde, 0xcb, 0xef, 0x97, 0x4a, 0xc5, 0x88, 0x4a, 0x10, 0xe3, 0x54, 0x09, 0xd2, 0xff, 0xd3, 0x80, 0xb6, 0x28, 0xe3, 0x03,
0xde, 0xf7, 0x01, 0x65, 0x9f, 0x95, 0x4c, 0x38, 0x32, 0x40, 0xb4, 0x33, 0x05, 0x48, 0xff, 0x4f, 0xc2, 0x8e, 0x3c, 0x87, 0xa0, 0xdb, 0xf2, 0x05, 0x95, 0x95, 0xbf, 0x55, 0x3e, 0x53, 0x4e, 0xd4,
0x0d, 0xda, 0x3c, 0x8d, 0x0f, 0x09, 0x3d, 0x76, 0x2c, 0x82, 0xee, 0x88, 0x86, 0x2c, 0x32, 0x7f, 0x9b, 0xc5, 0xb8, 0x27, 0xaa, 0x77, 0x0e, 0x7d, 0x06, 0x4d, 0xa5, 0xbc, 0x4b, 0xbb, 0x8b, 0x7a,
0xab, 0xf8, 0xa6, 0xcc, 0xf7, 0x82, 0x9e, 0xb7, 0x7b, 0x3c, 0x50, 0x2f, 0xa0, 0xcf, 0xa0, 0x21, 0xdc, 0x5c, 0x9f, 0x69, 0x23, 0x78, 0x0e, 0x7d, 0x09, 0xad, 0x54, 0xe3, 0xa3, 0x0b, 0xb3, 0xf6,
0x87, 0xfa, 0xc2, 0xed, 0xfc, 0xa8, 0xaf, 0xaf, 0xcf, 0x95, 0x11, 0xbc, 0x80, 0xbe, 0x84, 0x56, 0xf3, 0x06, 0x2a, 0xdd, 0xf7, 0x7f, 0x36, 0x60, 0xb3, 0xa8, 0x8d, 0xf5, 0xb1, 0x7e, 0x80, 0x33,
0xf2, 0xf9, 0x80, 0x2e, 0xcd, 0xcb, 0xcf, 0x0a, 0x28, 0x55, 0xdf, 0xff, 0x59, 0x83, 0xcd, 0xfc, 0x15, 0xc2, 0x19, 0x7d, 0x58, 0x30, 0x53, 0x2f, 0xd9, 0xcd, 0xdd, 0x93, 0x81, 0xc9, 0x05, 0x08,
0xd8, 0xad, 0x9e, 0xf5, 0x03, 0x9c, 0x2b, 0x99, 0xc9, 0xd1, 0x87, 0x39, 0x31, 0xd5, 0x5f, 0x03, 0x16, 0xf3, 0xb0, 0xa9, 0x44, 0xdf, 0xc0, 0xe6, 0xf6, 0x21, 0x7d, 0xa5, 0x59, 0x0c, 0x61, 0x25,
0xfa, 0xde, 0xe9, 0xc0, 0xd8, 0x01, 0x9c, 0x45, 0x0d, 0x36, 0xe5, 0x24, 0x39, 0x30, 0x99, 0x39, 0xaf, 0x70, 0x51, 0xc5, 0x29, 0xcc, 0xff, 0xcf, 0x78, 0x2a, 0x0b, 0x4e, 0x3c, 0x87, 0xee, 0x01,
0xf5, 0x5f, 0x29, 0x16, 0x43, 0x58, 0xc9, 0x8e, 0xcd, 0xa8, 0xe4, 0x15, 0xfa, 0xff, 0xe7, 0x34, 0x64, 0x02, 0x17, 0x5d, 0x2c, 0x87, 0xba, 0xa8, 0x7c, 0xcd, 0x4a, 0x3d, 0x8a, 0xe7, 0xd0, 0x73,
0x15, 0xa7, 0x58, 0xbc, 0x80, 0xee, 0x03, 0xa4, 0x53, 0x33, 0xda, 0x2e, 0x9a, 0x3a, 0x3f, 0x4e, 0xe8, 0x16, 0x25, 0x2d, 0xc2, 0x05, 0x64, 0xa5, 0x3c, 0x36, 0x77, 0x8e, 0xc5, 0xa4, 0x51, 0xf8,
0xeb, 0xa5, 0x43, 0x2e, 0x5e, 0x40, 0xcf, 0xa1, 0x9b, 0x9f, 0x93, 0x11, 0xce, 0x21, 0x4b, 0x67, 0xcd, 0x80, 0xd5, 0x03, 0x55, 0x87, 0xfa, 0xfc, 0x23, 0x58, 0xd6, 0x4a, 0x14, 0x9d, 0x2f, 0x93,
0x6e, 0x7d, 0xf7, 0x44, 0x4c, 0x62, 0x85, 0xdf, 0x34, 0x58, 0x3d, 0x94, 0x79, 0xa8, 0xde, 0x3f, 0xce, 0x0b, 0x62, 0xf3, 0x42, 0xcd, 0x6a, 0x1a, 0x81, 0x07, 0xd0, 0x4a, 0x05, 0x62, 0x29, 0x59,
0x82, 0xa6, 0x1a, 0x6f, 0xd1, 0xc5, 0x22, 0xe9, 0xec, 0x94, 0xad, 0x5f, 0xaa, 0x38, 0x4d, 0x2c, 0xca, 0x4a, 0xd5, 0xbc, 0x58, 0xb7, 0x9c, 0x92, 0xfd, 0xc3, 0x80, 0x55, 0x5d, 0xdc, 0x9a, 0xec,
0xf0, 0x10, 0x5a, 0xc9, 0xbc, 0x59, 0x08, 0x96, 0xe2, 0xe0, 0xab, 0x6f, 0x57, 0x1d, 0x27, 0x64, 0x73, 0x38, 0x5b, 0xad, 0xa4, 0x2a, 0xaf, 0xed, 0x6a, 0x99, 0xf0, 0x31, 0x12, 0x0c, 0xcf, 0xa1,
0xff, 0xd0, 0x60, 0x55, 0x25, 0xb7, 0x22, 0xfb, 0x1c, 0xce, 0x97, 0x4f, 0x52, 0xa5, 0x6e, 0xbb, 0x21, 0x34, 0x13, 0x55, 0xc5, 0xd1, 0xe5, 0x62, 0x2d, 0xd4, 0x69, 0x2e, 0xb3, 0xa2, 0xd3, 0xe1,
0x56, 0x24, 0x7c, 0xc2, 0x08, 0x86, 0x17, 0xd0, 0x10, 0x1a, 0xf1, 0x54, 0xc5, 0xd0, 0x95, 0x7c, 0xb9, 0xfe, 0x53, 0xe8, 0x3e, 0xb6, 0xa7, 0x3e, 0x09, 0xd2, 0x0a, 0x1e, 0xc0, 0x52, 0xf2, 0xec,
0x2e, 0x54, 0xcd, 0x5c, 0x7a, 0x49, 0xa5, 0xc3, 0x0b, 0xfd, 0x67, 0xd0, 0x7d, 0x62, 0xce, 0x5c, 0x23, 0xb3, 0x68, 0x39, 0x2f, 0x43, 0xcc, 0xad, 0xca, 0xb5, 0x34, 0x20, 0x13, 0x58, 0xd9, 0x17,
0xe2, 0x25, 0x19, 0x3c, 0x80, 0xe5, 0xb8, 0xed, 0x23, 0x3d, 0x2f, 0x39, 0x3b, 0x86, 0xe8, 0x5b, 0x3d, 0x4a, 0x1b, 0x7d, 0x26, 0x7e, 0x2c, 0x55, 0xbc, 0x56, 0xe8, 0x4a, 0x29, 0x1b, 0xea, 0x5f,
0xa5, 0x67, 0x89, 0x41, 0x26, 0xb0, 0x72, 0xc0, 0x6b, 0x94, 0x12, 0xfa, 0x2d, 0xff, 0x02, 0x2b, 0xb4, 0x9a, 0x9a, 0xfd, 0x5d, 0x84, 0x7e, 0x42, 0x9c, 0xd7, 0x34, 0x4e, 0x8f, 0x60, 0x41, 0x3b,
0xe9, 0x56, 0xe8, 0x6a, 0x21, 0x1a, 0xaa, 0x3b, 0x5a, 0x45, 0xce, 0xfe, 0xce, 0x4d, 0x3f, 0x21, 0xf7, 0x60, 0xa0, 0x4b, 0xe5, 0x96, 0x58, 0x7a, 0xce, 0xcc, 0xed, 0x7a, 0x40, 0x1a, 0xf1, 0x47,
0xd6, 0x6b, 0x3f, 0x4a, 0x9e, 0x60, 0x40, 0x3b, 0xd3, 0x30, 0xd0, 0xe5, 0x62, 0x49, 0x2c, 0xb4, 0x00, 0x59, 0xbb, 0x2c, 0x95, 0xcc, 0xcc, 0xf3, 0x60, 0x5e, 0xaa, 0x5d, 0xd7, 0x06, 0x5f, 0x2c,
0x33, 0x7d, 0xa7, 0x1a, 0x90, 0x58, 0xfc, 0x31, 0x40, 0x5a, 0x2e, 0x0b, 0x29, 0x33, 0xd7, 0x1e, 0xc9, 0xff, 0x50, 0x3e, 0xf9, 0x27, 0x00, 0x00, 0xff, 0xff, 0x67, 0x70, 0xff, 0x79, 0x51, 0x11,
0xf4, 0xcb, 0x95, 0xe7, 0x4a, 0xe0, 0xcb, 0x65, 0xf1, 0xf7, 0xcc, 0xad, 0x7f, 0x02, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0xdd, 0xe8, 0xfb, 0x77, 0xac, 0x11, 0x00, 0x00,
} }

View file

@ -22,63 +22,63 @@ var catalog = []*pb.Product{
Name: "Vintage Typewriter", Name: "Vintage Typewriter",
Description: "This typewriter looks good in your living room.", Description: "This typewriter looks good in your living room.",
Picture: "/static/img/products/typewriter.jpg", Picture: "/static/img/products/typewriter.jpg",
PriceUsd: &pb.MoneyAmount{Decimal: 67, Fractional: 99}, PriceUsd: &pb.Money{CurrencyCode: "USD", Units: 67, Nanos: 990000000},
}, },
{ {
Id: "66VCHSJNUP", Id: "66VCHSJNUP",
Name: "Vintage Camera Lens", Name: "Vintage Camera Lens",
Description: "You won't have a camera to use it and it probably doesn't work anyway.", Description: "You won't have a camera to use it and it probably doesn't work anyway.",
Picture: "/static/img/products/camera-lens.jpg", Picture: "/static/img/products/camera-lens.jpg",
PriceUsd: &pb.MoneyAmount{Decimal: 12, Fractional: 49}, PriceUsd: &pb.Money{CurrencyCode: "USD", Units: 12, Nanos: 490000000},
}, },
{ {
Id: "1YMWWN1N4O", Id: "1YMWWN1N4O",
Name: "Home Barista Kit", Name: "Home Barista Kit",
Description: "Always wanted to brew coffee with Chemex and Aeropress at home?", Description: "Always wanted to brew coffee with Chemex and Aeropress at home?",
Picture: "/static/img/products/barista-kit.jpg", Picture: "/static/img/products/barista-kit.jpg",
PriceUsd: &pb.MoneyAmount{Decimal: 124, Fractional: 0}, PriceUsd: &pb.Money{CurrencyCode: "USD", Units: 124, Nanos: 0},
}, },
{ {
Id: "L9ECAV7KIM", Id: "L9ECAV7KIM",
Name: "Terrarium", Name: "Terrarium",
Description: "This terrarium will looks great in your white painted living room.", Description: "This terrarium will looks great in your white painted living room.",
Picture: "/static/img/products/terrarium.jpg", Picture: "/static/img/products/terrarium.jpg",
PriceUsd: &pb.MoneyAmount{Decimal: 36, Fractional: 45}, PriceUsd: &pb.Money{CurrencyCode: "USD", Units: 36, Nanos: 450000000},
}, },
{ {
Id: "2ZYFJ3GM2N", Id: "2ZYFJ3GM2N",
Name: "Film Camera", Name: "Film Camera",
Description: "This camera looks like it's a film camera, but it's actually digital.", Description: "This camera looks like it's a film camera, but it's actually digital.",
Picture: "/static/img/products/film-camera.jpg", Picture: "/static/img/products/film-camera.jpg",
PriceUsd: &pb.MoneyAmount{Decimal: 2245, Fractional: 0}, PriceUsd: &pb.Money{CurrencyCode: "USD", Units: 2245, Nanos: 00000000},
}, },
{ {
Id: "0PUK6V6EV0", Id: "0PUK6V6EV0",
Name: "Vintage Record Player", Name: "Vintage Record Player",
Description: "It still works.", Description: "It still works.",
Picture: "/static/img/products/record-player.jpg", Picture: "/static/img/products/record-player.jpg",
PriceUsd: &pb.MoneyAmount{Decimal: 65, Fractional: 50}, PriceUsd: &pb.Money{CurrencyCode: "USD", Units: 65, Nanos: 500000000},
}, },
{ {
Id: "LS4PSXUNUM", Id: "LS4PSXUNUM",
Name: "Metal Camping Mug", Name: "Metal Camping Mug",
Description: "You probably don't go camping that often but this is better than plastic cups.", Description: "You probably don't go camping that often but this is better than plastic cups.",
Picture: "/static/img/products/camp-mug.jpg", Picture: "/static/img/products/camp-mug.jpg",
PriceUsd: &pb.MoneyAmount{Decimal: 24, Fractional: 33}, PriceUsd: &pb.Money{CurrencyCode: "USD", Units: 24, Nanos: 330000000},
}, },
{ {
Id: "9SIQT8TOJO", Id: "9SIQT8TOJO",
Name: "City Bike", Name: "City Bike",
Description: "This single gear bike probably cannot climb the hills of San Francisco.", Description: "This single gear bike probably cannot climb the hills of San Francisco.",
Picture: "/static/img/products/city-bike.jpg", Picture: "/static/img/products/city-bike.jpg",
PriceUsd: &pb.MoneyAmount{Decimal: 789, Fractional: 50}, PriceUsd: &pb.Money{CurrencyCode: "USD", Units: 789, Nanos: 500000000},
}, },
{ {
Id: "6E92ZMYYFZ", Id: "6E92ZMYYFZ",
Name: "Air Plant", Name: "Air Plant",
Description: "Have you ever wondered whether air plants need water? Buy one and figure out.", Description: "Have you ever wondered whether air plants need water? Buy one and figure out.",
Picture: "/static/img/products/air-plant.jpg", Picture: "/static/img/products/air-plant.jpg",
PriceUsd: &pb.MoneyAmount{Decimal: 12, Fractional: 30}, PriceUsd: &pb.Money{CurrencyCode: "USD", Units: 12, Nanos: 300000000},
}, },
} }
@ -118,7 +118,8 @@ func (p *productCatalog) SearchProducts(ctx context.Context, req *pb.SearchProdu
// Intepret query as a substring match in name or description. // Intepret query as a substring match in name or description.
var ps []*pb.Product var ps []*pb.Product
for _, p := range catalog { for _, p := range catalog {
if strings.Contains(p.Name, req.Query) || strings.Contains(p.Description, req.Query) { if strings.Contains(strings.ToLower(p.Name), strings.ToLower(req.Query)) ||
strings.Contains(strings.ToLower(p.Description), strings.ToLower(req.Query)) {
ps = append(ps, p) ps = append(ps, p)
} }
} }

View file

@ -29,11 +29,11 @@ func TestServer(t *testing.T) {
t.Error(diff) t.Error(diff)
} }
got, err := client.GetProduct(ctx, &pb.GetProductRequest{Id: "2"}) got, err := client.GetProduct(ctx, &pb.GetProductRequest{Id: "OLJCESPC7Z"})
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
if want := catalog[1]; !proto.Equal(got, want) { if want := catalog[0]; !proto.Equal(got, want) {
t.Errorf("got %v, want %v", got, want) t.Errorf("got %v, want %v", got, want)
} }
_, err = client.GetProduct(ctx, &pb.GetProductRequest{Id: "N/A"}) _, err = client.GetProduct(ctx, &pb.GetProductRequest{Id: "N/A"})
@ -41,11 +41,11 @@ func TestServer(t *testing.T) {
t.Errorf("got %s, want %s", got, want) t.Errorf("got %s, want %s", got, want)
} }
sres, err := client.SearchProducts(ctx, &pb.SearchProductsRequest{Query: "nice"}) sres, err := client.SearchProducts(ctx, &pb.SearchProductsRequest{Query: "typewriter"})
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
if diff := cmp.Diff(sres.Results, catalog, cmp.Comparer(proto.Equal)); diff != "" { if diff := cmp.Diff(sres.Results, []*pb.Product{catalog[0]}, cmp.Comparer(proto.Equal)); diff != "" {
t.Error(diff) t.Error(diff)
} }
} }

File diff suppressed because one or more lines are too long

View file

@ -35,7 +35,7 @@ func (m *CartItem) Reset() { *m = CartItem{} }
func (m *CartItem) String() string { return proto.CompactTextString(m) } func (m *CartItem) String() string { return proto.CompactTextString(m) }
func (*CartItem) ProtoMessage() {} func (*CartItem) ProtoMessage() {}
func (*CartItem) Descriptor() ([]byte, []int) { func (*CartItem) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{0} return fileDescriptor_demo_bbfc9458084e7e4b, []int{0}
} }
func (m *CartItem) XXX_Unmarshal(b []byte) error { func (m *CartItem) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CartItem.Unmarshal(m, b) return xxx_messageInfo_CartItem.Unmarshal(m, b)
@ -81,7 +81,7 @@ func (m *AddItemRequest) Reset() { *m = AddItemRequest{} }
func (m *AddItemRequest) String() string { return proto.CompactTextString(m) } func (m *AddItemRequest) String() string { return proto.CompactTextString(m) }
func (*AddItemRequest) ProtoMessage() {} func (*AddItemRequest) ProtoMessage() {}
func (*AddItemRequest) Descriptor() ([]byte, []int) { func (*AddItemRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{1} return fileDescriptor_demo_bbfc9458084e7e4b, []int{1}
} }
func (m *AddItemRequest) XXX_Unmarshal(b []byte) error { func (m *AddItemRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_AddItemRequest.Unmarshal(m, b) return xxx_messageInfo_AddItemRequest.Unmarshal(m, b)
@ -126,7 +126,7 @@ func (m *EmptyCartRequest) Reset() { *m = EmptyCartRequest{} }
func (m *EmptyCartRequest) String() string { return proto.CompactTextString(m) } func (m *EmptyCartRequest) String() string { return proto.CompactTextString(m) }
func (*EmptyCartRequest) ProtoMessage() {} func (*EmptyCartRequest) ProtoMessage() {}
func (*EmptyCartRequest) Descriptor() ([]byte, []int) { func (*EmptyCartRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{2} return fileDescriptor_demo_bbfc9458084e7e4b, []int{2}
} }
func (m *EmptyCartRequest) XXX_Unmarshal(b []byte) error { func (m *EmptyCartRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_EmptyCartRequest.Unmarshal(m, b) return xxx_messageInfo_EmptyCartRequest.Unmarshal(m, b)
@ -164,7 +164,7 @@ func (m *GetCartRequest) Reset() { *m = GetCartRequest{} }
func (m *GetCartRequest) String() string { return proto.CompactTextString(m) } func (m *GetCartRequest) String() string { return proto.CompactTextString(m) }
func (*GetCartRequest) ProtoMessage() {} func (*GetCartRequest) ProtoMessage() {}
func (*GetCartRequest) Descriptor() ([]byte, []int) { func (*GetCartRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{3} return fileDescriptor_demo_bbfc9458084e7e4b, []int{3}
} }
func (m *GetCartRequest) XXX_Unmarshal(b []byte) error { func (m *GetCartRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetCartRequest.Unmarshal(m, b) return xxx_messageInfo_GetCartRequest.Unmarshal(m, b)
@ -203,7 +203,7 @@ func (m *Cart) Reset() { *m = Cart{} }
func (m *Cart) String() string { return proto.CompactTextString(m) } func (m *Cart) String() string { return proto.CompactTextString(m) }
func (*Cart) ProtoMessage() {} func (*Cart) ProtoMessage() {}
func (*Cart) Descriptor() ([]byte, []int) { func (*Cart) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{4} return fileDescriptor_demo_bbfc9458084e7e4b, []int{4}
} }
func (m *Cart) XXX_Unmarshal(b []byte) error { func (m *Cart) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Cart.Unmarshal(m, b) return xxx_messageInfo_Cart.Unmarshal(m, b)
@ -247,7 +247,7 @@ func (m *Empty) Reset() { *m = Empty{} }
func (m *Empty) String() string { return proto.CompactTextString(m) } func (m *Empty) String() string { return proto.CompactTextString(m) }
func (*Empty) ProtoMessage() {} func (*Empty) ProtoMessage() {}
func (*Empty) Descriptor() ([]byte, []int) { func (*Empty) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{5} return fileDescriptor_demo_bbfc9458084e7e4b, []int{5}
} }
func (m *Empty) XXX_Unmarshal(b []byte) error { func (m *Empty) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Empty.Unmarshal(m, b) return xxx_messageInfo_Empty.Unmarshal(m, b)
@ -279,7 +279,7 @@ func (m *ListRecommendationsRequest) Reset() { *m = ListRecommendationsR
func (m *ListRecommendationsRequest) String() string { return proto.CompactTextString(m) } func (m *ListRecommendationsRequest) String() string { return proto.CompactTextString(m) }
func (*ListRecommendationsRequest) ProtoMessage() {} func (*ListRecommendationsRequest) ProtoMessage() {}
func (*ListRecommendationsRequest) Descriptor() ([]byte, []int) { func (*ListRecommendationsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{6} return fileDescriptor_demo_bbfc9458084e7e4b, []int{6}
} }
func (m *ListRecommendationsRequest) XXX_Unmarshal(b []byte) error { func (m *ListRecommendationsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListRecommendationsRequest.Unmarshal(m, b) return xxx_messageInfo_ListRecommendationsRequest.Unmarshal(m, b)
@ -324,7 +324,7 @@ func (m *ListRecommendationsResponse) Reset() { *m = ListRecommendations
func (m *ListRecommendationsResponse) String() string { return proto.CompactTextString(m) } func (m *ListRecommendationsResponse) String() string { return proto.CompactTextString(m) }
func (*ListRecommendationsResponse) ProtoMessage() {} func (*ListRecommendationsResponse) ProtoMessage() {}
func (*ListRecommendationsResponse) Descriptor() ([]byte, []int) { func (*ListRecommendationsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{7} return fileDescriptor_demo_bbfc9458084e7e4b, []int{7}
} }
func (m *ListRecommendationsResponse) XXX_Unmarshal(b []byte) error { func (m *ListRecommendationsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListRecommendationsResponse.Unmarshal(m, b) return xxx_messageInfo_ListRecommendationsResponse.Unmarshal(m, b)
@ -356,7 +356,7 @@ type Product struct {
Name string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` Name string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"`
Description string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"` Description string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"`
Picture string `protobuf:"bytes,4,opt,name=picture" json:"picture,omitempty"` Picture string `protobuf:"bytes,4,opt,name=picture" json:"picture,omitempty"`
PriceUsd *MoneyAmount `protobuf:"bytes,5,opt,name=price_usd,json=priceUsd" json:"price_usd,omitempty"` PriceUsd *Money `protobuf:"bytes,5,opt,name=price_usd,json=priceUsd" json:"price_usd,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -366,7 +366,7 @@ func (m *Product) Reset() { *m = Product{} }
func (m *Product) String() string { return proto.CompactTextString(m) } func (m *Product) String() string { return proto.CompactTextString(m) }
func (*Product) ProtoMessage() {} func (*Product) ProtoMessage() {}
func (*Product) Descriptor() ([]byte, []int) { func (*Product) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{8} return fileDescriptor_demo_bbfc9458084e7e4b, []int{8}
} }
func (m *Product) XXX_Unmarshal(b []byte) error { func (m *Product) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Product.Unmarshal(m, b) return xxx_messageInfo_Product.Unmarshal(m, b)
@ -414,7 +414,7 @@ func (m *Product) GetPicture() string {
return "" return ""
} }
func (m *Product) GetPriceUsd() *MoneyAmount { func (m *Product) GetPriceUsd() *Money {
if m != nil { if m != nil {
return m.PriceUsd return m.PriceUsd
} }
@ -432,7 +432,7 @@ func (m *ListProductsResponse) Reset() { *m = ListProductsResponse{} }
func (m *ListProductsResponse) String() string { return proto.CompactTextString(m) } func (m *ListProductsResponse) String() string { return proto.CompactTextString(m) }
func (*ListProductsResponse) ProtoMessage() {} func (*ListProductsResponse) ProtoMessage() {}
func (*ListProductsResponse) Descriptor() ([]byte, []int) { func (*ListProductsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{9} return fileDescriptor_demo_bbfc9458084e7e4b, []int{9}
} }
func (m *ListProductsResponse) XXX_Unmarshal(b []byte) error { func (m *ListProductsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListProductsResponse.Unmarshal(m, b) return xxx_messageInfo_ListProductsResponse.Unmarshal(m, b)
@ -470,7 +470,7 @@ func (m *GetProductRequest) Reset() { *m = GetProductRequest{} }
func (m *GetProductRequest) String() string { return proto.CompactTextString(m) } func (m *GetProductRequest) String() string { return proto.CompactTextString(m) }
func (*GetProductRequest) ProtoMessage() {} func (*GetProductRequest) ProtoMessage() {}
func (*GetProductRequest) Descriptor() ([]byte, []int) { func (*GetProductRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{10} return fileDescriptor_demo_bbfc9458084e7e4b, []int{10}
} }
func (m *GetProductRequest) XXX_Unmarshal(b []byte) error { func (m *GetProductRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetProductRequest.Unmarshal(m, b) return xxx_messageInfo_GetProductRequest.Unmarshal(m, b)
@ -508,7 +508,7 @@ func (m *SearchProductsRequest) Reset() { *m = SearchProductsRequest{} }
func (m *SearchProductsRequest) String() string { return proto.CompactTextString(m) } func (m *SearchProductsRequest) String() string { return proto.CompactTextString(m) }
func (*SearchProductsRequest) ProtoMessage() {} func (*SearchProductsRequest) ProtoMessage() {}
func (*SearchProductsRequest) Descriptor() ([]byte, []int) { func (*SearchProductsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{11} return fileDescriptor_demo_bbfc9458084e7e4b, []int{11}
} }
func (m *SearchProductsRequest) XXX_Unmarshal(b []byte) error { func (m *SearchProductsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SearchProductsRequest.Unmarshal(m, b) return xxx_messageInfo_SearchProductsRequest.Unmarshal(m, b)
@ -546,7 +546,7 @@ func (m *SearchProductsResponse) Reset() { *m = SearchProductsResponse{}
func (m *SearchProductsResponse) String() string { return proto.CompactTextString(m) } func (m *SearchProductsResponse) String() string { return proto.CompactTextString(m) }
func (*SearchProductsResponse) ProtoMessage() {} func (*SearchProductsResponse) ProtoMessage() {}
func (*SearchProductsResponse) Descriptor() ([]byte, []int) { func (*SearchProductsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{12} return fileDescriptor_demo_bbfc9458084e7e4b, []int{12}
} }
func (m *SearchProductsResponse) XXX_Unmarshal(b []byte) error { func (m *SearchProductsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SearchProductsResponse.Unmarshal(m, b) return xxx_messageInfo_SearchProductsResponse.Unmarshal(m, b)
@ -585,7 +585,7 @@ func (m *GetQuoteRequest) Reset() { *m = GetQuoteRequest{} }
func (m *GetQuoteRequest) String() string { return proto.CompactTextString(m) } func (m *GetQuoteRequest) String() string { return proto.CompactTextString(m) }
func (*GetQuoteRequest) ProtoMessage() {} func (*GetQuoteRequest) ProtoMessage() {}
func (*GetQuoteRequest) Descriptor() ([]byte, []int) { func (*GetQuoteRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{13} return fileDescriptor_demo_bbfc9458084e7e4b, []int{13}
} }
func (m *GetQuoteRequest) XXX_Unmarshal(b []byte) error { func (m *GetQuoteRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetQuoteRequest.Unmarshal(m, b) return xxx_messageInfo_GetQuoteRequest.Unmarshal(m, b)
@ -620,7 +620,7 @@ func (m *GetQuoteRequest) GetItems() []*CartItem {
} }
type GetQuoteResponse struct { type GetQuoteResponse struct {
CostUsd *MoneyAmount `protobuf:"bytes,1,opt,name=cost_usd,json=costUsd" json:"cost_usd,omitempty"` CostUsd *Money `protobuf:"bytes,1,opt,name=cost_usd,json=costUsd" json:"cost_usd,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -630,7 +630,7 @@ func (m *GetQuoteResponse) Reset() { *m = GetQuoteResponse{} }
func (m *GetQuoteResponse) String() string { return proto.CompactTextString(m) } func (m *GetQuoteResponse) String() string { return proto.CompactTextString(m) }
func (*GetQuoteResponse) ProtoMessage() {} func (*GetQuoteResponse) ProtoMessage() {}
func (*GetQuoteResponse) Descriptor() ([]byte, []int) { func (*GetQuoteResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{14} return fileDescriptor_demo_bbfc9458084e7e4b, []int{14}
} }
func (m *GetQuoteResponse) XXX_Unmarshal(b []byte) error { func (m *GetQuoteResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetQuoteResponse.Unmarshal(m, b) return xxx_messageInfo_GetQuoteResponse.Unmarshal(m, b)
@ -650,7 +650,7 @@ func (m *GetQuoteResponse) XXX_DiscardUnknown() {
var xxx_messageInfo_GetQuoteResponse proto.InternalMessageInfo var xxx_messageInfo_GetQuoteResponse proto.InternalMessageInfo
func (m *GetQuoteResponse) GetCostUsd() *MoneyAmount { func (m *GetQuoteResponse) GetCostUsd() *Money {
if m != nil { if m != nil {
return m.CostUsd return m.CostUsd
} }
@ -669,7 +669,7 @@ func (m *ShipOrderRequest) Reset() { *m = ShipOrderRequest{} }
func (m *ShipOrderRequest) String() string { return proto.CompactTextString(m) } func (m *ShipOrderRequest) String() string { return proto.CompactTextString(m) }
func (*ShipOrderRequest) ProtoMessage() {} func (*ShipOrderRequest) ProtoMessage() {}
func (*ShipOrderRequest) Descriptor() ([]byte, []int) { func (*ShipOrderRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{15} return fileDescriptor_demo_bbfc9458084e7e4b, []int{15}
} }
func (m *ShipOrderRequest) XXX_Unmarshal(b []byte) error { func (m *ShipOrderRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ShipOrderRequest.Unmarshal(m, b) return xxx_messageInfo_ShipOrderRequest.Unmarshal(m, b)
@ -714,7 +714,7 @@ func (m *ShipOrderResponse) Reset() { *m = ShipOrderResponse{} }
func (m *ShipOrderResponse) String() string { return proto.CompactTextString(m) } func (m *ShipOrderResponse) String() string { return proto.CompactTextString(m) }
func (*ShipOrderResponse) ProtoMessage() {} func (*ShipOrderResponse) ProtoMessage() {}
func (*ShipOrderResponse) Descriptor() ([]byte, []int) { func (*ShipOrderResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{16} return fileDescriptor_demo_bbfc9458084e7e4b, []int{16}
} }
func (m *ShipOrderResponse) XXX_Unmarshal(b []byte) error { func (m *ShipOrderResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ShipOrderResponse.Unmarshal(m, b) return xxx_messageInfo_ShipOrderResponse.Unmarshal(m, b)
@ -742,9 +742,9 @@ func (m *ShipOrderResponse) GetTrackingId() string {
} }
type Address struct { type Address struct {
StreetAddress_1 string `protobuf:"bytes,1,opt,name=street_address_1,json=streetAddress1" json:"street_address_1,omitempty"` StreetAddress string `protobuf:"bytes,1,opt,name=street_address,json=streetAddress" json:"street_address,omitempty"`
StreetAddress_2 string `protobuf:"bytes,2,opt,name=street_address_2,json=streetAddress2" json:"street_address_2,omitempty"` City string `protobuf:"bytes,2,opt,name=city" json:"city,omitempty"`
City string `protobuf:"bytes,3,opt,name=city" json:"city,omitempty"` State string `protobuf:"bytes,3,opt,name=state" json:"state,omitempty"`
Country string `protobuf:"bytes,4,opt,name=country" json:"country,omitempty"` Country string `protobuf:"bytes,4,opt,name=country" json:"country,omitempty"`
ZipCode int32 `protobuf:"varint,5,opt,name=zip_code,json=zipCode" json:"zip_code,omitempty"` ZipCode int32 `protobuf:"varint,5,opt,name=zip_code,json=zipCode" json:"zip_code,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
@ -756,7 +756,7 @@ func (m *Address) Reset() { *m = Address{} }
func (m *Address) String() string { return proto.CompactTextString(m) } func (m *Address) String() string { return proto.CompactTextString(m) }
func (*Address) ProtoMessage() {} func (*Address) ProtoMessage() {}
func (*Address) Descriptor() ([]byte, []int) { func (*Address) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{17} return fileDescriptor_demo_bbfc9458084e7e4b, []int{17}
} }
func (m *Address) XXX_Unmarshal(b []byte) error { func (m *Address) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Address.Unmarshal(m, b) return xxx_messageInfo_Address.Unmarshal(m, b)
@ -776,16 +776,9 @@ func (m *Address) XXX_DiscardUnknown() {
var xxx_messageInfo_Address proto.InternalMessageInfo var xxx_messageInfo_Address proto.InternalMessageInfo
func (m *Address) GetStreetAddress_1() string { func (m *Address) GetStreetAddress() string {
if m != nil { if m != nil {
return m.StreetAddress_1 return m.StreetAddress
}
return ""
}
func (m *Address) GetStreetAddress_2() string {
if m != nil {
return m.StreetAddress_2
} }
return "" return ""
} }
@ -797,6 +790,13 @@ func (m *Address) GetCity() string {
return "" return ""
} }
func (m *Address) GetState() string {
if m != nil {
return m.State
}
return ""
}
func (m *Address) GetCountry() string { func (m *Address) GetCountry() string {
if m != nil { if m != nil {
return m.Country return m.Country
@ -811,58 +811,20 @@ func (m *Address) GetZipCode() int32 {
return 0 return 0
} }
// Describes a money amount without currency. For example, decimal=2 and // Represents an amount of money with its currency type.
// fractional=500 (or fractional=5) makes up 2.5 units.
type MoneyAmount struct {
Decimal uint32 `protobuf:"varint,1,opt,name=decimal" json:"decimal,omitempty"`
Fractional uint32 `protobuf:"varint,2,opt,name=fractional" json:"fractional,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *MoneyAmount) Reset() { *m = MoneyAmount{} }
func (m *MoneyAmount) String() string { return proto.CompactTextString(m) }
func (*MoneyAmount) ProtoMessage() {}
func (*MoneyAmount) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{18}
}
func (m *MoneyAmount) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_MoneyAmount.Unmarshal(m, b)
}
func (m *MoneyAmount) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_MoneyAmount.Marshal(b, m, deterministic)
}
func (dst *MoneyAmount) XXX_Merge(src proto.Message) {
xxx_messageInfo_MoneyAmount.Merge(dst, src)
}
func (m *MoneyAmount) XXX_Size() int {
return xxx_messageInfo_MoneyAmount.Size(m)
}
func (m *MoneyAmount) XXX_DiscardUnknown() {
xxx_messageInfo_MoneyAmount.DiscardUnknown(m)
}
var xxx_messageInfo_MoneyAmount proto.InternalMessageInfo
func (m *MoneyAmount) GetDecimal() uint32 {
if m != nil {
return m.Decimal
}
return 0
}
func (m *MoneyAmount) GetFractional() uint32 {
if m != nil {
return m.Fractional
}
return 0
}
type Money struct { type Money struct {
// The 3-letter currency code defined in ISO 4217. // The 3-letter currency code defined in ISO 4217.
CurrencyCode string `protobuf:"bytes,1,opt,name=currency_code,json=currencyCode" json:"currency_code,omitempty"` CurrencyCode string `protobuf:"bytes,1,opt,name=currency_code,json=currencyCode" json:"currency_code,omitempty"`
Amount *MoneyAmount `protobuf:"bytes,2,opt,name=amount" json:"amount,omitempty"` // The whole units of the amount.
// For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar.
Units int64 `protobuf:"varint,2,opt,name=units" json:"units,omitempty"`
// Number of nano (10^-9) units of the amount.
// The value must be between -999,999,999 and +999,999,999 inclusive.
// If `units` is positive, `nanos` must be positive or zero.
// If `units` is zero, `nanos` can be positive, zero, or negative.
// If `units` is negative, `nanos` must be negative or zero.
// For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
Nanos int32 `protobuf:"varint,3,opt,name=nanos" json:"nanos,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -872,7 +834,7 @@ func (m *Money) Reset() { *m = Money{} }
func (m *Money) String() string { return proto.CompactTextString(m) } func (m *Money) String() string { return proto.CompactTextString(m) }
func (*Money) ProtoMessage() {} func (*Money) ProtoMessage() {}
func (*Money) Descriptor() ([]byte, []int) { func (*Money) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{19} return fileDescriptor_demo_bbfc9458084e7e4b, []int{18}
} }
func (m *Money) XXX_Unmarshal(b []byte) error { func (m *Money) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Money.Unmarshal(m, b) return xxx_messageInfo_Money.Unmarshal(m, b)
@ -899,11 +861,18 @@ func (m *Money) GetCurrencyCode() string {
return "" return ""
} }
func (m *Money) GetAmount() *MoneyAmount { func (m *Money) GetUnits() int64 {
if m != nil { if m != nil {
return m.Amount return m.Units
} }
return nil return 0
}
func (m *Money) GetNanos() int32 {
if m != nil {
return m.Nanos
}
return 0
} }
type GetSupportedCurrenciesResponse struct { type GetSupportedCurrenciesResponse struct {
@ -918,7 +887,7 @@ func (m *GetSupportedCurrenciesResponse) Reset() { *m = GetSupportedCurr
func (m *GetSupportedCurrenciesResponse) String() string { return proto.CompactTextString(m) } func (m *GetSupportedCurrenciesResponse) String() string { return proto.CompactTextString(m) }
func (*GetSupportedCurrenciesResponse) ProtoMessage() {} func (*GetSupportedCurrenciesResponse) ProtoMessage() {}
func (*GetSupportedCurrenciesResponse) Descriptor() ([]byte, []int) { func (*GetSupportedCurrenciesResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{20} return fileDescriptor_demo_bbfc9458084e7e4b, []int{19}
} }
func (m *GetSupportedCurrenciesResponse) XXX_Unmarshal(b []byte) error { func (m *GetSupportedCurrenciesResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetSupportedCurrenciesResponse.Unmarshal(m, b) return xxx_messageInfo_GetSupportedCurrenciesResponse.Unmarshal(m, b)
@ -958,7 +927,7 @@ func (m *CurrencyConversionRequest) Reset() { *m = CurrencyConversionReq
func (m *CurrencyConversionRequest) String() string { return proto.CompactTextString(m) } func (m *CurrencyConversionRequest) String() string { return proto.CompactTextString(m) }
func (*CurrencyConversionRequest) ProtoMessage() {} func (*CurrencyConversionRequest) ProtoMessage() {}
func (*CurrencyConversionRequest) Descriptor() ([]byte, []int) { func (*CurrencyConversionRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{21} return fileDescriptor_demo_bbfc9458084e7e4b, []int{20}
} }
func (m *CurrencyConversionRequest) XXX_Unmarshal(b []byte) error { func (m *CurrencyConversionRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CurrencyConversionRequest.Unmarshal(m, b) return xxx_messageInfo_CurrencyConversionRequest.Unmarshal(m, b)
@ -1006,7 +975,7 @@ func (m *CreditCardInfo) Reset() { *m = CreditCardInfo{} }
func (m *CreditCardInfo) String() string { return proto.CompactTextString(m) } func (m *CreditCardInfo) String() string { return proto.CompactTextString(m) }
func (*CreditCardInfo) ProtoMessage() {} func (*CreditCardInfo) ProtoMessage() {}
func (*CreditCardInfo) Descriptor() ([]byte, []int) { func (*CreditCardInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{22} return fileDescriptor_demo_bbfc9458084e7e4b, []int{21}
} }
func (m *CreditCardInfo) XXX_Unmarshal(b []byte) error { func (m *CreditCardInfo) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CreditCardInfo.Unmarshal(m, b) return xxx_messageInfo_CreditCardInfo.Unmarshal(m, b)
@ -1066,7 +1035,7 @@ func (m *ChargeRequest) Reset() { *m = ChargeRequest{} }
func (m *ChargeRequest) String() string { return proto.CompactTextString(m) } func (m *ChargeRequest) String() string { return proto.CompactTextString(m) }
func (*ChargeRequest) ProtoMessage() {} func (*ChargeRequest) ProtoMessage() {}
func (*ChargeRequest) Descriptor() ([]byte, []int) { func (*ChargeRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{23} return fileDescriptor_demo_bbfc9458084e7e4b, []int{22}
} }
func (m *ChargeRequest) XXX_Unmarshal(b []byte) error { func (m *ChargeRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChargeRequest.Unmarshal(m, b) return xxx_messageInfo_ChargeRequest.Unmarshal(m, b)
@ -1111,7 +1080,7 @@ func (m *ChargeResponse) Reset() { *m = ChargeResponse{} }
func (m *ChargeResponse) String() string { return proto.CompactTextString(m) } func (m *ChargeResponse) String() string { return proto.CompactTextString(m) }
func (*ChargeResponse) ProtoMessage() {} func (*ChargeResponse) ProtoMessage() {}
func (*ChargeResponse) Descriptor() ([]byte, []int) { func (*ChargeResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{24} return fileDescriptor_demo_bbfc9458084e7e4b, []int{23}
} }
func (m *ChargeResponse) XXX_Unmarshal(b []byte) error { func (m *ChargeResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChargeResponse.Unmarshal(m, b) return xxx_messageInfo_ChargeResponse.Unmarshal(m, b)
@ -1150,7 +1119,7 @@ func (m *OrderItem) Reset() { *m = OrderItem{} }
func (m *OrderItem) String() string { return proto.CompactTextString(m) } func (m *OrderItem) String() string { return proto.CompactTextString(m) }
func (*OrderItem) ProtoMessage() {} func (*OrderItem) ProtoMessage() {}
func (*OrderItem) Descriptor() ([]byte, []int) { func (*OrderItem) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{25} return fileDescriptor_demo_bbfc9458084e7e4b, []int{24}
} }
func (m *OrderItem) XXX_Unmarshal(b []byte) error { func (m *OrderItem) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_OrderItem.Unmarshal(m, b) return xxx_messageInfo_OrderItem.Unmarshal(m, b)
@ -1199,7 +1168,7 @@ func (m *OrderResult) Reset() { *m = OrderResult{} }
func (m *OrderResult) String() string { return proto.CompactTextString(m) } func (m *OrderResult) String() string { return proto.CompactTextString(m) }
func (*OrderResult) ProtoMessage() {} func (*OrderResult) ProtoMessage() {}
func (*OrderResult) Descriptor() ([]byte, []int) { func (*OrderResult) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{26} return fileDescriptor_demo_bbfc9458084e7e4b, []int{25}
} }
func (m *OrderResult) XXX_Unmarshal(b []byte) error { func (m *OrderResult) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_OrderResult.Unmarshal(m, b) return xxx_messageInfo_OrderResult.Unmarshal(m, b)
@ -1266,7 +1235,7 @@ func (m *SendOrderConfirmationRequest) Reset() { *m = SendOrderConfirmat
func (m *SendOrderConfirmationRequest) String() string { return proto.CompactTextString(m) } func (m *SendOrderConfirmationRequest) String() string { return proto.CompactTextString(m) }
func (*SendOrderConfirmationRequest) ProtoMessage() {} func (*SendOrderConfirmationRequest) ProtoMessage() {}
func (*SendOrderConfirmationRequest) Descriptor() ([]byte, []int) { func (*SendOrderConfirmationRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{27} return fileDescriptor_demo_bbfc9458084e7e4b, []int{26}
} }
func (m *SendOrderConfirmationRequest) XXX_Unmarshal(b []byte) error { func (m *SendOrderConfirmationRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SendOrderConfirmationRequest.Unmarshal(m, b) return xxx_messageInfo_SendOrderConfirmationRequest.Unmarshal(m, b)
@ -1313,7 +1282,7 @@ func (m *CreateOrderRequest) Reset() { *m = CreateOrderRequest{} }
func (m *CreateOrderRequest) String() string { return proto.CompactTextString(m) } func (m *CreateOrderRequest) String() string { return proto.CompactTextString(m) }
func (*CreateOrderRequest) ProtoMessage() {} func (*CreateOrderRequest) ProtoMessage() {}
func (*CreateOrderRequest) Descriptor() ([]byte, []int) { func (*CreateOrderRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{28} return fileDescriptor_demo_bbfc9458084e7e4b, []int{27}
} }
func (m *CreateOrderRequest) XXX_Unmarshal(b []byte) error { func (m *CreateOrderRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CreateOrderRequest.Unmarshal(m, b) return xxx_messageInfo_CreateOrderRequest.Unmarshal(m, b)
@ -1366,7 +1335,7 @@ func (m *CreateOrderResponse) Reset() { *m = CreateOrderResponse{} }
func (m *CreateOrderResponse) String() string { return proto.CompactTextString(m) } func (m *CreateOrderResponse) String() string { return proto.CompactTextString(m) }
func (*CreateOrderResponse) ProtoMessage() {} func (*CreateOrderResponse) ProtoMessage() {}
func (*CreateOrderResponse) Descriptor() ([]byte, []int) { func (*CreateOrderResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{29} return fileDescriptor_demo_bbfc9458084e7e4b, []int{28}
} }
func (m *CreateOrderResponse) XXX_Unmarshal(b []byte) error { func (m *CreateOrderResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CreateOrderResponse.Unmarshal(m, b) return xxx_messageInfo_CreateOrderResponse.Unmarshal(m, b)
@ -1415,7 +1384,7 @@ func (m *PlaceOrderRequest) Reset() { *m = PlaceOrderRequest{} }
func (m *PlaceOrderRequest) String() string { return proto.CompactTextString(m) } func (m *PlaceOrderRequest) String() string { return proto.CompactTextString(m) }
func (*PlaceOrderRequest) ProtoMessage() {} func (*PlaceOrderRequest) ProtoMessage() {}
func (*PlaceOrderRequest) Descriptor() ([]byte, []int) { func (*PlaceOrderRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{30} return fileDescriptor_demo_bbfc9458084e7e4b, []int{29}
} }
func (m *PlaceOrderRequest) XXX_Unmarshal(b []byte) error { func (m *PlaceOrderRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PlaceOrderRequest.Unmarshal(m, b) return xxx_messageInfo_PlaceOrderRequest.Unmarshal(m, b)
@ -1481,7 +1450,7 @@ func (m *PlaceOrderResponse) Reset() { *m = PlaceOrderResponse{} }
func (m *PlaceOrderResponse) String() string { return proto.CompactTextString(m) } func (m *PlaceOrderResponse) String() string { return proto.CompactTextString(m) }
func (*PlaceOrderResponse) ProtoMessage() {} func (*PlaceOrderResponse) ProtoMessage() {}
func (*PlaceOrderResponse) Descriptor() ([]byte, []int) { func (*PlaceOrderResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{31} return fileDescriptor_demo_bbfc9458084e7e4b, []int{30}
} }
func (m *PlaceOrderResponse) XXX_Unmarshal(b []byte) error { func (m *PlaceOrderResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PlaceOrderResponse.Unmarshal(m, b) return xxx_messageInfo_PlaceOrderResponse.Unmarshal(m, b)
@ -1527,7 +1496,6 @@ func init() {
proto.RegisterType((*ShipOrderRequest)(nil), "hipstershop.ShipOrderRequest") proto.RegisterType((*ShipOrderRequest)(nil), "hipstershop.ShipOrderRequest")
proto.RegisterType((*ShipOrderResponse)(nil), "hipstershop.ShipOrderResponse") proto.RegisterType((*ShipOrderResponse)(nil), "hipstershop.ShipOrderResponse")
proto.RegisterType((*Address)(nil), "hipstershop.Address") proto.RegisterType((*Address)(nil), "hipstershop.Address")
proto.RegisterType((*MoneyAmount)(nil), "hipstershop.MoneyAmount")
proto.RegisterType((*Money)(nil), "hipstershop.Money") proto.RegisterType((*Money)(nil), "hipstershop.Money")
proto.RegisterType((*GetSupportedCurrenciesResponse)(nil), "hipstershop.GetSupportedCurrenciesResponse") proto.RegisterType((*GetSupportedCurrenciesResponse)(nil), "hipstershop.GetSupportedCurrenciesResponse")
proto.RegisterType((*CurrencyConversionRequest)(nil), "hipstershop.CurrencyConversionRequest") proto.RegisterType((*CurrencyConversionRequest)(nil), "hipstershop.CurrencyConversionRequest")
@ -2294,100 +2262,98 @@ var _CheckoutService_serviceDesc = grpc.ServiceDesc{
Metadata: "demo.proto", Metadata: "demo.proto",
} }
func init() { proto.RegisterFile("demo.proto", fileDescriptor_demo_40506d781b7ed975) } func init() { proto.RegisterFile("demo.proto", fileDescriptor_demo_bbfc9458084e7e4b) }
var fileDescriptor_demo_40506d781b7ed975 = []byte{ var fileDescriptor_demo_bbfc9458084e7e4b = []byte{
// 1466 bytes of a gzipped FileDescriptorProto // 1435 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x58, 0xdd, 0x72, 0xd3, 0xc6, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x58, 0xdd, 0x72, 0xd3, 0x46,
0x17, 0x8f, 0x9c, 0x38, 0xb6, 0x8f, 0x63, 0x27, 0x59, 0x12, 0xfe, 0x46, 0x81, 0x90, 0xff, 0x66, 0x14, 0x8e, 0x1c, 0x3b, 0xb6, 0x8f, 0x63, 0x27, 0x59, 0x12, 0x6a, 0x14, 0x7e, 0xd2, 0xcd, 0x40,
0x4a, 0x43, 0xa1, 0x19, 0x30, 0xed, 0x70, 0x51, 0x5a, 0xca, 0x98, 0x8c, 0xf1, 0x0c, 0x14, 0xaa, 0xa1, 0x40, 0xca, 0xa4, 0x9d, 0xe1, 0xa2, 0xb4, 0x94, 0x31, 0x19, 0xe3, 0x19, 0x28, 0x54, 0x81,
0x40, 0xa7, 0x1d, 0x3a, 0x78, 0x84, 0xb4, 0xc1, 0x2a, 0xd6, 0x07, 0xab, 0x55, 0xa6, 0x66, 0x7a, 0x0e, 0x1d, 0x3a, 0xf5, 0x08, 0x69, 0xc1, 0x2a, 0x91, 0x56, 0xd9, 0x5d, 0x65, 0x6a, 0xa6, 0x57,
0x45, 0x5f, 0xa4, 0x57, 0xbd, 0xe8, 0x03, 0xb4, 0xef, 0xd0, 0xfb, 0xbe, 0x42, 0x9f, 0xa3, 0xb3, 0xf4, 0x01, 0x7a, 0xdf, 0x47, 0xe8, 0x03, 0xb4, 0xef, 0xd0, 0xfb, 0xbe, 0x42, 0x9f, 0xa3, 0xb3,
0xab, 0x5d, 0x7d, 0x59, 0x4a, 0xc2, 0x4d, 0x7b, 0xe7, 0xdd, 0xfd, 0xed, 0x39, 0xbf, 0x3d, 0xdf, 0x2b, 0xad, 0xfe, 0x6c, 0x25, 0xe1, 0xa6, 0xbd, 0xd3, 0xee, 0x7e, 0x7b, 0xce, 0xb7, 0xe7, 0xdf,
0x32, 0x80, 0x4d, 0x5c, 0x7f, 0x3f, 0xa0, 0x3e, 0xf3, 0x51, 0x7b, 0xe2, 0x04, 0x21, 0x23, 0x34, 0x06, 0x70, 0x89, 0x4f, 0x77, 0x42, 0x46, 0x05, 0x45, 0x9d, 0x89, 0x17, 0x72, 0x41, 0x18, 0x9f,
0x9c, 0xf8, 0x01, 0x3e, 0x80, 0xe6, 0xc0, 0xa4, 0x6c, 0xc4, 0x88, 0x8b, 0x2e, 0x01, 0x04, 0xd4, 0xd0, 0x10, 0xef, 0x41, 0x6b, 0x60, 0x33, 0x31, 0x12, 0xc4, 0x47, 0x17, 0x00, 0x42, 0x46, 0xdd,
0xb7, 0x23, 0x8b, 0x8d, 0x1d, 0xbb, 0xa7, 0xed, 0x68, 0x7b, 0x2d, 0xa3, 0x25, 0x77, 0x46, 0x36, 0xc8, 0x11, 0x63, 0xcf, 0xed, 0x1b, 0x5b, 0xc6, 0xd5, 0xb6, 0xd5, 0x4e, 0x76, 0x46, 0x2e, 0x32,
0xd2, 0xa1, 0xf9, 0x26, 0x32, 0x3d, 0xe6, 0xb0, 0x59, 0xaf, 0xb6, 0xa3, 0xed, 0xd5, 0x8d, 0x64, 0xa1, 0x75, 0x18, 0xd9, 0x81, 0xf0, 0xc4, 0xb4, 0x5f, 0xdb, 0x32, 0xae, 0x36, 0xac, 0x74, 0x8d,
0x8d, 0x9f, 0x42, 0xf7, 0x9e, 0x6d, 0x73, 0x29, 0x06, 0x79, 0x13, 0x91, 0x90, 0xa1, 0xff, 0x41, 0x9f, 0x42, 0xef, 0x9e, 0xeb, 0x4a, 0x29, 0x16, 0x39, 0x8c, 0x08, 0x17, 0xe8, 0x03, 0x68, 0x46,
0x23, 0x0a, 0x09, 0x4d, 0x25, 0x2d, 0xf3, 0xe5, 0xc8, 0x46, 0x57, 0x61, 0xc9, 0x61, 0xc4, 0x15, 0x9c, 0xb0, 0x4c, 0xd2, 0x92, 0x5c, 0x8e, 0x5c, 0x74, 0x0d, 0xea, 0x9e, 0x20, 0xbe, 0x12, 0xd1,
0x22, 0xda, 0xfd, 0xcd, 0xfd, 0x0c, 0x9b, 0x7d, 0x45, 0xc5, 0x10, 0x10, 0x7c, 0x0d, 0xd6, 0x0e, 0xd9, 0xdd, 0xd8, 0xc9, 0xb1, 0xd9, 0xd1, 0x54, 0x2c, 0x05, 0xc1, 0xd7, 0x61, 0x75, 0xcf, 0x0f,
0xdc, 0x80, 0xcd, 0xf8, 0xf6, 0x69, 0x72, 0xf1, 0x55, 0xe8, 0x0e, 0x09, 0x3b, 0x13, 0xf4, 0x21, 0xc5, 0x54, 0x6e, 0x9f, 0x24, 0x17, 0x5f, 0x83, 0xde, 0x90, 0x88, 0x53, 0x41, 0x1f, 0x42, 0x5d,
0x2c, 0x71, 0x5c, 0x35, 0xc7, 0x6b, 0x50, 0xe7, 0x04, 0xc2, 0x5e, 0x6d, 0x67, 0xb1, 0x9a, 0x64, 0xe2, 0xaa, 0x39, 0x5e, 0x87, 0x86, 0x24, 0xc0, 0xfb, 0xb5, 0xad, 0xc5, 0x6a, 0x92, 0x31, 0x06,
0x8c, 0xc1, 0x0d, 0xa8, 0x0b, 0x96, 0xf8, 0x1b, 0xd0, 0x1f, 0x3a, 0x21, 0x33, 0x88, 0xe5, 0xbb, 0x37, 0xa1, 0xa1, 0x58, 0xe2, 0x6f, 0xc1, 0x7c, 0xe8, 0x71, 0x61, 0x11, 0x87, 0xfa, 0x3e, 0x09,
0x2e, 0xf1, 0x6c, 0x93, 0x39, 0xbe, 0x17, 0x9e, 0x6a, 0x90, 0xcb, 0xd0, 0x4e, 0xcd, 0x1e, 0xab, 0x5c, 0x5b, 0x78, 0x34, 0xe0, 0x27, 0x1a, 0xe4, 0x12, 0x74, 0x32, 0xb3, 0xc7, 0x2a, 0xdb, 0x16,
0x6c, 0x19, 0x90, 0xd8, 0x3d, 0xc4, 0x5f, 0xc0, 0x56, 0xa9, 0xdc, 0x30, 0xf0, 0xbd, 0x90, 0x14, 0xa4, 0x76, 0xe7, 0xf8, 0x4b, 0xd8, 0x9c, 0x2b, 0x97, 0x87, 0x34, 0xe0, 0xa4, 0x7c, 0xdf, 0x98,
0xef, 0x6b, 0x73, 0xf7, 0x7f, 0xd1, 0xa0, 0xf1, 0x24, 0x5e, 0xa2, 0x2e, 0xd4, 0x12, 0x02, 0x35, 0xb9, 0xff, 0x9b, 0x01, 0xcd, 0x27, 0xf1, 0x12, 0xf5, 0xa0, 0x96, 0x12, 0xa8, 0x79, 0x2e, 0x42,
0xc7, 0x46, 0x08, 0x96, 0x3c, 0xd3, 0x25, 0xc2, 0x1b, 0x2d, 0x43, 0xfc, 0x46, 0x3b, 0xd0, 0xb6, 0x50, 0x0f, 0x6c, 0x9f, 0x28, 0x6f, 0xb4, 0x2d, 0xf5, 0x8d, 0xb6, 0xa0, 0xe3, 0x12, 0xee, 0x30,
0x49, 0x68, 0x51, 0x27, 0xe0, 0x8a, 0x7a, 0x8b, 0xe2, 0x28, 0xbb, 0x85, 0x7a, 0xd0, 0x08, 0x1c, 0x2f, 0x94, 0x8a, 0xfa, 0x8b, 0xea, 0x28, 0xbf, 0x85, 0xfa, 0xd0, 0x0c, 0x3d, 0x47, 0x44, 0x8c,
0x8b, 0x45, 0x94, 0xf4, 0x96, 0xc4, 0xa9, 0x5a, 0xa2, 0x4f, 0xa1, 0x15, 0x50, 0xc7, 0x22, 0xe3, 0xf4, 0xeb, 0xea, 0x54, 0x2f, 0xd1, 0x27, 0xd0, 0x0e, 0x99, 0xe7, 0x90, 0x71, 0xc4, 0xdd, 0x7e,
0x28, 0xb4, 0x7b, 0x75, 0xe1, 0xe2, 0x5e, 0xce, 0x7a, 0x8f, 0x7c, 0x8f, 0xcc, 0xee, 0xb9, 0x7e, 0x43, 0xb9, 0x18, 0x15, 0xac, 0xf7, 0x88, 0x06, 0x64, 0x6a, 0xb5, 0x14, 0xe8, 0x19, 0x77, 0xf1,
0xe4, 0x31, 0xa3, 0x29, 0xa0, 0xcf, 0x42, 0x1b, 0x3f, 0x80, 0x0d, 0xfe, 0x44, 0xc9, 0x32, 0x7d, 0x03, 0x58, 0x97, 0x8f, 0x4b, 0xf8, 0x65, 0xaf, 0xba, 0x05, 0xad, 0xe4, 0x09, 0xf1, 0x93, 0x3a,
0xdb, 0x0d, 0x68, 0xca, 0x87, 0xc4, 0x0f, 0x6b, 0xf7, 0x37, 0x72, 0xd2, 0xe4, 0x05, 0x23, 0x41, 0xbb, 0xeb, 0x05, 0x39, 0xc9, 0x05, 0x2b, 0x45, 0xe1, 0x6d, 0x58, 0x1b, 0x12, 0x2d, 0x48, 0x5b,
0xe1, 0x5d, 0x58, 0x1f, 0x12, 0x25, 0x48, 0xd9, 0xbe, 0xf0, 0x6a, 0xfc, 0x31, 0x6c, 0x1e, 0x12, 0xbd, 0xf4, 0x5e, 0x7c, 0x13, 0x36, 0xf6, 0x89, 0xcd, 0x9c, 0x49, 0xa6, 0x30, 0x06, 0xae, 0x43,
0x93, 0x5a, 0x93, 0x54, 0x61, 0x0c, 0xdc, 0x80, 0xfa, 0x9b, 0x88, 0xd0, 0x99, 0xc4, 0xc6, 0x0b, 0xe3, 0x30, 0x22, 0x6c, 0x9a, 0x60, 0xe3, 0x05, 0x7e, 0x00, 0x67, 0xcb, 0xf0, 0x84, 0xdf, 0x0e,
0xfc, 0x00, 0xce, 0x17, 0xe1, 0x92, 0xdf, 0x3e, 0x34, 0x28, 0x09, 0xa3, 0xe9, 0x29, 0xf4, 0x14, 0x34, 0x19, 0xe1, 0xd1, 0xc1, 0x09, 0xf4, 0x34, 0x08, 0x07, 0xb0, 0x32, 0x24, 0xe2, 0x9b, 0x88,
0x08, 0x7b, 0xb0, 0x3a, 0x24, 0xec, 0xeb, 0xc8, 0x67, 0x44, 0xa9, 0xdc, 0x87, 0x86, 0x69, 0xdb, 0x0a, 0xa2, 0x55, 0xee, 0x40, 0xd3, 0x76, 0x5d, 0x46, 0x38, 0x57, 0x4a, 0xcb, 0x22, 0xee, 0xc5,
0x94, 0x84, 0xa1, 0x50, 0x5a, 0x14, 0x71, 0x2f, 0x3e, 0x33, 0x14, 0xe8, 0xfd, 0x62, 0x73, 0x08, 0x67, 0x96, 0x06, 0xbd, 0x5f, 0x54, 0xde, 0x83, 0xd5, 0x4c, 0x5f, 0xc2, 0xf9, 0x26, 0xb4, 0x1c,
0x6b, 0xa9, 0x3e, 0xc9, 0xf9, 0x16, 0x34, 0x2d, 0x3f, 0x64, 0xc2, 0x43, 0xda, 0x29, 0x1e, 0x6a, 0xca, 0x85, 0xf2, 0x8d, 0x51, 0xe9, 0x9b, 0xa6, 0xc4, 0x48, 0xd7, 0x50, 0x58, 0xdd, 0x9f, 0x78,
0x70, 0x24, 0x77, 0x90, 0x0f, 0x6b, 0x87, 0x13, 0x27, 0x78, 0x4c, 0x6d, 0x42, 0xff, 0x15, 0xe6, 0xe1, 0x63, 0xe6, 0x12, 0xf6, 0x9f, 0x70, 0xfe, 0x0c, 0xd6, 0x72, 0x0a, 0xb3, 0xf0, 0x16, 0xcc,
0x9f, 0xc0, 0x7a, 0x46, 0x61, 0x1a, 0xea, 0x8c, 0x9a, 0xd6, 0x6b, 0xc7, 0x7b, 0x95, 0xe6, 0x11, 0x76, 0xde, 0x78, 0xc1, 0xeb, 0x2c, 0x77, 0x40, 0x6f, 0x8d, 0x5c, 0xfc, 0xab, 0x01, 0xcd, 0x44,
0xa8, 0xad, 0x91, 0x8d, 0x7f, 0xd5, 0xa0, 0x21, 0xf5, 0xa2, 0x3d, 0x58, 0x0b, 0x19, 0x25, 0x84, 0x2f, 0xba, 0x0c, 0x3d, 0x2e, 0x18, 0x21, 0x62, 0x9c, 0x67, 0xd9, 0xb6, 0xba, 0xf1, 0xae, 0x86,
0x8d, 0x25, 0x81, 0xf1, 0x4d, 0x79, 0xa3, 0x1b, 0xef, 0x4b, 0xe0, 0xcd, 0x12, 0x64, 0x5f, 0x26, 0x21, 0xa8, 0x3b, 0xba, 0x8c, 0xb5, 0x2d, 0xf5, 0x2d, 0x03, 0x80, 0x0b, 0x5b, 0x90, 0x24, 0xde,
0x44, 0x1e, 0xd9, 0xe7, 0xe9, 0x62, 0xf1, 0xfa, 0x17, 0xe7, 0x84, 0xf8, 0xcd, 0x93, 0xc1, 0xe2, 0xe3, 0x85, 0x8c, 0x74, 0x87, 0x46, 0x81, 0x60, 0x53, 0x1d, 0xe9, 0xc9, 0x12, 0x9d, 0x83, 0xd6,
0xc6, 0xa2, 0x33, 0x95, 0x0c, 0x72, 0x89, 0x2e, 0x40, 0xf3, 0xad, 0x13, 0x8c, 0x2d, 0xdf, 0x26, 0x5b, 0x2f, 0x1c, 0x3b, 0xd4, 0x25, 0x2a, 0xd0, 0x1b, 0x56, 0xf3, 0xad, 0x17, 0x0e, 0xa8, 0x4b,
0x22, 0x17, 0xea, 0x46, 0xe3, 0xad, 0x13, 0x0c, 0x7c, 0x9b, 0xe0, 0x21, 0xb4, 0x33, 0x76, 0xe6, 0xf0, 0x73, 0x68, 0x28, 0x53, 0xa2, 0x6d, 0xe8, 0x3a, 0x11, 0x63, 0x24, 0x70, 0xa6, 0x31, 0x30,
0x32, 0x6c, 0x62, 0x39, 0xae, 0x39, 0x15, 0x14, 0x3b, 0x86, 0x5a, 0xa2, 0x6d, 0x80, 0x23, 0x6a, 0x66, 0xb3, 0xac, 0x37, 0x25, 0x5a, 0x2a, 0x8e, 0x02, 0x4f, 0x70, 0xc5, 0x66, 0xd1, 0x8a, 0x17,
0x5a, 0x3c, 0xed, 0xcc, 0xa9, 0x60, 0xd5, 0x31, 0x32, 0x3b, 0xf8, 0x05, 0xd4, 0x85, 0x20, 0xb4, 0x72, 0x37, 0xb0, 0x03, 0xca, 0x15, 0x9d, 0x86, 0x15, 0x2f, 0xf0, 0x10, 0x2e, 0x0e, 0x89, 0xd8,
0x0b, 0x1d, 0x2b, 0xa2, 0x94, 0x78, 0xd6, 0x2c, 0xd6, 0x18, 0xbf, 0x75, 0x45, 0x6d, 0x72, 0xb5, 0x8f, 0xc2, 0x90, 0x32, 0x41, 0xdc, 0x41, 0x2c, 0xc7, 0x23, 0x59, 0x5c, 0x5e, 0x86, 0x5e, 0x41,
0xe8, 0x06, 0x2c, 0x9b, 0x42, 0xa3, 0x2c, 0xbf, 0xd5, 0x9e, 0x97, 0x38, 0x3c, 0x84, 0xed, 0x21, 0xa5, 0x2e, 0x08, 0xdd, 0xbc, 0x4e, 0x8e, 0xbf, 0x87, 0x73, 0x83, 0x74, 0x23, 0x38, 0x22, 0x8c,
0x61, 0x87, 0x51, 0x10, 0xf8, 0x94, 0x11, 0x7b, 0x10, 0x4b, 0x73, 0x48, 0x9a, 0x03, 0x1f, 0x40, 0x7b, 0x34, 0xd0, 0x4e, 0xbe, 0x02, 0xf5, 0x57, 0x8c, 0xfa, 0xc7, 0xc4, 0x88, 0x3a, 0x97, 0x25,
0x37, 0xa7, 0x58, 0x95, 0xa0, 0x4e, 0x56, 0x73, 0x88, 0xbf, 0x87, 0x0b, 0x83, 0x64, 0xc3, 0x3b, 0x4d, 0xd0, 0xf8, 0x61, 0xb1, 0x25, 0x97, 0x04, 0x55, 0x06, 0xf8, 0xc7, 0x80, 0xde, 0x80, 0x11,
0x26, 0x34, 0x74, 0x7c, 0x4f, 0x85, 0xd2, 0x15, 0x58, 0x3a, 0xa2, 0xbe, 0x2b, 0xe3, 0x08, 0xcd, 0xd7, 0x93, 0xf5, 0xd8, 0x1d, 0x05, 0xaf, 0x28, 0xba, 0x01, 0xc8, 0x51, 0x3b, 0x63, 0xc7, 0x66,
0xb3, 0x32, 0xc4, 0x39, 0x2f, 0xa2, 0xcc, 0x8f, 0x9f, 0x17, 0x3b, 0x68, 0x99, 0xf9, 0xc2, 0x9e, 0xee, 0x38, 0x88, 0xfc, 0x97, 0x84, 0x25, 0xf6, 0x58, 0x75, 0x52, 0xec, 0xd7, 0x6a, 0x1f, 0x5d,
0x7f, 0x6b, 0xd0, 0x1d, 0x50, 0x62, 0x3b, 0xbc, 0x03, 0xd8, 0x23, 0xef, 0xc8, 0x47, 0xd7, 0x01, 0x81, 0x95, 0x3c, 0xda, 0x39, 0x3a, 0x4a, 0x5a, 0x4e, 0x37, 0x83, 0x0e, 0x8e, 0x8e, 0xd0, 0x17,
0x59, 0x62, 0x67, 0x6c, 0x99, 0xd4, 0x1e, 0x7b, 0x91, 0xfb, 0x92, 0x50, 0x69, 0x95, 0x35, 0x2b, 0xb0, 0x99, 0xc7, 0x91, 0x9f, 0x42, 0x8f, 0xa9, 0xf2, 0x38, 0x9e, 0x12, 0x9b, 0x25, 0xb6, 0xeb,
0xc1, 0x7e, 0x25, 0xf6, 0xd1, 0x15, 0x58, 0xcd, 0xa2, 0xad, 0xe3, 0x63, 0xd9, 0xe4, 0x3a, 0x29, 0x67, 0x77, 0xf6, 0x52, 0xc0, 0x77, 0xc4, 0x66, 0xe8, 0x2e, 0x9c, 0xaf, 0xb8, 0xee, 0xd3, 0x40,
0x74, 0x70, 0x7c, 0x8c, 0x3e, 0x87, 0xad, 0x2c, 0x8e, 0xfc, 0x18, 0x38, 0x54, 0x14, 0xe4, 0xf1, 0x4c, 0x94, 0xcb, 0x1b, 0xd6, 0xb9, 0x79, 0xf7, 0x1f, 0x49, 0x00, 0x9e, 0x42, 0x77, 0x30, 0xb1,
0x8c, 0x98, 0x54, 0x04, 0x46, 0xdd, 0xe8, 0xa5, 0x77, 0x0e, 0x12, 0xc0, 0x77, 0xc4, 0xa4, 0xe8, 0xd9, 0xeb, 0x34, 0xa7, 0x3f, 0x86, 0x25, 0xdb, 0x97, 0x11, 0x72, 0x8c, 0xf1, 0x12, 0x04, 0xba,
0x2e, 0x5c, 0xac, 0xb8, 0xee, 0xfa, 0x1e, 0x9b, 0x88, 0x08, 0xaa, 0x1b, 0x17, 0xca, 0xee, 0x3f, 0x03, 0x9d, 0x9c, 0xf6, 0xa4, 0x21, 0x6e, 0x16, 0x33, 0xa4, 0x60, 0x44, 0x0b, 0x32, 0x26, 0xf8,
0xe2, 0x00, 0x3c, 0x83, 0xce, 0x60, 0x62, 0xd2, 0x57, 0x49, 0xfd, 0xf8, 0x28, 0x71, 0x69, 0xb5, 0x36, 0xf4, 0xb4, 0xea, 0xcc, 0xf5, 0x82, 0xd9, 0x01, 0xb7, 0x1d, 0xf5, 0x84, 0x34, 0x59, 0xba,
0xf1, 0x24, 0x02, 0xdd, 0x81, 0x76, 0x46, 0xbb, 0x8c, 0x81, 0xad, 0x7c, 0x1e, 0xe6, 0x8c, 0x68, 0xb9, 0xdd, 0x91, 0x8b, 0x7f, 0x80, 0xb6, 0xca, 0x30, 0xd5, 0xf3, 0x75, 0x37, 0x36, 0x4e, 0xec,
0x40, 0xca, 0x04, 0xdf, 0x86, 0xae, 0x52, 0x9d, 0xba, 0x9e, 0x51, 0xd3, 0x0b, 0xe3, 0x68, 0x4c, 0xc6, 0x32, 0x2a, 0x64, 0x65, 0x48, 0x78, 0xce, 0x8d, 0x0a, 0x79, 0x8e, 0xdf, 0xd5, 0xa0, 0xa3,
0x53, 0xb2, 0x93, 0xd9, 0x1d, 0xd9, 0xf8, 0x05, 0xb4, 0x44, 0x1e, 0x8b, 0x29, 0x43, 0xf5, 0x7f, 0x53, 0x38, 0x3a, 0x10, 0x32, 0x51, 0xa8, 0x5c, 0x66, 0x84, 0x9a, 0x6a, 0x3d, 0x72, 0xd1, 0x2d,
0xed, 0xd4, 0xfe, 0xcf, 0xa3, 0x82, 0xd7, 0x1f, 0xc9, 0xb3, 0x34, 0x2a, 0xf8, 0x39, 0x7e, 0x57, 0x58, 0xe7, 0x13, 0x2f, 0x0c, 0x65, 0x6e, 0xe7, 0x93, 0x3c, 0x8e, 0x26, 0xa4, 0xcf, 0x9e, 0xa6,
0x83, 0xb6, 0x2a, 0x14, 0xd1, 0x94, 0xf1, 0xbc, 0xf3, 0xf9, 0x32, 0x25, 0xd4, 0x10, 0xeb, 0x91, 0xc9, 0x8e, 0x6e, 0x43, 0x37, 0xbd, 0xa1, 0xd8, 0x2c, 0x56, 0xb2, 0x59, 0xd6, 0xc0, 0x01, 0xe5,
0x8d, 0x6e, 0xc0, 0x46, 0x38, 0x71, 0x82, 0x80, 0x57, 0x90, 0x6c, 0x29, 0x89, 0xa3, 0x09, 0xa9, 0x02, 0xdd, 0x85, 0xd5, 0xf4, 0xa2, 0xae, 0x0d, 0xf5, 0x63, 0x2a, 0xd8, 0x8a, 0x46, 0xeb, 0x9a,
0xb3, 0xa7, 0x49, 0x49, 0x41, 0xb7, 0xa1, 0x93, 0xdc, 0x10, 0x6c, 0x16, 0x2b, 0xd9, 0xac, 0x28, 0x71, 0x43, 0x57, 0xb2, 0x86, 0xaa, 0x64, 0x67, 0x0b, 0xb7, 0x52, 0x83, 0xea, 0x52, 0xe6, 0xc2,
0xe0, 0xc0, 0x0f, 0x19, 0xba, 0x0b, 0x6b, 0xc9, 0x45, 0x55, 0x27, 0x97, 0x4e, 0xa8, 0x93, 0xab, 0xf9, 0x7d, 0x12, 0xb8, 0x6a, 0x7f, 0x40, 0x83, 0x57, 0x1e, 0xf3, 0x55, 0xd8, 0xe4, 0xda, 0x0d,
0x0a, 0xad, 0x0a, 0xd8, 0x75, 0x55, 0x2f, 0xeb, 0xa2, 0x5e, 0x9e, 0xcf, 0xdd, 0x4a, 0x0c, 0xaa, 0xf1, 0x6d, 0xef, 0x40, 0xb7, 0x1b, 0xb5, 0x40, 0x3b, 0xd0, 0x50, 0xa6, 0x49, 0x6c, 0xdc, 0x9f,
0x0a, 0xa6, 0x0d, 0x17, 0x0f, 0x89, 0x67, 0x8b, 0xfd, 0x81, 0xef, 0x1d, 0x39, 0xd4, 0x15, 0x61, 0xd5, 0x11, 0xdb, 0xd4, 0x8a, 0x61, 0xf8, 0x9d, 0x01, 0x68, 0xc0, 0x88, 0x2d, 0x48, 0xa1, 0x48,
0x93, 0x69, 0x6d, 0xc4, 0x35, 0x9d, 0xa9, 0x6a, 0x6d, 0x62, 0x81, 0xf6, 0xa1, 0x2e, 0x4c, 0x53, 0x57, 0x8e, 0x1a, 0xdb, 0xd0, 0x55, 0x07, 0xba, 0x16, 0x24, 0x86, 0x5e, 0x96, 0x9b, 0xba, 0x1c,
0x5a, 0x0f, 0x32, 0x36, 0x35, 0x62, 0x18, 0x7e, 0xa7, 0x01, 0x1a, 0x50, 0x62, 0x32, 0x92, 0x6b, 0xe4, 0x4b, 0xfc, 0xe2, 0x29, 0x4a, 0x3c, 0xfe, 0x19, 0xce, 0x14, 0x38, 0x24, 0xd1, 0x98, 0xda,
0x05, 0x95, 0xc3, 0xcd, 0x2e, 0x74, 0xc4, 0x81, 0xaa, 0x05, 0xd2, 0xd0, 0x2b, 0x7c, 0x53, 0x95, 0xcb, 0x38, 0x85, 0xbd, 0x66, 0xfd, 0x5a, 0x3b, 0x9d, 0x5f, 0xf1, 0xdf, 0x06, 0xac, 0x3d, 0x39,
0x83, 0x6c, 0x23, 0x59, 0x3c, 0x43, 0x23, 0xc1, 0x3f, 0xc1, 0xb9, 0x1c, 0x07, 0x19, 0x8d, 0x89, 0xb0, 0x9d, 0xff, 0xd1, 0x02, 0x99, 0x33, 0x1b, 0x79, 0x67, 0x96, 0xd2, 0x7b, 0xe9, 0xfd, 0xd2,
0xbd, 0xb4, 0x33, 0xd8, 0x6b, 0xde, 0xaf, 0xb5, 0xb3, 0xf9, 0x15, 0xff, 0xa5, 0xc1, 0xfa, 0x93, 0xfb, 0x3e, 0xa0, 0xfc, 0xb3, 0xd2, 0xa9, 0x23, 0x09, 0x10, 0xe3, 0x54, 0x01, 0xb2, 0xfb, 0x97,
0xa9, 0x69, 0xfd, 0x87, 0x16, 0x48, 0x9d, 0x59, 0xcf, 0x3a, 0xb3, 0x90, 0xde, 0xcb, 0xef, 0x97, 0x01, 0x1d, 0x99, 0xc6, 0xfb, 0x84, 0x1d, 0x79, 0x0e, 0x41, 0x77, 0x54, 0xab, 0x54, 0x99, 0xbf,
0xde, 0xf7, 0x01, 0x65, 0x9f, 0x95, 0x4c, 0x38, 0x32, 0x40, 0xb4, 0x33, 0x05, 0x48, 0xff, 0x4f, 0x59, 0x7e, 0x53, 0x6e, 0x7a, 0x37, 0x8b, 0x76, 0x8f, 0xc7, 0xdb, 0x05, 0xf4, 0x39, 0x34, 0x93,
0x0d, 0xda, 0x3c, 0x8d, 0x0f, 0x09, 0x3d, 0x76, 0x2c, 0x82, 0xee, 0x88, 0x86, 0x2c, 0x32, 0x7f, 0x11, 0xbb, 0x74, 0xbb, 0x38, 0x78, 0x9b, 0x6b, 0x33, 0x65, 0x04, 0x2f, 0xa0, 0xaf, 0xa0, 0x9d,
0xab, 0xf8, 0xa6, 0xcc, 0xf7, 0x82, 0x9e, 0xb7, 0x7b, 0x3c, 0x50, 0x2f, 0xa0, 0xcf, 0xa0, 0x21, 0x0e, 0xf3, 0xe8, 0xc2, 0xac, 0xfc, 0xbc, 0x80, 0xb9, 0xea, 0x77, 0x7f, 0x31, 0x60, 0xa3, 0x38,
0x87, 0xfa, 0xc2, 0xed, 0xfc, 0xa8, 0xaf, 0xaf, 0xcf, 0x95, 0x11, 0xbc, 0x80, 0xbe, 0x84, 0x56, 0x04, 0xeb, 0x67, 0xfd, 0x08, 0x67, 0xe6, 0x4c, 0xc8, 0xe8, 0xa3, 0x82, 0x98, 0xea, 0xd9, 0xdc,
0xf2, 0xf9, 0x80, 0x2e, 0xcd, 0xcb, 0xcf, 0x0a, 0x28, 0x55, 0xdf, 0xff, 0x59, 0x83, 0xcd, 0xfc, 0xbc, 0x7a, 0x32, 0x30, 0x76, 0x80, 0x64, 0x51, 0x83, 0x8d, 0x64, 0xba, 0x1b, 0xd8, 0xc2, 0x3e,
0xd8, 0xad, 0x9e, 0xf5, 0x03, 0x9c, 0x2b, 0x99, 0xc9, 0xd1, 0x87, 0x39, 0x31, 0xd5, 0x5f, 0x03, 0xa0, 0xaf, 0x35, 0x8b, 0x21, 0x2c, 0xe7, 0x47, 0x59, 0x34, 0xe7, 0x15, 0xe6, 0x87, 0x33, 0x9a,
0xfa, 0xde, 0xe9, 0xc0, 0xd8, 0x01, 0x9c, 0x45, 0x0d, 0x36, 0xe5, 0x24, 0x39, 0x30, 0x99, 0x39, 0xca, 0x93, 0x25, 0x5e, 0x40, 0xf7, 0x01, 0xb2, 0x49, 0x16, 0x5d, 0x2c, 0x9b, 0xba, 0x38, 0xe2,
0xf5, 0x5f, 0x29, 0x16, 0x43, 0x58, 0xc9, 0x8e, 0xcd, 0xa8, 0xe4, 0x15, 0xfa, 0xff, 0xe7, 0x34, 0x9a, 0x73, 0x07, 0x4f, 0xbc, 0x80, 0x5e, 0x40, 0xaf, 0x38, 0xbb, 0x22, 0x5c, 0x40, 0xce, 0x9d,
0x15, 0xa7, 0x58, 0xbc, 0x80, 0xee, 0x03, 0xa4, 0x53, 0x33, 0xda, 0x2e, 0x9a, 0x3a, 0x3f, 0x4e, 0x83, 0xcd, 0xed, 0x63, 0x31, 0xa9, 0x15, 0x7e, 0x37, 0x60, 0x65, 0x3f, 0xc9, 0x43, 0xfd, 0xfe,
0xeb, 0xa5, 0x43, 0x2e, 0x5e, 0x40, 0xcf, 0xa1, 0x9b, 0x9f, 0x93, 0x11, 0xce, 0x21, 0x4b, 0x67, 0x11, 0xb4, 0xf4, 0xc8, 0x89, 0xce, 0x97, 0x49, 0xe7, 0x27, 0x5f, 0xf3, 0x42, 0xc5, 0x69, 0x6a,
0x6e, 0x7d, 0xf7, 0x44, 0x4c, 0x62, 0x85, 0xdf, 0x34, 0x58, 0x3d, 0x94, 0x79, 0xa8, 0xde, 0x3f, 0x81, 0x87, 0xd0, 0x4e, 0x27, 0xc1, 0x52, 0xb0, 0x94, 0x47, 0x52, 0xf3, 0x62, 0xd5, 0x71, 0x4a,
0x82, 0xa6, 0x1a, 0x6f, 0xd1, 0xc5, 0x22, 0xe9, 0xec, 0x94, 0xad, 0x5f, 0xaa, 0x38, 0x4d, 0x2c, 0xf6, 0x4f, 0x03, 0x56, 0x74, 0x72, 0x6b, 0xb2, 0x2f, 0xe0, 0xec, 0xfc, 0x49, 0x6a, 0xae, 0xdb,
0xf0, 0x10, 0x5a, 0xc9, 0xbc, 0x59, 0x08, 0x96, 0xe2, 0xe0, 0xab, 0x6f, 0x57, 0x1d, 0x27, 0x64, 0xae, 0x97, 0x09, 0x1f, 0x33, 0x82, 0xe1, 0x05, 0x34, 0x84, 0x66, 0x3c, 0x55, 0x09, 0x74, 0xa5,
0xff, 0xd0, 0x60, 0x55, 0x25, 0xb7, 0x22, 0xfb, 0x1c, 0xce, 0x97, 0x4f, 0x52, 0xa5, 0x6e, 0xbb, 0x98, 0x0b, 0x55, 0x33, 0x97, 0x39, 0xa7, 0xd2, 0xe1, 0x85, 0xdd, 0x67, 0xd0, 0x7b, 0x62, 0x4f,
0x56, 0x24, 0x7c, 0xc2, 0x08, 0x86, 0x17, 0xd0, 0x10, 0x1a, 0xf1, 0x54, 0xc5, 0xd0, 0x95, 0x7c, 0x7d, 0x12, 0xa4, 0x19, 0x3c, 0x80, 0xa5, 0xb8, 0xed, 0x23, 0xb3, 0x28, 0x39, 0x3f, 0x86, 0x98,
0x2e, 0x54, 0xcd, 0x5c, 0x7a, 0x49, 0xa5, 0xc3, 0x0b, 0xfd, 0x67, 0xd0, 0x7d, 0x62, 0xce, 0x5c, 0x9b, 0x73, 0xcf, 0x52, 0x83, 0x4c, 0x60, 0x79, 0x4f, 0xd6, 0x28, 0x2d, 0xf4, 0xb9, 0xfc, 0x55,
0xe2, 0x25, 0x19, 0x3c, 0x80, 0xe5, 0xb8, 0xed, 0x23, 0x3d, 0x2f, 0x39, 0x3b, 0x86, 0xe8, 0x5b, 0x34, 0xa7, 0x5b, 0xa1, 0x6b, 0xa5, 0x68, 0xa8, 0xee, 0x68, 0x15, 0x39, 0xfb, 0x87, 0x34, 0xfd,
0xa5, 0x67, 0x89, 0x41, 0x26, 0xb0, 0x72, 0xc0, 0x6b, 0x94, 0x12, 0xfa, 0x2d, 0xff, 0x02, 0x2b, 0x84, 0x38, 0x6f, 0x68, 0x94, 0x3e, 0xc1, 0x82, 0x4e, 0xae, 0x61, 0xa0, 0x4b, 0xe5, 0x92, 0x58,
0xe9, 0x56, 0xe8, 0x6a, 0x21, 0x1a, 0xaa, 0x3b, 0x5a, 0x45, 0xce, 0xfe, 0xce, 0x4d, 0x3f, 0x21, 0x6a, 0x67, 0xe6, 0x56, 0x35, 0x20, 0xb5, 0xf8, 0x63, 0x80, 0xac, 0x5c, 0x96, 0x52, 0x66, 0xa6,
0xd6, 0x6b, 0x3f, 0x4a, 0x9e, 0x60, 0x40, 0x3b, 0xd3, 0x30, 0xd0, 0xe5, 0x62, 0x49, 0x2c, 0xb4, 0x3d, 0x98, 0x97, 0x2a, 0xcf, 0xb5, 0xc0, 0x97, 0x4b, 0xea, 0xcf, 0x92, 0x4f, 0xff, 0x0d, 0x00,
0x33, 0x7d, 0xa7, 0x1a, 0x90, 0x58, 0xfc, 0x31, 0x40, 0x5a, 0x2e, 0x0b, 0x29, 0x33, 0xd7, 0x1e, 0x00, 0xff, 0xff, 0x1d, 0x9c, 0xae, 0xb8, 0x3a, 0x11, 0x00, 0x00,
0xf4, 0xcb, 0x95, 0xe7, 0x4a, 0xe0, 0xcb, 0x65, 0xf1, 0xf7, 0xcc, 0xad, 0x7f, 0x02, 0x00, 0x00,
0xff, 0xff, 0xdd, 0xe8, 0xfb, 0x77, 0xac, 0x11, 0x00, 0x00,
} }

View file

@ -34,10 +34,10 @@ func (s *server) GetQuote(ctx context.Context, in *pb.GetQuoteRequest) (*pb.GetQ
// 3. Generate a response. // 3. Generate a response.
return &pb.GetQuoteResponse{ return &pb.GetQuoteResponse{
CostUsd: &pb.MoneyAmount{ CostUsd: &pb.Money{
Decimal: quote.Dollars, CurrencyCode: "USD",
Fractional: quote.Cents, Units: int64(quote.Dollars),
}, Nanos: int32(quote.Cents * 10000000)},
}, nil }, nil
} }
@ -46,7 +46,7 @@ func (s *server) GetQuote(ctx context.Context, in *pb.GetQuoteRequest) (*pb.GetQ
// It supplies a tracking ID for notional lookup of shipment delivery status. // It supplies a tracking ID for notional lookup of shipment delivery status.
func (s *server) ShipOrder(ctx context.Context, in *pb.ShipOrderRequest) (*pb.ShipOrderResponse, error) { func (s *server) ShipOrder(ctx context.Context, in *pb.ShipOrderRequest) (*pb.ShipOrderResponse, error) {
// 1. Create a Tracking ID // 1. Create a Tracking ID
baseAddress := fmt.Sprintf("%s, %s, %s", in.Address.StreetAddress_1, in.Address.StreetAddress_2, in.Address.City) baseAddress := fmt.Sprintf("%s, %s, %s", in.Address.StreetAddress, in.Address.City, in.Address.State)
id := CreateTrackingId(baseAddress) id := CreateTrackingId(baseAddress)
// 2. Generate a response. // 2. Generate a response.

View file

@ -15,9 +15,9 @@ func TestGetQuote(t *testing.T) {
// A basic test case to test logic and protobuf interactions. // A basic test case to test logic and protobuf interactions.
req := &pb.GetQuoteRequest{ req := &pb.GetQuoteRequest{
Address: &pb.Address{ Address: &pb.Address{
StreetAddress_1: "Muffin Man", StreetAddress: "Muffin Man",
StreetAddress_2: "Drury Lane",
City: "London", City: "London",
State: "",
Country: "England", Country: "England",
}, },
Items: []*pb.CartItem{ Items: []*pb.CartItem{
@ -36,8 +36,8 @@ func TestGetQuote(t *testing.T) {
if err != nil { if err != nil {
t.Errorf("TestGetQuote (%v) failed", err) t.Errorf("TestGetQuote (%v) failed", err)
} }
if res.CostUsd.Decimal != 11 || res.CostUsd.Fractional != 22 { if res.CostUsd.GetUnits() != 11 || res.CostUsd.GetNanos() != 220000000 {
t.Errorf("TestGetQuote: Quote value '%d.%d' does not match expected '%s'", res.CostUsd.Decimal, res.CostUsd.Fractional, "11.22") t.Errorf("TestGetQuote: Quote value '%d.%d' does not match expected '%s'", res.CostUsd.GetUnits(), res.CostUsd.GetNanos(), "11.220000000")
} }
} }
@ -48,9 +48,9 @@ func TestShipOrder(t *testing.T) {
// A basic test case to test logic and protobuf interactions. // A basic test case to test logic and protobuf interactions.
req := &pb.ShipOrderRequest{ req := &pb.ShipOrderRequest{
Address: &pb.Address{ Address: &pb.Address{
StreetAddress_1: "Muffin Man", StreetAddress: "Muffin Man",
StreetAddress_2: "Drury Lane",
City: "London", City: "London",
State: "",
Country: "England", Country: "England",
}, },
Items: []*pb.CartItem{ Items: []*pb.CartItem{

View file

@ -35,7 +35,7 @@ func (m *CartItem) Reset() { *m = CartItem{} }
func (m *CartItem) String() string { return proto.CompactTextString(m) } func (m *CartItem) String() string { return proto.CompactTextString(m) }
func (*CartItem) ProtoMessage() {} func (*CartItem) ProtoMessage() {}
func (*CartItem) Descriptor() ([]byte, []int) { func (*CartItem) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{0} return fileDescriptor_demo_bbfc9458084e7e4b, []int{0}
} }
func (m *CartItem) XXX_Unmarshal(b []byte) error { func (m *CartItem) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CartItem.Unmarshal(m, b) return xxx_messageInfo_CartItem.Unmarshal(m, b)
@ -81,7 +81,7 @@ func (m *AddItemRequest) Reset() { *m = AddItemRequest{} }
func (m *AddItemRequest) String() string { return proto.CompactTextString(m) } func (m *AddItemRequest) String() string { return proto.CompactTextString(m) }
func (*AddItemRequest) ProtoMessage() {} func (*AddItemRequest) ProtoMessage() {}
func (*AddItemRequest) Descriptor() ([]byte, []int) { func (*AddItemRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{1} return fileDescriptor_demo_bbfc9458084e7e4b, []int{1}
} }
func (m *AddItemRequest) XXX_Unmarshal(b []byte) error { func (m *AddItemRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_AddItemRequest.Unmarshal(m, b) return xxx_messageInfo_AddItemRequest.Unmarshal(m, b)
@ -126,7 +126,7 @@ func (m *EmptyCartRequest) Reset() { *m = EmptyCartRequest{} }
func (m *EmptyCartRequest) String() string { return proto.CompactTextString(m) } func (m *EmptyCartRequest) String() string { return proto.CompactTextString(m) }
func (*EmptyCartRequest) ProtoMessage() {} func (*EmptyCartRequest) ProtoMessage() {}
func (*EmptyCartRequest) Descriptor() ([]byte, []int) { func (*EmptyCartRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{2} return fileDescriptor_demo_bbfc9458084e7e4b, []int{2}
} }
func (m *EmptyCartRequest) XXX_Unmarshal(b []byte) error { func (m *EmptyCartRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_EmptyCartRequest.Unmarshal(m, b) return xxx_messageInfo_EmptyCartRequest.Unmarshal(m, b)
@ -164,7 +164,7 @@ func (m *GetCartRequest) Reset() { *m = GetCartRequest{} }
func (m *GetCartRequest) String() string { return proto.CompactTextString(m) } func (m *GetCartRequest) String() string { return proto.CompactTextString(m) }
func (*GetCartRequest) ProtoMessage() {} func (*GetCartRequest) ProtoMessage() {}
func (*GetCartRequest) Descriptor() ([]byte, []int) { func (*GetCartRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{3} return fileDescriptor_demo_bbfc9458084e7e4b, []int{3}
} }
func (m *GetCartRequest) XXX_Unmarshal(b []byte) error { func (m *GetCartRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetCartRequest.Unmarshal(m, b) return xxx_messageInfo_GetCartRequest.Unmarshal(m, b)
@ -203,7 +203,7 @@ func (m *Cart) Reset() { *m = Cart{} }
func (m *Cart) String() string { return proto.CompactTextString(m) } func (m *Cart) String() string { return proto.CompactTextString(m) }
func (*Cart) ProtoMessage() {} func (*Cart) ProtoMessage() {}
func (*Cart) Descriptor() ([]byte, []int) { func (*Cart) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{4} return fileDescriptor_demo_bbfc9458084e7e4b, []int{4}
} }
func (m *Cart) XXX_Unmarshal(b []byte) error { func (m *Cart) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Cart.Unmarshal(m, b) return xxx_messageInfo_Cart.Unmarshal(m, b)
@ -247,7 +247,7 @@ func (m *Empty) Reset() { *m = Empty{} }
func (m *Empty) String() string { return proto.CompactTextString(m) } func (m *Empty) String() string { return proto.CompactTextString(m) }
func (*Empty) ProtoMessage() {} func (*Empty) ProtoMessage() {}
func (*Empty) Descriptor() ([]byte, []int) { func (*Empty) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{5} return fileDescriptor_demo_bbfc9458084e7e4b, []int{5}
} }
func (m *Empty) XXX_Unmarshal(b []byte) error { func (m *Empty) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Empty.Unmarshal(m, b) return xxx_messageInfo_Empty.Unmarshal(m, b)
@ -279,7 +279,7 @@ func (m *ListRecommendationsRequest) Reset() { *m = ListRecommendationsR
func (m *ListRecommendationsRequest) String() string { return proto.CompactTextString(m) } func (m *ListRecommendationsRequest) String() string { return proto.CompactTextString(m) }
func (*ListRecommendationsRequest) ProtoMessage() {} func (*ListRecommendationsRequest) ProtoMessage() {}
func (*ListRecommendationsRequest) Descriptor() ([]byte, []int) { func (*ListRecommendationsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{6} return fileDescriptor_demo_bbfc9458084e7e4b, []int{6}
} }
func (m *ListRecommendationsRequest) XXX_Unmarshal(b []byte) error { func (m *ListRecommendationsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListRecommendationsRequest.Unmarshal(m, b) return xxx_messageInfo_ListRecommendationsRequest.Unmarshal(m, b)
@ -324,7 +324,7 @@ func (m *ListRecommendationsResponse) Reset() { *m = ListRecommendations
func (m *ListRecommendationsResponse) String() string { return proto.CompactTextString(m) } func (m *ListRecommendationsResponse) String() string { return proto.CompactTextString(m) }
func (*ListRecommendationsResponse) ProtoMessage() {} func (*ListRecommendationsResponse) ProtoMessage() {}
func (*ListRecommendationsResponse) Descriptor() ([]byte, []int) { func (*ListRecommendationsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{7} return fileDescriptor_demo_bbfc9458084e7e4b, []int{7}
} }
func (m *ListRecommendationsResponse) XXX_Unmarshal(b []byte) error { func (m *ListRecommendationsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListRecommendationsResponse.Unmarshal(m, b) return xxx_messageInfo_ListRecommendationsResponse.Unmarshal(m, b)
@ -356,7 +356,7 @@ type Product struct {
Name string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` Name string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"`
Description string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"` Description string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"`
Picture string `protobuf:"bytes,4,opt,name=picture" json:"picture,omitempty"` Picture string `protobuf:"bytes,4,opt,name=picture" json:"picture,omitempty"`
PriceUsd *MoneyAmount `protobuf:"bytes,5,opt,name=price_usd,json=priceUsd" json:"price_usd,omitempty"` PriceUsd *Money `protobuf:"bytes,5,opt,name=price_usd,json=priceUsd" json:"price_usd,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -366,7 +366,7 @@ func (m *Product) Reset() { *m = Product{} }
func (m *Product) String() string { return proto.CompactTextString(m) } func (m *Product) String() string { return proto.CompactTextString(m) }
func (*Product) ProtoMessage() {} func (*Product) ProtoMessage() {}
func (*Product) Descriptor() ([]byte, []int) { func (*Product) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{8} return fileDescriptor_demo_bbfc9458084e7e4b, []int{8}
} }
func (m *Product) XXX_Unmarshal(b []byte) error { func (m *Product) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Product.Unmarshal(m, b) return xxx_messageInfo_Product.Unmarshal(m, b)
@ -414,7 +414,7 @@ func (m *Product) GetPicture() string {
return "" return ""
} }
func (m *Product) GetPriceUsd() *MoneyAmount { func (m *Product) GetPriceUsd() *Money {
if m != nil { if m != nil {
return m.PriceUsd return m.PriceUsd
} }
@ -432,7 +432,7 @@ func (m *ListProductsResponse) Reset() { *m = ListProductsResponse{} }
func (m *ListProductsResponse) String() string { return proto.CompactTextString(m) } func (m *ListProductsResponse) String() string { return proto.CompactTextString(m) }
func (*ListProductsResponse) ProtoMessage() {} func (*ListProductsResponse) ProtoMessage() {}
func (*ListProductsResponse) Descriptor() ([]byte, []int) { func (*ListProductsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{9} return fileDescriptor_demo_bbfc9458084e7e4b, []int{9}
} }
func (m *ListProductsResponse) XXX_Unmarshal(b []byte) error { func (m *ListProductsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListProductsResponse.Unmarshal(m, b) return xxx_messageInfo_ListProductsResponse.Unmarshal(m, b)
@ -470,7 +470,7 @@ func (m *GetProductRequest) Reset() { *m = GetProductRequest{} }
func (m *GetProductRequest) String() string { return proto.CompactTextString(m) } func (m *GetProductRequest) String() string { return proto.CompactTextString(m) }
func (*GetProductRequest) ProtoMessage() {} func (*GetProductRequest) ProtoMessage() {}
func (*GetProductRequest) Descriptor() ([]byte, []int) { func (*GetProductRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{10} return fileDescriptor_demo_bbfc9458084e7e4b, []int{10}
} }
func (m *GetProductRequest) XXX_Unmarshal(b []byte) error { func (m *GetProductRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetProductRequest.Unmarshal(m, b) return xxx_messageInfo_GetProductRequest.Unmarshal(m, b)
@ -508,7 +508,7 @@ func (m *SearchProductsRequest) Reset() { *m = SearchProductsRequest{} }
func (m *SearchProductsRequest) String() string { return proto.CompactTextString(m) } func (m *SearchProductsRequest) String() string { return proto.CompactTextString(m) }
func (*SearchProductsRequest) ProtoMessage() {} func (*SearchProductsRequest) ProtoMessage() {}
func (*SearchProductsRequest) Descriptor() ([]byte, []int) { func (*SearchProductsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{11} return fileDescriptor_demo_bbfc9458084e7e4b, []int{11}
} }
func (m *SearchProductsRequest) XXX_Unmarshal(b []byte) error { func (m *SearchProductsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SearchProductsRequest.Unmarshal(m, b) return xxx_messageInfo_SearchProductsRequest.Unmarshal(m, b)
@ -546,7 +546,7 @@ func (m *SearchProductsResponse) Reset() { *m = SearchProductsResponse{}
func (m *SearchProductsResponse) String() string { return proto.CompactTextString(m) } func (m *SearchProductsResponse) String() string { return proto.CompactTextString(m) }
func (*SearchProductsResponse) ProtoMessage() {} func (*SearchProductsResponse) ProtoMessage() {}
func (*SearchProductsResponse) Descriptor() ([]byte, []int) { func (*SearchProductsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{12} return fileDescriptor_demo_bbfc9458084e7e4b, []int{12}
} }
func (m *SearchProductsResponse) XXX_Unmarshal(b []byte) error { func (m *SearchProductsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SearchProductsResponse.Unmarshal(m, b) return xxx_messageInfo_SearchProductsResponse.Unmarshal(m, b)
@ -585,7 +585,7 @@ func (m *GetQuoteRequest) Reset() { *m = GetQuoteRequest{} }
func (m *GetQuoteRequest) String() string { return proto.CompactTextString(m) } func (m *GetQuoteRequest) String() string { return proto.CompactTextString(m) }
func (*GetQuoteRequest) ProtoMessage() {} func (*GetQuoteRequest) ProtoMessage() {}
func (*GetQuoteRequest) Descriptor() ([]byte, []int) { func (*GetQuoteRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{13} return fileDescriptor_demo_bbfc9458084e7e4b, []int{13}
} }
func (m *GetQuoteRequest) XXX_Unmarshal(b []byte) error { func (m *GetQuoteRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetQuoteRequest.Unmarshal(m, b) return xxx_messageInfo_GetQuoteRequest.Unmarshal(m, b)
@ -620,7 +620,7 @@ func (m *GetQuoteRequest) GetItems() []*CartItem {
} }
type GetQuoteResponse struct { type GetQuoteResponse struct {
CostUsd *MoneyAmount `protobuf:"bytes,1,opt,name=cost_usd,json=costUsd" json:"cost_usd,omitempty"` CostUsd *Money `protobuf:"bytes,1,opt,name=cost_usd,json=costUsd" json:"cost_usd,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -630,7 +630,7 @@ func (m *GetQuoteResponse) Reset() { *m = GetQuoteResponse{} }
func (m *GetQuoteResponse) String() string { return proto.CompactTextString(m) } func (m *GetQuoteResponse) String() string { return proto.CompactTextString(m) }
func (*GetQuoteResponse) ProtoMessage() {} func (*GetQuoteResponse) ProtoMessage() {}
func (*GetQuoteResponse) Descriptor() ([]byte, []int) { func (*GetQuoteResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{14} return fileDescriptor_demo_bbfc9458084e7e4b, []int{14}
} }
func (m *GetQuoteResponse) XXX_Unmarshal(b []byte) error { func (m *GetQuoteResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetQuoteResponse.Unmarshal(m, b) return xxx_messageInfo_GetQuoteResponse.Unmarshal(m, b)
@ -650,7 +650,7 @@ func (m *GetQuoteResponse) XXX_DiscardUnknown() {
var xxx_messageInfo_GetQuoteResponse proto.InternalMessageInfo var xxx_messageInfo_GetQuoteResponse proto.InternalMessageInfo
func (m *GetQuoteResponse) GetCostUsd() *MoneyAmount { func (m *GetQuoteResponse) GetCostUsd() *Money {
if m != nil { if m != nil {
return m.CostUsd return m.CostUsd
} }
@ -669,7 +669,7 @@ func (m *ShipOrderRequest) Reset() { *m = ShipOrderRequest{} }
func (m *ShipOrderRequest) String() string { return proto.CompactTextString(m) } func (m *ShipOrderRequest) String() string { return proto.CompactTextString(m) }
func (*ShipOrderRequest) ProtoMessage() {} func (*ShipOrderRequest) ProtoMessage() {}
func (*ShipOrderRequest) Descriptor() ([]byte, []int) { func (*ShipOrderRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{15} return fileDescriptor_demo_bbfc9458084e7e4b, []int{15}
} }
func (m *ShipOrderRequest) XXX_Unmarshal(b []byte) error { func (m *ShipOrderRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ShipOrderRequest.Unmarshal(m, b) return xxx_messageInfo_ShipOrderRequest.Unmarshal(m, b)
@ -714,7 +714,7 @@ func (m *ShipOrderResponse) Reset() { *m = ShipOrderResponse{} }
func (m *ShipOrderResponse) String() string { return proto.CompactTextString(m) } func (m *ShipOrderResponse) String() string { return proto.CompactTextString(m) }
func (*ShipOrderResponse) ProtoMessage() {} func (*ShipOrderResponse) ProtoMessage() {}
func (*ShipOrderResponse) Descriptor() ([]byte, []int) { func (*ShipOrderResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{16} return fileDescriptor_demo_bbfc9458084e7e4b, []int{16}
} }
func (m *ShipOrderResponse) XXX_Unmarshal(b []byte) error { func (m *ShipOrderResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ShipOrderResponse.Unmarshal(m, b) return xxx_messageInfo_ShipOrderResponse.Unmarshal(m, b)
@ -742,9 +742,9 @@ func (m *ShipOrderResponse) GetTrackingId() string {
} }
type Address struct { type Address struct {
StreetAddress_1 string `protobuf:"bytes,1,opt,name=street_address_1,json=streetAddress1" json:"street_address_1,omitempty"` StreetAddress string `protobuf:"bytes,1,opt,name=street_address,json=streetAddress" json:"street_address,omitempty"`
StreetAddress_2 string `protobuf:"bytes,2,opt,name=street_address_2,json=streetAddress2" json:"street_address_2,omitempty"` City string `protobuf:"bytes,2,opt,name=city" json:"city,omitempty"`
City string `protobuf:"bytes,3,opt,name=city" json:"city,omitempty"` State string `protobuf:"bytes,3,opt,name=state" json:"state,omitempty"`
Country string `protobuf:"bytes,4,opt,name=country" json:"country,omitempty"` Country string `protobuf:"bytes,4,opt,name=country" json:"country,omitempty"`
ZipCode int32 `protobuf:"varint,5,opt,name=zip_code,json=zipCode" json:"zip_code,omitempty"` ZipCode int32 `protobuf:"varint,5,opt,name=zip_code,json=zipCode" json:"zip_code,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
@ -756,7 +756,7 @@ func (m *Address) Reset() { *m = Address{} }
func (m *Address) String() string { return proto.CompactTextString(m) } func (m *Address) String() string { return proto.CompactTextString(m) }
func (*Address) ProtoMessage() {} func (*Address) ProtoMessage() {}
func (*Address) Descriptor() ([]byte, []int) { func (*Address) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{17} return fileDescriptor_demo_bbfc9458084e7e4b, []int{17}
} }
func (m *Address) XXX_Unmarshal(b []byte) error { func (m *Address) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Address.Unmarshal(m, b) return xxx_messageInfo_Address.Unmarshal(m, b)
@ -776,16 +776,9 @@ func (m *Address) XXX_DiscardUnknown() {
var xxx_messageInfo_Address proto.InternalMessageInfo var xxx_messageInfo_Address proto.InternalMessageInfo
func (m *Address) GetStreetAddress_1() string { func (m *Address) GetStreetAddress() string {
if m != nil { if m != nil {
return m.StreetAddress_1 return m.StreetAddress
}
return ""
}
func (m *Address) GetStreetAddress_2() string {
if m != nil {
return m.StreetAddress_2
} }
return "" return ""
} }
@ -797,6 +790,13 @@ func (m *Address) GetCity() string {
return "" return ""
} }
func (m *Address) GetState() string {
if m != nil {
return m.State
}
return ""
}
func (m *Address) GetCountry() string { func (m *Address) GetCountry() string {
if m != nil { if m != nil {
return m.Country return m.Country
@ -811,58 +811,20 @@ func (m *Address) GetZipCode() int32 {
return 0 return 0
} }
// Describes a money amount without currency. For example, decimal=2 and // Represents an amount of money with its currency type.
// fractional=500 (or fractional=5) makes up 2.5 units.
type MoneyAmount struct {
Decimal uint32 `protobuf:"varint,1,opt,name=decimal" json:"decimal,omitempty"`
Fractional uint32 `protobuf:"varint,2,opt,name=fractional" json:"fractional,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *MoneyAmount) Reset() { *m = MoneyAmount{} }
func (m *MoneyAmount) String() string { return proto.CompactTextString(m) }
func (*MoneyAmount) ProtoMessage() {}
func (*MoneyAmount) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{18}
}
func (m *MoneyAmount) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_MoneyAmount.Unmarshal(m, b)
}
func (m *MoneyAmount) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_MoneyAmount.Marshal(b, m, deterministic)
}
func (dst *MoneyAmount) XXX_Merge(src proto.Message) {
xxx_messageInfo_MoneyAmount.Merge(dst, src)
}
func (m *MoneyAmount) XXX_Size() int {
return xxx_messageInfo_MoneyAmount.Size(m)
}
func (m *MoneyAmount) XXX_DiscardUnknown() {
xxx_messageInfo_MoneyAmount.DiscardUnknown(m)
}
var xxx_messageInfo_MoneyAmount proto.InternalMessageInfo
func (m *MoneyAmount) GetDecimal() uint32 {
if m != nil {
return m.Decimal
}
return 0
}
func (m *MoneyAmount) GetFractional() uint32 {
if m != nil {
return m.Fractional
}
return 0
}
type Money struct { type Money struct {
// The 3-letter currency code defined in ISO 4217. // The 3-letter currency code defined in ISO 4217.
CurrencyCode string `protobuf:"bytes,1,opt,name=currency_code,json=currencyCode" json:"currency_code,omitempty"` CurrencyCode string `protobuf:"bytes,1,opt,name=currency_code,json=currencyCode" json:"currency_code,omitempty"`
Amount *MoneyAmount `protobuf:"bytes,2,opt,name=amount" json:"amount,omitempty"` // The whole units of the amount.
// For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar.
Units int64 `protobuf:"varint,2,opt,name=units" json:"units,omitempty"`
// Number of nano (10^-9) units of the amount.
// The value must be between -999,999,999 and +999,999,999 inclusive.
// If `units` is positive, `nanos` must be positive or zero.
// If `units` is zero, `nanos` can be positive, zero, or negative.
// If `units` is negative, `nanos` must be negative or zero.
// For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
Nanos int32 `protobuf:"varint,3,opt,name=nanos" json:"nanos,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -872,7 +834,7 @@ func (m *Money) Reset() { *m = Money{} }
func (m *Money) String() string { return proto.CompactTextString(m) } func (m *Money) String() string { return proto.CompactTextString(m) }
func (*Money) ProtoMessage() {} func (*Money) ProtoMessage() {}
func (*Money) Descriptor() ([]byte, []int) { func (*Money) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{19} return fileDescriptor_demo_bbfc9458084e7e4b, []int{18}
} }
func (m *Money) XXX_Unmarshal(b []byte) error { func (m *Money) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Money.Unmarshal(m, b) return xxx_messageInfo_Money.Unmarshal(m, b)
@ -899,11 +861,18 @@ func (m *Money) GetCurrencyCode() string {
return "" return ""
} }
func (m *Money) GetAmount() *MoneyAmount { func (m *Money) GetUnits() int64 {
if m != nil { if m != nil {
return m.Amount return m.Units
} }
return nil return 0
}
func (m *Money) GetNanos() int32 {
if m != nil {
return m.Nanos
}
return 0
} }
type GetSupportedCurrenciesResponse struct { type GetSupportedCurrenciesResponse struct {
@ -918,7 +887,7 @@ func (m *GetSupportedCurrenciesResponse) Reset() { *m = GetSupportedCurr
func (m *GetSupportedCurrenciesResponse) String() string { return proto.CompactTextString(m) } func (m *GetSupportedCurrenciesResponse) String() string { return proto.CompactTextString(m) }
func (*GetSupportedCurrenciesResponse) ProtoMessage() {} func (*GetSupportedCurrenciesResponse) ProtoMessage() {}
func (*GetSupportedCurrenciesResponse) Descriptor() ([]byte, []int) { func (*GetSupportedCurrenciesResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{20} return fileDescriptor_demo_bbfc9458084e7e4b, []int{19}
} }
func (m *GetSupportedCurrenciesResponse) XXX_Unmarshal(b []byte) error { func (m *GetSupportedCurrenciesResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetSupportedCurrenciesResponse.Unmarshal(m, b) return xxx_messageInfo_GetSupportedCurrenciesResponse.Unmarshal(m, b)
@ -958,7 +927,7 @@ func (m *CurrencyConversionRequest) Reset() { *m = CurrencyConversionReq
func (m *CurrencyConversionRequest) String() string { return proto.CompactTextString(m) } func (m *CurrencyConversionRequest) String() string { return proto.CompactTextString(m) }
func (*CurrencyConversionRequest) ProtoMessage() {} func (*CurrencyConversionRequest) ProtoMessage() {}
func (*CurrencyConversionRequest) Descriptor() ([]byte, []int) { func (*CurrencyConversionRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{21} return fileDescriptor_demo_bbfc9458084e7e4b, []int{20}
} }
func (m *CurrencyConversionRequest) XXX_Unmarshal(b []byte) error { func (m *CurrencyConversionRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CurrencyConversionRequest.Unmarshal(m, b) return xxx_messageInfo_CurrencyConversionRequest.Unmarshal(m, b)
@ -1006,7 +975,7 @@ func (m *CreditCardInfo) Reset() { *m = CreditCardInfo{} }
func (m *CreditCardInfo) String() string { return proto.CompactTextString(m) } func (m *CreditCardInfo) String() string { return proto.CompactTextString(m) }
func (*CreditCardInfo) ProtoMessage() {} func (*CreditCardInfo) ProtoMessage() {}
func (*CreditCardInfo) Descriptor() ([]byte, []int) { func (*CreditCardInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{22} return fileDescriptor_demo_bbfc9458084e7e4b, []int{21}
} }
func (m *CreditCardInfo) XXX_Unmarshal(b []byte) error { func (m *CreditCardInfo) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CreditCardInfo.Unmarshal(m, b) return xxx_messageInfo_CreditCardInfo.Unmarshal(m, b)
@ -1066,7 +1035,7 @@ func (m *ChargeRequest) Reset() { *m = ChargeRequest{} }
func (m *ChargeRequest) String() string { return proto.CompactTextString(m) } func (m *ChargeRequest) String() string { return proto.CompactTextString(m) }
func (*ChargeRequest) ProtoMessage() {} func (*ChargeRequest) ProtoMessage() {}
func (*ChargeRequest) Descriptor() ([]byte, []int) { func (*ChargeRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{23} return fileDescriptor_demo_bbfc9458084e7e4b, []int{22}
} }
func (m *ChargeRequest) XXX_Unmarshal(b []byte) error { func (m *ChargeRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChargeRequest.Unmarshal(m, b) return xxx_messageInfo_ChargeRequest.Unmarshal(m, b)
@ -1111,7 +1080,7 @@ func (m *ChargeResponse) Reset() { *m = ChargeResponse{} }
func (m *ChargeResponse) String() string { return proto.CompactTextString(m) } func (m *ChargeResponse) String() string { return proto.CompactTextString(m) }
func (*ChargeResponse) ProtoMessage() {} func (*ChargeResponse) ProtoMessage() {}
func (*ChargeResponse) Descriptor() ([]byte, []int) { func (*ChargeResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{24} return fileDescriptor_demo_bbfc9458084e7e4b, []int{23}
} }
func (m *ChargeResponse) XXX_Unmarshal(b []byte) error { func (m *ChargeResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChargeResponse.Unmarshal(m, b) return xxx_messageInfo_ChargeResponse.Unmarshal(m, b)
@ -1150,7 +1119,7 @@ func (m *OrderItem) Reset() { *m = OrderItem{} }
func (m *OrderItem) String() string { return proto.CompactTextString(m) } func (m *OrderItem) String() string { return proto.CompactTextString(m) }
func (*OrderItem) ProtoMessage() {} func (*OrderItem) ProtoMessage() {}
func (*OrderItem) Descriptor() ([]byte, []int) { func (*OrderItem) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{25} return fileDescriptor_demo_bbfc9458084e7e4b, []int{24}
} }
func (m *OrderItem) XXX_Unmarshal(b []byte) error { func (m *OrderItem) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_OrderItem.Unmarshal(m, b) return xxx_messageInfo_OrderItem.Unmarshal(m, b)
@ -1199,7 +1168,7 @@ func (m *OrderResult) Reset() { *m = OrderResult{} }
func (m *OrderResult) String() string { return proto.CompactTextString(m) } func (m *OrderResult) String() string { return proto.CompactTextString(m) }
func (*OrderResult) ProtoMessage() {} func (*OrderResult) ProtoMessage() {}
func (*OrderResult) Descriptor() ([]byte, []int) { func (*OrderResult) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{26} return fileDescriptor_demo_bbfc9458084e7e4b, []int{25}
} }
func (m *OrderResult) XXX_Unmarshal(b []byte) error { func (m *OrderResult) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_OrderResult.Unmarshal(m, b) return xxx_messageInfo_OrderResult.Unmarshal(m, b)
@ -1266,7 +1235,7 @@ func (m *SendOrderConfirmationRequest) Reset() { *m = SendOrderConfirmat
func (m *SendOrderConfirmationRequest) String() string { return proto.CompactTextString(m) } func (m *SendOrderConfirmationRequest) String() string { return proto.CompactTextString(m) }
func (*SendOrderConfirmationRequest) ProtoMessage() {} func (*SendOrderConfirmationRequest) ProtoMessage() {}
func (*SendOrderConfirmationRequest) Descriptor() ([]byte, []int) { func (*SendOrderConfirmationRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{27} return fileDescriptor_demo_bbfc9458084e7e4b, []int{26}
} }
func (m *SendOrderConfirmationRequest) XXX_Unmarshal(b []byte) error { func (m *SendOrderConfirmationRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SendOrderConfirmationRequest.Unmarshal(m, b) return xxx_messageInfo_SendOrderConfirmationRequest.Unmarshal(m, b)
@ -1313,7 +1282,7 @@ func (m *CreateOrderRequest) Reset() { *m = CreateOrderRequest{} }
func (m *CreateOrderRequest) String() string { return proto.CompactTextString(m) } func (m *CreateOrderRequest) String() string { return proto.CompactTextString(m) }
func (*CreateOrderRequest) ProtoMessage() {} func (*CreateOrderRequest) ProtoMessage() {}
func (*CreateOrderRequest) Descriptor() ([]byte, []int) { func (*CreateOrderRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{28} return fileDescriptor_demo_bbfc9458084e7e4b, []int{27}
} }
func (m *CreateOrderRequest) XXX_Unmarshal(b []byte) error { func (m *CreateOrderRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CreateOrderRequest.Unmarshal(m, b) return xxx_messageInfo_CreateOrderRequest.Unmarshal(m, b)
@ -1366,7 +1335,7 @@ func (m *CreateOrderResponse) Reset() { *m = CreateOrderResponse{} }
func (m *CreateOrderResponse) String() string { return proto.CompactTextString(m) } func (m *CreateOrderResponse) String() string { return proto.CompactTextString(m) }
func (*CreateOrderResponse) ProtoMessage() {} func (*CreateOrderResponse) ProtoMessage() {}
func (*CreateOrderResponse) Descriptor() ([]byte, []int) { func (*CreateOrderResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{29} return fileDescriptor_demo_bbfc9458084e7e4b, []int{28}
} }
func (m *CreateOrderResponse) XXX_Unmarshal(b []byte) error { func (m *CreateOrderResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CreateOrderResponse.Unmarshal(m, b) return xxx_messageInfo_CreateOrderResponse.Unmarshal(m, b)
@ -1415,7 +1384,7 @@ func (m *PlaceOrderRequest) Reset() { *m = PlaceOrderRequest{} }
func (m *PlaceOrderRequest) String() string { return proto.CompactTextString(m) } func (m *PlaceOrderRequest) String() string { return proto.CompactTextString(m) }
func (*PlaceOrderRequest) ProtoMessage() {} func (*PlaceOrderRequest) ProtoMessage() {}
func (*PlaceOrderRequest) Descriptor() ([]byte, []int) { func (*PlaceOrderRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{30} return fileDescriptor_demo_bbfc9458084e7e4b, []int{29}
} }
func (m *PlaceOrderRequest) XXX_Unmarshal(b []byte) error { func (m *PlaceOrderRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PlaceOrderRequest.Unmarshal(m, b) return xxx_messageInfo_PlaceOrderRequest.Unmarshal(m, b)
@ -1481,7 +1450,7 @@ func (m *PlaceOrderResponse) Reset() { *m = PlaceOrderResponse{} }
func (m *PlaceOrderResponse) String() string { return proto.CompactTextString(m) } func (m *PlaceOrderResponse) String() string { return proto.CompactTextString(m) }
func (*PlaceOrderResponse) ProtoMessage() {} func (*PlaceOrderResponse) ProtoMessage() {}
func (*PlaceOrderResponse) Descriptor() ([]byte, []int) { func (*PlaceOrderResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_demo_40506d781b7ed975, []int{31} return fileDescriptor_demo_bbfc9458084e7e4b, []int{30}
} }
func (m *PlaceOrderResponse) XXX_Unmarshal(b []byte) error { func (m *PlaceOrderResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PlaceOrderResponse.Unmarshal(m, b) return xxx_messageInfo_PlaceOrderResponse.Unmarshal(m, b)
@ -1527,7 +1496,6 @@ func init() {
proto.RegisterType((*ShipOrderRequest)(nil), "hipstershop.ShipOrderRequest") proto.RegisterType((*ShipOrderRequest)(nil), "hipstershop.ShipOrderRequest")
proto.RegisterType((*ShipOrderResponse)(nil), "hipstershop.ShipOrderResponse") proto.RegisterType((*ShipOrderResponse)(nil), "hipstershop.ShipOrderResponse")
proto.RegisterType((*Address)(nil), "hipstershop.Address") proto.RegisterType((*Address)(nil), "hipstershop.Address")
proto.RegisterType((*MoneyAmount)(nil), "hipstershop.MoneyAmount")
proto.RegisterType((*Money)(nil), "hipstershop.Money") proto.RegisterType((*Money)(nil), "hipstershop.Money")
proto.RegisterType((*GetSupportedCurrenciesResponse)(nil), "hipstershop.GetSupportedCurrenciesResponse") proto.RegisterType((*GetSupportedCurrenciesResponse)(nil), "hipstershop.GetSupportedCurrenciesResponse")
proto.RegisterType((*CurrencyConversionRequest)(nil), "hipstershop.CurrencyConversionRequest") proto.RegisterType((*CurrencyConversionRequest)(nil), "hipstershop.CurrencyConversionRequest")
@ -2294,100 +2262,98 @@ var _CheckoutService_serviceDesc = grpc.ServiceDesc{
Metadata: "demo.proto", Metadata: "demo.proto",
} }
func init() { proto.RegisterFile("demo.proto", fileDescriptor_demo_40506d781b7ed975) } func init() { proto.RegisterFile("demo.proto", fileDescriptor_demo_bbfc9458084e7e4b) }
var fileDescriptor_demo_40506d781b7ed975 = []byte{ var fileDescriptor_demo_bbfc9458084e7e4b = []byte{
// 1466 bytes of a gzipped FileDescriptorProto // 1435 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x58, 0xdd, 0x72, 0xd3, 0xc6, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x58, 0xdd, 0x72, 0xd3, 0x46,
0x17, 0x8f, 0x9c, 0x38, 0xb6, 0x8f, 0x63, 0x27, 0x59, 0x12, 0xfe, 0x46, 0x81, 0x90, 0xff, 0x66, 0x14, 0x8e, 0x1c, 0x3b, 0xb6, 0x8f, 0x63, 0x27, 0x59, 0x12, 0x6a, 0x14, 0x7e, 0xd2, 0xcd, 0x40,
0x4a, 0x43, 0xa1, 0x19, 0x30, 0xed, 0x70, 0x51, 0x5a, 0xca, 0x98, 0x8c, 0xf1, 0x0c, 0x14, 0xaa, 0xa1, 0x40, 0xca, 0xa4, 0x9d, 0xe1, 0xa2, 0xb4, 0x94, 0x31, 0x19, 0xe3, 0x19, 0x28, 0x54, 0x81,
0x40, 0xa7, 0x1d, 0x3a, 0x78, 0x84, 0xb4, 0xc1, 0x2a, 0xd6, 0x07, 0xab, 0x55, 0xa6, 0x66, 0x7a, 0x0e, 0x1d, 0x3a, 0xf5, 0x08, 0x69, 0xc1, 0x2a, 0x91, 0x56, 0xd9, 0x5d, 0x65, 0x6a, 0xa6, 0x57,
0x45, 0x5f, 0xa4, 0x57, 0xbd, 0xe8, 0x03, 0xb4, 0xef, 0xd0, 0xfb, 0xbe, 0x42, 0x9f, 0xa3, 0xb3, 0xf4, 0x01, 0x7a, 0xdf, 0x47, 0xe8, 0x03, 0xb4, 0xef, 0xd0, 0xfb, 0xbe, 0x42, 0x9f, 0xa3, 0xb3,
0xab, 0x5d, 0x7d, 0x59, 0x4a, 0xc2, 0x4d, 0x7b, 0xe7, 0xdd, 0xfd, 0xed, 0x39, 0xbf, 0x3d, 0xdf, 0x2b, 0xad, 0xfe, 0x6c, 0x25, 0xe1, 0xa6, 0xbd, 0xd3, 0xee, 0x7e, 0x7b, 0xce, 0xb7, 0xe7, 0xdf,
0x32, 0x80, 0x4d, 0x5c, 0x7f, 0x3f, 0xa0, 0x3e, 0xf3, 0x51, 0x7b, 0xe2, 0x04, 0x21, 0x23, 0x34, 0x06, 0x70, 0x89, 0x4f, 0x77, 0x42, 0x46, 0x05, 0x45, 0x9d, 0x89, 0x17, 0x72, 0x41, 0x18, 0x9f,
0x9c, 0xf8, 0x01, 0x3e, 0x80, 0xe6, 0xc0, 0xa4, 0x6c, 0xc4, 0x88, 0x8b, 0x2e, 0x01, 0x04, 0xd4, 0xd0, 0x10, 0xef, 0x41, 0x6b, 0x60, 0x33, 0x31, 0x12, 0xc4, 0x47, 0x17, 0x00, 0x42, 0x46, 0xdd,
0xb7, 0x23, 0x8b, 0x8d, 0x1d, 0xbb, 0xa7, 0xed, 0x68, 0x7b, 0x2d, 0xa3, 0x25, 0x77, 0x46, 0x36, 0xc8, 0x11, 0x63, 0xcf, 0xed, 0x1b, 0x5b, 0xc6, 0xd5, 0xb6, 0xd5, 0x4e, 0x76, 0x46, 0x2e, 0x32,
0xd2, 0xa1, 0xf9, 0x26, 0x32, 0x3d, 0xe6, 0xb0, 0x59, 0xaf, 0xb6, 0xa3, 0xed, 0xd5, 0x8d, 0x64, 0xa1, 0x75, 0x18, 0xd9, 0x81, 0xf0, 0xc4, 0xb4, 0x5f, 0xdb, 0x32, 0xae, 0x36, 0xac, 0x74, 0x8d,
0x8d, 0x9f, 0x42, 0xf7, 0x9e, 0x6d, 0x73, 0x29, 0x06, 0x79, 0x13, 0x91, 0x90, 0xa1, 0xff, 0x41, 0x9f, 0x42, 0xef, 0x9e, 0xeb, 0x4a, 0x29, 0x16, 0x39, 0x8c, 0x08, 0x17, 0xe8, 0x03, 0x68, 0x46,
0x23, 0x0a, 0x09, 0x4d, 0x25, 0x2d, 0xf3, 0xe5, 0xc8, 0x46, 0x57, 0x61, 0xc9, 0x61, 0xc4, 0x15, 0x9c, 0xb0, 0x4c, 0xd2, 0x92, 0x5c, 0x8e, 0x5c, 0x74, 0x0d, 0xea, 0x9e, 0x20, 0xbe, 0x12, 0xd1,
0x22, 0xda, 0xfd, 0xcd, 0xfd, 0x0c, 0x9b, 0x7d, 0x45, 0xc5, 0x10, 0x10, 0x7c, 0x0d, 0xd6, 0x0e, 0xd9, 0xdd, 0xd8, 0xc9, 0xb1, 0xd9, 0xd1, 0x54, 0x2c, 0x05, 0xc1, 0xd7, 0x61, 0x75, 0xcf, 0x0f,
0xdc, 0x80, 0xcd, 0xf8, 0xf6, 0x69, 0x72, 0xf1, 0x55, 0xe8, 0x0e, 0x09, 0x3b, 0x13, 0xf4, 0x21, 0xc5, 0x54, 0x6e, 0x9f, 0x24, 0x17, 0x5f, 0x83, 0xde, 0x90, 0x88, 0x53, 0x41, 0x1f, 0x42, 0x5d,
0x2c, 0x71, 0x5c, 0x35, 0xc7, 0x6b, 0x50, 0xe7, 0x04, 0xc2, 0x5e, 0x6d, 0x67, 0xb1, 0x9a, 0x64, 0xe2, 0xaa, 0x39, 0x5e, 0x87, 0x86, 0x24, 0xc0, 0xfb, 0xb5, 0xad, 0xc5, 0x6a, 0x92, 0x31, 0x06,
0x8c, 0xc1, 0x0d, 0xa8, 0x0b, 0x96, 0xf8, 0x1b, 0xd0, 0x1f, 0x3a, 0x21, 0x33, 0x88, 0xe5, 0xbb, 0x37, 0xa1, 0xa1, 0x58, 0xe2, 0x6f, 0xc1, 0x7c, 0xe8, 0x71, 0x61, 0x11, 0x87, 0xfa, 0x3e, 0x09,
0x2e, 0xf1, 0x6c, 0x93, 0x39, 0xbe, 0x17, 0x9e, 0x6a, 0x90, 0xcb, 0xd0, 0x4e, 0xcd, 0x1e, 0xab, 0x5c, 0x5b, 0x78, 0x34, 0xe0, 0x27, 0x1a, 0xe4, 0x12, 0x74, 0x32, 0xb3, 0xc7, 0x2a, 0xdb, 0x16,
0x6c, 0x19, 0x90, 0xd8, 0x3d, 0xc4, 0x5f, 0xc0, 0x56, 0xa9, 0xdc, 0x30, 0xf0, 0xbd, 0x90, 0x14, 0xa4, 0x76, 0xe7, 0xf8, 0x4b, 0xd8, 0x9c, 0x2b, 0x97, 0x87, 0x34, 0xe0, 0xa4, 0x7c, 0xdf, 0x98,
0xef, 0x6b, 0x73, 0xf7, 0x7f, 0xd1, 0xa0, 0xf1, 0x24, 0x5e, 0xa2, 0x2e, 0xd4, 0x12, 0x02, 0x35, 0xb9, 0xff, 0x9b, 0x01, 0xcd, 0x27, 0xf1, 0x12, 0xf5, 0xa0, 0x96, 0x12, 0xa8, 0x79, 0x2e, 0x42,
0xc7, 0x46, 0x08, 0x96, 0x3c, 0xd3, 0x25, 0xc2, 0x1b, 0x2d, 0x43, 0xfc, 0x46, 0x3b, 0xd0, 0xb6, 0x50, 0x0f, 0x6c, 0x9f, 0x28, 0x6f, 0xb4, 0x2d, 0xf5, 0x8d, 0xb6, 0xa0, 0xe3, 0x12, 0xee, 0x30,
0x49, 0x68, 0x51, 0x27, 0xe0, 0x8a, 0x7a, 0x8b, 0xe2, 0x28, 0xbb, 0x85, 0x7a, 0xd0, 0x08, 0x1c, 0x2f, 0x94, 0x8a, 0xfa, 0x8b, 0xea, 0x28, 0xbf, 0x85, 0xfa, 0xd0, 0x0c, 0x3d, 0x47, 0x44, 0x8c,
0x8b, 0x45, 0x94, 0xf4, 0x96, 0xc4, 0xa9, 0x5a, 0xa2, 0x4f, 0xa1, 0x15, 0x50, 0xc7, 0x22, 0xe3, 0xf4, 0xeb, 0xea, 0x54, 0x2f, 0xd1, 0x27, 0xd0, 0x0e, 0x99, 0xe7, 0x90, 0x71, 0xc4, 0xdd, 0x7e,
0x28, 0xb4, 0x7b, 0x75, 0xe1, 0xe2, 0x5e, 0xce, 0x7a, 0x8f, 0x7c, 0x8f, 0xcc, 0xee, 0xb9, 0x7e, 0x43, 0xb9, 0x18, 0x15, 0xac, 0xf7, 0x88, 0x06, 0x64, 0x6a, 0xb5, 0x14, 0xe8, 0x19, 0x77, 0xf1,
0xe4, 0x31, 0xa3, 0x29, 0xa0, 0xcf, 0x42, 0x1b, 0x3f, 0x80, 0x0d, 0xfe, 0x44, 0xc9, 0x32, 0x7d, 0x03, 0x58, 0x97, 0x8f, 0x4b, 0xf8, 0x65, 0xaf, 0xba, 0x05, 0xad, 0xe4, 0x09, 0xf1, 0x93, 0x3a,
0xdb, 0x0d, 0x68, 0xca, 0x87, 0xc4, 0x0f, 0x6b, 0xf7, 0x37, 0x72, 0xd2, 0xe4, 0x05, 0x23, 0x41, 0xbb, 0xeb, 0x05, 0x39, 0xc9, 0x05, 0x2b, 0x45, 0xe1, 0x6d, 0x58, 0x1b, 0x12, 0x2d, 0x48, 0x5b,
0xe1, 0x5d, 0x58, 0x1f, 0x12, 0x25, 0x48, 0xd9, 0xbe, 0xf0, 0x6a, 0xfc, 0x31, 0x6c, 0x1e, 0x12, 0xbd, 0xf4, 0x5e, 0x7c, 0x13, 0x36, 0xf6, 0x89, 0xcd, 0x9c, 0x49, 0xa6, 0x30, 0x06, 0xae, 0x43,
0x93, 0x5a, 0x93, 0x54, 0x61, 0x0c, 0xdc, 0x80, 0xfa, 0x9b, 0x88, 0xd0, 0x99, 0xc4, 0xc6, 0x0b, 0xe3, 0x30, 0x22, 0x6c, 0x9a, 0x60, 0xe3, 0x05, 0x7e, 0x00, 0x67, 0xcb, 0xf0, 0x84, 0xdf, 0x0e,
0xfc, 0x00, 0xce, 0x17, 0xe1, 0x92, 0xdf, 0x3e, 0x34, 0x28, 0x09, 0xa3, 0xe9, 0x29, 0xf4, 0x14, 0x34, 0x19, 0xe1, 0xd1, 0xc1, 0x09, 0xf4, 0x34, 0x08, 0x07, 0xb0, 0x32, 0x24, 0xe2, 0x9b, 0x88,
0x08, 0x7b, 0xb0, 0x3a, 0x24, 0xec, 0xeb, 0xc8, 0x67, 0x44, 0xa9, 0xdc, 0x87, 0x86, 0x69, 0xdb, 0x0a, 0xa2, 0x55, 0xee, 0x40, 0xd3, 0x76, 0x5d, 0x46, 0x38, 0x57, 0x4a, 0xcb, 0x22, 0xee, 0xc5,
0x94, 0x84, 0xa1, 0x50, 0x5a, 0x14, 0x71, 0x2f, 0x3e, 0x33, 0x14, 0xe8, 0xfd, 0x62, 0x73, 0x08, 0x67, 0x96, 0x06, 0xbd, 0x5f, 0x54, 0xde, 0x83, 0xd5, 0x4c, 0x5f, 0xc2, 0xf9, 0x26, 0xb4, 0x1c,
0x6b, 0xa9, 0x3e, 0xc9, 0xf9, 0x16, 0x34, 0x2d, 0x3f, 0x64, 0xc2, 0x43, 0xda, 0x29, 0x1e, 0x6a, 0xca, 0x85, 0xf2, 0x8d, 0x51, 0xe9, 0x9b, 0xa6, 0xc4, 0x48, 0xd7, 0x50, 0x58, 0xdd, 0x9f, 0x78,
0x70, 0x24, 0x77, 0x90, 0x0f, 0x6b, 0x87, 0x13, 0x27, 0x78, 0x4c, 0x6d, 0x42, 0xff, 0x15, 0xe6, 0xe1, 0x63, 0xe6, 0x12, 0xf6, 0x9f, 0x70, 0xfe, 0x0c, 0xd6, 0x72, 0x0a, 0xb3, 0xf0, 0x16, 0xcc,
0x9f, 0xc0, 0x7a, 0x46, 0x61, 0x1a, 0xea, 0x8c, 0x9a, 0xd6, 0x6b, 0xc7, 0x7b, 0x95, 0xe6, 0x11, 0x76, 0xde, 0x78, 0xc1, 0xeb, 0x2c, 0x77, 0x40, 0x6f, 0x8d, 0x5c, 0xfc, 0xab, 0x01, 0xcd, 0x44,
0xa8, 0xad, 0x91, 0x8d, 0x7f, 0xd5, 0xa0, 0x21, 0xf5, 0xa2, 0x3d, 0x58, 0x0b, 0x19, 0x25, 0x84, 0x2f, 0xba, 0x0c, 0x3d, 0x2e, 0x18, 0x21, 0x62, 0x9c, 0x67, 0xd9, 0xb6, 0xba, 0xf1, 0xae, 0x86,
0x8d, 0x25, 0x81, 0xf1, 0x4d, 0x79, 0xa3, 0x1b, 0xef, 0x4b, 0xe0, 0xcd, 0x12, 0x64, 0x5f, 0x26, 0x21, 0xa8, 0x3b, 0xba, 0x8c, 0xb5, 0x2d, 0xf5, 0x2d, 0x03, 0x80, 0x0b, 0x5b, 0x90, 0x24, 0xde,
0x44, 0x1e, 0xd9, 0xe7, 0xe9, 0x62, 0xf1, 0xfa, 0x17, 0xe7, 0x84, 0xf8, 0xcd, 0x93, 0xc1, 0xe2, 0xe3, 0x85, 0x8c, 0x74, 0x87, 0x46, 0x81, 0x60, 0x53, 0x1d, 0xe9, 0xc9, 0x12, 0x9d, 0x83, 0xd6,
0xc6, 0xa2, 0x33, 0x95, 0x0c, 0x72, 0x89, 0x2e, 0x40, 0xf3, 0xad, 0x13, 0x8c, 0x2d, 0xdf, 0x26, 0x5b, 0x2f, 0x1c, 0x3b, 0xd4, 0x25, 0x2a, 0xd0, 0x1b, 0x56, 0xf3, 0xad, 0x17, 0x0e, 0xa8, 0x4b,
0x22, 0x17, 0xea, 0x46, 0xe3, 0xad, 0x13, 0x0c, 0x7c, 0x9b, 0xe0, 0x21, 0xb4, 0x33, 0x76, 0xe6, 0xf0, 0x73, 0x68, 0x28, 0x53, 0xa2, 0x6d, 0xe8, 0x3a, 0x11, 0x63, 0x24, 0x70, 0xa6, 0x31, 0x30,
0x32, 0x6c, 0x62, 0x39, 0xae, 0x39, 0x15, 0x14, 0x3b, 0x86, 0x5a, 0xa2, 0x6d, 0x80, 0x23, 0x6a, 0x66, 0xb3, 0xac, 0x37, 0x25, 0x5a, 0x2a, 0x8e, 0x02, 0x4f, 0x70, 0xc5, 0x66, 0xd1, 0x8a, 0x17,
0x5a, 0x3c, 0xed, 0xcc, 0xa9, 0x60, 0xd5, 0x31, 0x32, 0x3b, 0xf8, 0x05, 0xd4, 0x85, 0x20, 0xb4, 0x72, 0x37, 0xb0, 0x03, 0xca, 0x15, 0x9d, 0x86, 0x15, 0x2f, 0xf0, 0x10, 0x2e, 0x0e, 0x89, 0xd8,
0x0b, 0x1d, 0x2b, 0xa2, 0x94, 0x78, 0xd6, 0x2c, 0xd6, 0x18, 0xbf, 0x75, 0x45, 0x6d, 0x72, 0xb5, 0x8f, 0xc2, 0x90, 0x32, 0x41, 0xdc, 0x41, 0x2c, 0xc7, 0x23, 0x59, 0x5c, 0x5e, 0x86, 0x5e, 0x41,
0xe8, 0x06, 0x2c, 0x9b, 0x42, 0xa3, 0x2c, 0xbf, 0xd5, 0x9e, 0x97, 0x38, 0x3c, 0x84, 0xed, 0x21, 0xa5, 0x2e, 0x08, 0xdd, 0xbc, 0x4e, 0x8e, 0xbf, 0x87, 0x73, 0x83, 0x74, 0x23, 0x38, 0x22, 0x8c,
0x61, 0x87, 0x51, 0x10, 0xf8, 0x94, 0x11, 0x7b, 0x10, 0x4b, 0x73, 0x48, 0x9a, 0x03, 0x1f, 0x40, 0x7b, 0x34, 0xd0, 0x4e, 0xbe, 0x02, 0xf5, 0x57, 0x8c, 0xfa, 0xc7, 0xc4, 0x88, 0x3a, 0x97, 0x25,
0x37, 0xa7, 0x58, 0x95, 0xa0, 0x4e, 0x56, 0x73, 0x88, 0xbf, 0x87, 0x0b, 0x83, 0x64, 0xc3, 0x3b, 0x4d, 0xd0, 0xf8, 0x61, 0xb1, 0x25, 0x97, 0x04, 0x55, 0x06, 0xf8, 0xc7, 0x80, 0xde, 0x80, 0x11,
0x26, 0x34, 0x74, 0x7c, 0x4f, 0x85, 0xd2, 0x15, 0x58, 0x3a, 0xa2, 0xbe, 0x2b, 0xe3, 0x08, 0xcd, 0xd7, 0x93, 0xf5, 0xd8, 0x1d, 0x05, 0xaf, 0x28, 0xba, 0x01, 0xc8, 0x51, 0x3b, 0x63, 0xc7, 0x66,
0xb3, 0x32, 0xc4, 0x39, 0x2f, 0xa2, 0xcc, 0x8f, 0x9f, 0x17, 0x3b, 0x68, 0x99, 0xf9, 0xc2, 0x9e, 0xee, 0x38, 0x88, 0xfc, 0x97, 0x84, 0x25, 0xf6, 0x58, 0x75, 0x52, 0xec, 0xd7, 0x6a, 0x1f, 0x5d,
0x7f, 0x6b, 0xd0, 0x1d, 0x50, 0x62, 0x3b, 0xbc, 0x03, 0xd8, 0x23, 0xef, 0xc8, 0x47, 0xd7, 0x01, 0x81, 0x95, 0x3c, 0xda, 0x39, 0x3a, 0x4a, 0x5a, 0x4e, 0x37, 0x83, 0x0e, 0x8e, 0x8e, 0xd0, 0x17,
0x59, 0x62, 0x67, 0x6c, 0x99, 0xd4, 0x1e, 0x7b, 0x91, 0xfb, 0x92, 0x50, 0x69, 0x95, 0x35, 0x2b, 0xb0, 0x99, 0xc7, 0x91, 0x9f, 0x42, 0x8f, 0xa9, 0xf2, 0x38, 0x9e, 0x12, 0x9b, 0x25, 0xb6, 0xeb,
0xc1, 0x7e, 0x25, 0xf6, 0xd1, 0x15, 0x58, 0xcd, 0xa2, 0xad, 0xe3, 0x63, 0xd9, 0xe4, 0x3a, 0x29, 0x67, 0x77, 0xf6, 0x52, 0xc0, 0x77, 0xc4, 0x66, 0xe8, 0x2e, 0x9c, 0xaf, 0xb8, 0xee, 0xd3, 0x40,
0x74, 0x70, 0x7c, 0x8c, 0x3e, 0x87, 0xad, 0x2c, 0x8e, 0xfc, 0x18, 0x38, 0x54, 0x14, 0xe4, 0xf1, 0x4c, 0x94, 0xcb, 0x1b, 0xd6, 0xb9, 0x79, 0xf7, 0x1f, 0x49, 0x00, 0x9e, 0x42, 0x77, 0x30, 0xb1,
0x8c, 0x98, 0x54, 0x04, 0x46, 0xdd, 0xe8, 0xa5, 0x77, 0x0e, 0x12, 0xc0, 0x77, 0xc4, 0xa4, 0xe8, 0xd9, 0xeb, 0x34, 0xa7, 0x3f, 0x86, 0x25, 0xdb, 0x97, 0x11, 0x72, 0x8c, 0xf1, 0x12, 0x04, 0xba,
0x2e, 0x5c, 0xac, 0xb8, 0xee, 0xfa, 0x1e, 0x9b, 0x88, 0x08, 0xaa, 0x1b, 0x17, 0xca, 0xee, 0x3f, 0x03, 0x9d, 0x9c, 0xf6, 0xa4, 0x21, 0x6e, 0x16, 0x33, 0xa4, 0x60, 0x44, 0x0b, 0x32, 0x26, 0xf8,
0xe2, 0x00, 0x3c, 0x83, 0xce, 0x60, 0x62, 0xd2, 0x57, 0x49, 0xfd, 0xf8, 0x28, 0x71, 0x69, 0xb5, 0x36, 0xf4, 0xb4, 0xea, 0xcc, 0xf5, 0x82, 0xd9, 0x01, 0xb7, 0x1d, 0xf5, 0x84, 0x34, 0x59, 0xba,
0xf1, 0x24, 0x02, 0xdd, 0x81, 0x76, 0x46, 0xbb, 0x8c, 0x81, 0xad, 0x7c, 0x1e, 0xe6, 0x8c, 0x68, 0xb9, 0xdd, 0x91, 0x8b, 0x7f, 0x80, 0xb6, 0xca, 0x30, 0xd5, 0xf3, 0x75, 0x37, 0x36, 0x4e, 0xec,
0x40, 0xca, 0x04, 0xdf, 0x86, 0xae, 0x52, 0x9d, 0xba, 0x9e, 0x51, 0xd3, 0x0b, 0xe3, 0x68, 0x4c, 0xc6, 0x32, 0x2a, 0x64, 0x65, 0x48, 0x78, 0xce, 0x8d, 0x0a, 0x79, 0x8e, 0xdf, 0xd5, 0xa0, 0xa3,
0x53, 0xb2, 0x93, 0xd9, 0x1d, 0xd9, 0xf8, 0x05, 0xb4, 0x44, 0x1e, 0x8b, 0x29, 0x43, 0xf5, 0x7f, 0x53, 0x38, 0x3a, 0x10, 0x32, 0x51, 0xa8, 0x5c, 0x66, 0x84, 0x9a, 0x6a, 0x3d, 0x72, 0xd1, 0x2d,
0xed, 0xd4, 0xfe, 0xcf, 0xa3, 0x82, 0xd7, 0x1f, 0xc9, 0xb3, 0x34, 0x2a, 0xf8, 0x39, 0x7e, 0x57, 0x58, 0xe7, 0x13, 0x2f, 0x0c, 0x65, 0x6e, 0xe7, 0x93, 0x3c, 0x8e, 0x26, 0xa4, 0xcf, 0x9e, 0xa6,
0x83, 0xb6, 0x2a, 0x14, 0xd1, 0x94, 0xf1, 0xbc, 0xf3, 0xf9, 0x32, 0x25, 0xd4, 0x10, 0xeb, 0x91, 0xc9, 0x8e, 0x6e, 0x43, 0x37, 0xbd, 0xa1, 0xd8, 0x2c, 0x56, 0xb2, 0x59, 0xd6, 0xc0, 0x01, 0xe5,
0x8d, 0x6e, 0xc0, 0x46, 0x38, 0x71, 0x82, 0x80, 0x57, 0x90, 0x6c, 0x29, 0x89, 0xa3, 0x09, 0xa9, 0x02, 0xdd, 0x85, 0xd5, 0xf4, 0xa2, 0xae, 0x0d, 0xf5, 0x63, 0x2a, 0xd8, 0x8a, 0x46, 0xeb, 0x9a,
0xb3, 0xa7, 0x49, 0x49, 0x41, 0xb7, 0xa1, 0x93, 0xdc, 0x10, 0x6c, 0x16, 0x2b, 0xd9, 0xac, 0x28, 0x71, 0x43, 0x57, 0xb2, 0x86, 0xaa, 0x64, 0x67, 0x0b, 0xb7, 0x52, 0x83, 0xea, 0x52, 0xe6, 0xc2,
0xe0, 0xc0, 0x0f, 0x19, 0xba, 0x0b, 0x6b, 0xc9, 0x45, 0x55, 0x27, 0x97, 0x4e, 0xa8, 0x93, 0xab, 0xf9, 0x7d, 0x12, 0xb8, 0x6a, 0x7f, 0x40, 0x83, 0x57, 0x1e, 0xf3, 0x55, 0xd8, 0xe4, 0xda, 0x0d,
0x0a, 0xad, 0x0a, 0xd8, 0x75, 0x55, 0x2f, 0xeb, 0xa2, 0x5e, 0x9e, 0xcf, 0xdd, 0x4a, 0x0c, 0xaa, 0xf1, 0x6d, 0xef, 0x40, 0xb7, 0x1b, 0xb5, 0x40, 0x3b, 0xd0, 0x50, 0xa6, 0x49, 0x6c, 0xdc, 0x9f,
0x0a, 0xa6, 0x0d, 0x17, 0x0f, 0x89, 0x67, 0x8b, 0xfd, 0x81, 0xef, 0x1d, 0x39, 0xd4, 0x15, 0x61, 0xd5, 0x11, 0xdb, 0xd4, 0x8a, 0x61, 0xf8, 0x9d, 0x01, 0x68, 0xc0, 0x88, 0x2d, 0x48, 0xa1, 0x48,
0x93, 0x69, 0x6d, 0xc4, 0x35, 0x9d, 0xa9, 0x6a, 0x6d, 0x62, 0x81, 0xf6, 0xa1, 0x2e, 0x4c, 0x53, 0x57, 0x8e, 0x1a, 0xdb, 0xd0, 0x55, 0x07, 0xba, 0x16, 0x24, 0x86, 0x5e, 0x96, 0x9b, 0xba, 0x1c,
0x5a, 0x0f, 0x32, 0x36, 0x35, 0x62, 0x18, 0x7e, 0xa7, 0x01, 0x1a, 0x50, 0x62, 0x32, 0x92, 0x6b, 0xe4, 0x4b, 0xfc, 0xe2, 0x29, 0x4a, 0x3c, 0xfe, 0x19, 0xce, 0x14, 0x38, 0x24, 0xd1, 0x98, 0xda,
0x05, 0x95, 0xc3, 0xcd, 0x2e, 0x74, 0xc4, 0x81, 0xaa, 0x05, 0xd2, 0xd0, 0x2b, 0x7c, 0x53, 0x95, 0xcb, 0x38, 0x85, 0xbd, 0x66, 0xfd, 0x5a, 0x3b, 0x9d, 0x5f, 0xf1, 0xdf, 0x06, 0xac, 0x3d, 0x39,
0x83, 0x6c, 0x23, 0x59, 0x3c, 0x43, 0x23, 0xc1, 0x3f, 0xc1, 0xb9, 0x1c, 0x07, 0x19, 0x8d, 0x89, 0xb0, 0x9d, 0xff, 0xd1, 0x02, 0x99, 0x33, 0x1b, 0x79, 0x67, 0x96, 0xd2, 0x7b, 0xe9, 0xfd, 0xd2,
0xbd, 0xb4, 0x33, 0xd8, 0x6b, 0xde, 0xaf, 0xb5, 0xb3, 0xf9, 0x15, 0xff, 0xa5, 0xc1, 0xfa, 0x93, 0xfb, 0x3e, 0xa0, 0xfc, 0xb3, 0xd2, 0xa9, 0x23, 0x09, 0x10, 0xe3, 0x54, 0x01, 0xb2, 0xfb, 0x97,
0xa9, 0x69, 0xfd, 0x87, 0x16, 0x48, 0x9d, 0x59, 0xcf, 0x3a, 0xb3, 0x90, 0xde, 0xcb, 0xef, 0x97, 0x01, 0x1d, 0x99, 0xc6, 0xfb, 0x84, 0x1d, 0x79, 0x0e, 0x41, 0x77, 0x54, 0xab, 0x54, 0x99, 0xbf,
0xde, 0xf7, 0x01, 0x65, 0x9f, 0x95, 0x4c, 0x38, 0x32, 0x40, 0xb4, 0x33, 0x05, 0x48, 0xff, 0x4f, 0x59, 0x7e, 0x53, 0x6e, 0x7a, 0x37, 0x8b, 0x76, 0x8f, 0xc7, 0xdb, 0x05, 0xf4, 0x39, 0x34, 0x93,
0x0d, 0xda, 0x3c, 0x8d, 0x0f, 0x09, 0x3d, 0x76, 0x2c, 0x82, 0xee, 0x88, 0x86, 0x2c, 0x32, 0x7f, 0x11, 0xbb, 0x74, 0xbb, 0x38, 0x78, 0x9b, 0x6b, 0x33, 0x65, 0x04, 0x2f, 0xa0, 0xaf, 0xa0, 0x9d,
0xab, 0xf8, 0xa6, 0xcc, 0xf7, 0x82, 0x9e, 0xb7, 0x7b, 0x3c, 0x50, 0x2f, 0xa0, 0xcf, 0xa0, 0x21, 0x0e, 0xf3, 0xe8, 0xc2, 0xac, 0xfc, 0xbc, 0x80, 0xb9, 0xea, 0x77, 0x7f, 0x31, 0x60, 0xa3, 0x38,
0x87, 0xfa, 0xc2, 0xed, 0xfc, 0xa8, 0xaf, 0xaf, 0xcf, 0x95, 0x11, 0xbc, 0x80, 0xbe, 0x84, 0x56, 0x04, 0xeb, 0x67, 0xfd, 0x08, 0x67, 0xe6, 0x4c, 0xc8, 0xe8, 0xa3, 0x82, 0x98, 0xea, 0xd9, 0xdc,
0xf2, 0xf9, 0x80, 0x2e, 0xcd, 0xcb, 0xcf, 0x0a, 0x28, 0x55, 0xdf, 0xff, 0x59, 0x83, 0xcd, 0xfc, 0xbc, 0x7a, 0x32, 0x30, 0x76, 0x80, 0x64, 0x51, 0x83, 0x8d, 0x64, 0xba, 0x1b, 0xd8, 0xc2, 0x3e,
0xd8, 0xad, 0x9e, 0xf5, 0x03, 0x9c, 0x2b, 0x99, 0xc9, 0xd1, 0x87, 0x39, 0x31, 0xd5, 0x5f, 0x03, 0xa0, 0xaf, 0x35, 0x8b, 0x21, 0x2c, 0xe7, 0x47, 0x59, 0x34, 0xe7, 0x15, 0xe6, 0x87, 0x33, 0x9a,
0xfa, 0xde, 0xe9, 0xc0, 0xd8, 0x01, 0x9c, 0x45, 0x0d, 0x36, 0xe5, 0x24, 0x39, 0x30, 0x99, 0x39, 0xca, 0x93, 0x25, 0x5e, 0x40, 0xf7, 0x01, 0xb2, 0x49, 0x16, 0x5d, 0x2c, 0x9b, 0xba, 0x38, 0xe2,
0xf5, 0x5f, 0x29, 0x16, 0x43, 0x58, 0xc9, 0x8e, 0xcd, 0xa8, 0xe4, 0x15, 0xfa, 0xff, 0xe7, 0x34, 0x9a, 0x73, 0x07, 0x4f, 0xbc, 0x80, 0x5e, 0x40, 0xaf, 0x38, 0xbb, 0x22, 0x5c, 0x40, 0xce, 0x9d,
0x15, 0xa7, 0x58, 0xbc, 0x80, 0xee, 0x03, 0xa4, 0x53, 0x33, 0xda, 0x2e, 0x9a, 0x3a, 0x3f, 0x4e, 0x83, 0xcd, 0xed, 0x63, 0x31, 0xa9, 0x15, 0x7e, 0x37, 0x60, 0x65, 0x3f, 0xc9, 0x43, 0xfd, 0xfe,
0xeb, 0xa5, 0x43, 0x2e, 0x5e, 0x40, 0xcf, 0xa1, 0x9b, 0x9f, 0x93, 0x11, 0xce, 0x21, 0x4b, 0x67, 0x11, 0xb4, 0xf4, 0xc8, 0x89, 0xce, 0x97, 0x49, 0xe7, 0x27, 0x5f, 0xf3, 0x42, 0xc5, 0x69, 0x6a,
0x6e, 0x7d, 0xf7, 0x44, 0x4c, 0x62, 0x85, 0xdf, 0x34, 0x58, 0x3d, 0x94, 0x79, 0xa8, 0xde, 0x3f, 0x81, 0x87, 0xd0, 0x4e, 0x27, 0xc1, 0x52, 0xb0, 0x94, 0x47, 0x52, 0xf3, 0x62, 0xd5, 0x71, 0x4a,
0x82, 0xa6, 0x1a, 0x6f, 0xd1, 0xc5, 0x22, 0xe9, 0xec, 0x94, 0xad, 0x5f, 0xaa, 0x38, 0x4d, 0x2c, 0xf6, 0x4f, 0x03, 0x56, 0x74, 0x72, 0x6b, 0xb2, 0x2f, 0xe0, 0xec, 0xfc, 0x49, 0x6a, 0xae, 0xdb,
0xf0, 0x10, 0x5a, 0xc9, 0xbc, 0x59, 0x08, 0x96, 0xe2, 0xe0, 0xab, 0x6f, 0x57, 0x1d, 0x27, 0x64, 0xae, 0x97, 0x09, 0x1f, 0x33, 0x82, 0xe1, 0x05, 0x34, 0x84, 0x66, 0x3c, 0x55, 0x09, 0x74, 0xa5,
0xff, 0xd0, 0x60, 0x55, 0x25, 0xb7, 0x22, 0xfb, 0x1c, 0xce, 0x97, 0x4f, 0x52, 0xa5, 0x6e, 0xbb, 0x98, 0x0b, 0x55, 0x33, 0x97, 0x39, 0xa7, 0xd2, 0xe1, 0x85, 0xdd, 0x67, 0xd0, 0x7b, 0x62, 0x4f,
0x56, 0x24, 0x7c, 0xc2, 0x08, 0x86, 0x17, 0xd0, 0x10, 0x1a, 0xf1, 0x54, 0xc5, 0xd0, 0x95, 0x7c, 0x7d, 0x12, 0xa4, 0x19, 0x3c, 0x80, 0xa5, 0xb8, 0xed, 0x23, 0xb3, 0x28, 0x39, 0x3f, 0x86, 0x98,
0x2e, 0x54, 0xcd, 0x5c, 0x7a, 0x49, 0xa5, 0xc3, 0x0b, 0xfd, 0x67, 0xd0, 0x7d, 0x62, 0xce, 0x5c, 0x9b, 0x73, 0xcf, 0x52, 0x83, 0x4c, 0x60, 0x79, 0x4f, 0xd6, 0x28, 0x2d, 0xf4, 0xb9, 0xfc, 0x55,
0xe2, 0x25, 0x19, 0x3c, 0x80, 0xe5, 0xb8, 0xed, 0x23, 0x3d, 0x2f, 0x39, 0x3b, 0x86, 0xe8, 0x5b, 0x34, 0xa7, 0x5b, 0xa1, 0x6b, 0xa5, 0x68, 0xa8, 0xee, 0x68, 0x15, 0x39, 0xfb, 0x87, 0x34, 0xfd,
0xa5, 0x67, 0x89, 0x41, 0x26, 0xb0, 0x72, 0xc0, 0x6b, 0x94, 0x12, 0xfa, 0x2d, 0xff, 0x02, 0x2b, 0x84, 0x38, 0x6f, 0x68, 0x94, 0x3e, 0xc1, 0x82, 0x4e, 0xae, 0x61, 0xa0, 0x4b, 0xe5, 0x92, 0x58,
0xe9, 0x56, 0xe8, 0x6a, 0x21, 0x1a, 0xaa, 0x3b, 0x5a, 0x45, 0xce, 0xfe, 0xce, 0x4d, 0x3f, 0x21, 0x6a, 0x67, 0xe6, 0x56, 0x35, 0x20, 0xb5, 0xf8, 0x63, 0x80, 0xac, 0x5c, 0x96, 0x52, 0x66, 0xa6,
0xd6, 0x6b, 0x3f, 0x4a, 0x9e, 0x60, 0x40, 0x3b, 0xd3, 0x30, 0xd0, 0xe5, 0x62, 0x49, 0x2c, 0xb4, 0x3d, 0x98, 0x97, 0x2a, 0xcf, 0xb5, 0xc0, 0x97, 0x4b, 0xea, 0xcf, 0x92, 0x4f, 0xff, 0x0d, 0x00,
0x33, 0x7d, 0xa7, 0x1a, 0x90, 0x58, 0xfc, 0x31, 0x40, 0x5a, 0x2e, 0x0b, 0x29, 0x33, 0xd7, 0x1e, 0x00, 0xff, 0xff, 0x1d, 0x9c, 0xae, 0xb8, 0x3a, 0x11, 0x00, 0x00,
0xf4, 0xcb, 0x95, 0xe7, 0x4a, 0xe0, 0xcb, 0x65, 0xf1, 0xf7, 0xcc, 0xad, 0x7f, 0x02, 0x00, 0x00,
0xff, 0xff, 0xdd, 0xe8, 0xfb, 0x77, 0xac, 0x11, 0x00, 0x00,
} }

View file

@ -111,8 +111,8 @@ func testShippingService() error {
defer conn.Close() defer conn.Close()
address := &pb.Address{ address := &pb.Address{
StreetAddress_1: "Muffin Man", StreetAddress: "Muffin Man",
StreetAddress_2: "Drury Lane", State: "",
City: "London", City: "London",
Country: "United Kingdom", Country: "United Kingdom",
} }
@ -183,10 +183,8 @@ func testPaymentService() error {
resp, err := cl.Charge(context.TODO(), &pb.ChargeRequest{ resp, err := cl.Charge(context.TODO(), &pb.ChargeRequest{
Amount: &pb.Money{ Amount: &pb.Money{
CurrencyCode: "USD", CurrencyCode: "USD",
Amount: &pb.MoneyAmount{ Units: 10,
Decimal: 10, Nanos: 550000000},
Fractional: 55},
},
CreditCard: &pb.CreditCardInfo{ CreditCard: &pb.CreditCardInfo{
CreditCardNumber: "4444-4530-1092-6639", CreditCardNumber: "4444-4530-1092-6639",
CreditCardCvv: 612, CreditCardCvv: 612,
@ -216,13 +214,11 @@ func testEmailService() error {
ShippingTrackingId: "000-123-456", ShippingTrackingId: "000-123-456",
ShippingCost: &pb.Money{ ShippingCost: &pb.Money{
CurrencyCode: "CAD", CurrencyCode: "CAD",
Amount: &pb.MoneyAmount{ Units: 10,
Decimal: 10, Nanos: 550000000},
Fractional: 55},
},
ShippingAddress: &pb.Address{ ShippingAddress: &pb.Address{
StreetAddress_1: "Muffin Man", StreetAddress: "Muffin Man",
StreetAddress_2: "Drury Lane", State: "XX",
City: "London", City: "London",
Country: "United Kingdom", Country: "United Kingdom",
}, },
@ -233,9 +229,8 @@ func testEmailService() error {
Quantity: 4}, Quantity: 4},
Cost: &pb.Money{ Cost: &pb.Money{
CurrencyCode: "CAD", CurrencyCode: "CAD",
Amount: &pb.MoneyAmount{ Units: 120,
Decimal: 120, Nanos: 0},
Fractional: 0}},
}, },
&pb.OrderItem{ &pb.OrderItem{
Item: &pb.CartItem{ Item: &pb.CartItem{
@ -243,9 +238,8 @@ func testEmailService() error {
Quantity: 1}, Quantity: 1},
Cost: &pb.Money{ Cost: &pb.Money{
CurrencyCode: "CAD", CurrencyCode: "CAD",
Amount: &pb.MoneyAmount{ Units: 12,
Decimal: 12, Nanos: 250000000},
Fractional: 25}},
}, },
}, },
}, },
@ -276,10 +270,8 @@ func testCurrencyService() error {
log.Println("--- rpc Convert()") log.Println("--- rpc Convert()")
in := &pb.Money{ in := &pb.Money{
CurrencyCode: "CAD", CurrencyCode: "CAD",
Amount: &pb.MoneyAmount{ Units: 12,
Decimal: 12, Nanos: 250000000}
Fractional: 25},
}
convertResp, err := cl.Convert(context.TODO(), &pb.CurrencyConversionRequest{ convertResp, err := cl.Convert(context.TODO(), &pb.CurrencyConversionRequest{
From: in, From: in,
ToCode: "USD"}) ToCode: "USD"})