diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 0000000..9622cbd --- /dev/null +++ b/.tool-versions @@ -0,0 +1 @@ +buf 1.50.1 diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..b302e0e --- /dev/null +++ b/Makefile @@ -0,0 +1,4 @@ +gen: + buf generate + +.PHONY: gen \ No newline at end of file diff --git a/buf.gen.yaml b/buf.gen.yaml new file mode 100644 index 0000000..1008561 --- /dev/null +++ b/buf.gen.yaml @@ -0,0 +1,26 @@ +version: v2 +managed: + enabled: true + disable: + - file_option: go_package_prefix + module: buf.build/cludden/protoc-gen-go-temporal + override: + - file_option: go_package_prefix + value: github.com/taltemus/stacked-diff-example/gen +inputs: + - directory: proto +plugins: + - local: protoc-gen-go + out: gen + opt: + - paths=source_relative + - local: protoc-gen-go_temporal + out: gen + strategy: all + opt: + - cli-categories=true + - cli-enabled=true + - docs-out=./proto/README.md + - enable-xns=true + - paths=source_relative + - workflow-update-enabled=true diff --git a/buf.lock b/buf.lock new file mode 100644 index 0000000..c127111 --- /dev/null +++ b/buf.lock @@ -0,0 +1,6 @@ +# Generated by buf. DO NOT EDIT. +version: v2 +deps: + - name: buf.build/cludden/protoc-gen-go-temporal + commit: 81eb66e24ea5484ab4eb3564700e0b56 + digest: b5:0e11fa3310835d17d6ebdee90647163a1549ba669f54506a79a8f4c13a923bf051040032452b427b5e77266aa8481ea9df5bca268bc0b04f6c4861af4e5833d0 diff --git a/buf.yaml b/buf.yaml new file mode 100644 index 0000000..7103be5 --- /dev/null +++ b/buf.yaml @@ -0,0 +1,11 @@ +version: v2 +modules: + - path: proto +deps: + - buf.build/cludden/protoc-gen-go-temporal:81eb66e24ea5484ab4eb3564700e0b56 +lint: + use: + - DEFAULT +breaking: + use: + - FILE diff --git a/gen/cart/v1/cart_actor.pb.go b/gen/cart/v1/cart_actor.pb.go new file mode 100644 index 0000000..7e11323 --- /dev/null +++ b/gen/cart/v1/cart_actor.pb.go @@ -0,0 +1,612 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.5 +// protoc (unknown) +// source: cart/v1/cart_actor.proto + +package cartv1 + +import ( + _ "github.com/cludden/protoc-gen-go-temporal/gen/temporal/v1" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + emptypb "google.golang.org/protobuf/types/known/emptypb" + reflect "reflect" + sync "sync" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Message definitions. +type CartRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + CartId string `protobuf:"bytes,1,opt,name=cart_id,json=cartId,proto3" json:"cart_id,omitempty"` + CustomerId string `protobuf:"bytes,2,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"` + // Comma-separated ticket IDs. + TicketIds string `protobuf:"bytes,3,opt,name=ticket_ids,json=ticketIds,proto3" json:"ticket_ids,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CartRequest) Reset() { + *x = CartRequest{} + mi := &file_cart_v1_cart_actor_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CartRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CartRequest) ProtoMessage() {} + +func (x *CartRequest) ProtoReflect() protoreflect.Message { + mi := &file_cart_v1_cart_actor_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CartRequest.ProtoReflect.Descriptor instead. +func (*CartRequest) Descriptor() ([]byte, []int) { + return file_cart_v1_cart_actor_proto_rawDescGZIP(), []int{0} +} + +func (x *CartRequest) GetCartId() string { + if x != nil { + return x.CartId + } + return "" +} + +func (x *CartRequest) GetCustomerId() string { + if x != nil { + return x.CustomerId + } + return "" +} + +func (x *CartRequest) GetTicketIds() string { + if x != nil { + return x.TicketIds + } + return "" +} + +type CartResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Confirmation string `protobuf:"bytes,1,opt,name=confirmation,proto3" json:"confirmation,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CartResponse) Reset() { + *x = CartResponse{} + mi := &file_cart_v1_cart_actor_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CartResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CartResponse) ProtoMessage() {} + +func (x *CartResponse) ProtoReflect() protoreflect.Message { + mi := &file_cart_v1_cart_actor_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CartResponse.ProtoReflect.Descriptor instead. +func (*CartResponse) Descriptor() ([]byte, []int) { + return file_cart_v1_cart_actor_proto_rawDescGZIP(), []int{1} +} + +func (x *CartResponse) GetConfirmation() string { + if x != nil { + return x.Confirmation + } + return "" +} + +// ReserveTickets messages. +type ReserveTicketsInput struct { + state protoimpl.MessageState `protogen:"open.v1"` + CartId string `protobuf:"bytes,1,opt,name=cart_id,json=cartId,proto3" json:"cart_id,omitempty"` + TicketIds []string `protobuf:"bytes,2,rep,name=ticket_ids,json=ticketIds,proto3" json:"ticket_ids,omitempty"` + ReservationDurationSeconds int32 `protobuf:"varint,3,opt,name=reservation_duration_seconds,json=reservationDurationSeconds,proto3" json:"reservation_duration_seconds,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ReserveTicketsInput) Reset() { + *x = ReserveTicketsInput{} + mi := &file_cart_v1_cart_actor_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ReserveTicketsInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReserveTicketsInput) ProtoMessage() {} + +func (x *ReserveTicketsInput) ProtoReflect() protoreflect.Message { + mi := &file_cart_v1_cart_actor_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ReserveTicketsInput.ProtoReflect.Descriptor instead. +func (*ReserveTicketsInput) Descriptor() ([]byte, []int) { + return file_cart_v1_cart_actor_proto_rawDescGZIP(), []int{2} +} + +func (x *ReserveTicketsInput) GetCartId() string { + if x != nil { + return x.CartId + } + return "" +} + +func (x *ReserveTicketsInput) GetTicketIds() []string { + if x != nil { + return x.TicketIds + } + return nil +} + +func (x *ReserveTicketsInput) GetReservationDurationSeconds() int32 { + if x != nil { + return x.ReservationDurationSeconds + } + return 0 +} + +type ReserveTicketsOutput struct { + state protoimpl.MessageState `protogen:"open.v1"` + Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ReserveTicketsOutput) Reset() { + *x = ReserveTicketsOutput{} + mi := &file_cart_v1_cart_actor_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ReserveTicketsOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReserveTicketsOutput) ProtoMessage() {} + +func (x *ReserveTicketsOutput) ProtoReflect() protoreflect.Message { + mi := &file_cart_v1_cart_actor_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ReserveTicketsOutput.ProtoReflect.Descriptor instead. +func (*ReserveTicketsOutput) Descriptor() ([]byte, []int) { + return file_cart_v1_cart_actor_proto_rawDescGZIP(), []int{3} +} + +func (x *ReserveTicketsOutput) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +// RemoveTickets messages. +type RemoveTicketsInput struct { + state protoimpl.MessageState `protogen:"open.v1"` + CartId string `protobuf:"bytes,1,opt,name=cart_id,json=cartId,proto3" json:"cart_id,omitempty"` + TicketIds []string `protobuf:"bytes,2,rep,name=ticket_ids,json=ticketIds,proto3" json:"ticket_ids,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RemoveTicketsInput) Reset() { + *x = RemoveTicketsInput{} + mi := &file_cart_v1_cart_actor_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RemoveTicketsInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoveTicketsInput) ProtoMessage() {} + +func (x *RemoveTicketsInput) ProtoReflect() protoreflect.Message { + mi := &file_cart_v1_cart_actor_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RemoveTicketsInput.ProtoReflect.Descriptor instead. +func (*RemoveTicketsInput) Descriptor() ([]byte, []int) { + return file_cart_v1_cart_actor_proto_rawDescGZIP(), []int{4} +} + +func (x *RemoveTicketsInput) GetCartId() string { + if x != nil { + return x.CartId + } + return "" +} + +func (x *RemoveTicketsInput) GetTicketIds() []string { + if x != nil { + return x.TicketIds + } + return nil +} + +type RemoveTicketsOutput struct { + state protoimpl.MessageState `protogen:"open.v1"` + Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RemoveTicketsOutput) Reset() { + *x = RemoveTicketsOutput{} + mi := &file_cart_v1_cart_actor_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RemoveTicketsOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoveTicketsOutput) ProtoMessage() {} + +func (x *RemoveTicketsOutput) ProtoReflect() protoreflect.Message { + mi := &file_cart_v1_cart_actor_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RemoveTicketsOutput.ProtoReflect.Descriptor instead. +func (*RemoveTicketsOutput) Descriptor() ([]byte, []int) { + return file_cart_v1_cart_actor_proto_rawDescGZIP(), []int{5} +} + +func (x *RemoveTicketsOutput) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +// Signal to cancel the cart. +type CancelCartSignalRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + CartId string `protobuf:"bytes,1,opt,name=cart_id,json=cartId,proto3" json:"cart_id,omitempty"` + Reason string `protobuf:"bytes,2,opt,name=reason,proto3" json:"reason,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CancelCartSignalRequest) Reset() { + *x = CancelCartSignalRequest{} + mi := &file_cart_v1_cart_actor_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CancelCartSignalRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CancelCartSignalRequest) ProtoMessage() {} + +func (x *CancelCartSignalRequest) ProtoReflect() protoreflect.Message { + mi := &file_cart_v1_cart_actor_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CancelCartSignalRequest.ProtoReflect.Descriptor instead. +func (*CancelCartSignalRequest) Descriptor() ([]byte, []int) { + return file_cart_v1_cart_actor_proto_rawDescGZIP(), []int{6} +} + +func (x *CancelCartSignalRequest) GetCartId() string { + if x != nil { + return x.CartId + } + return "" +} + +func (x *CancelCartSignalRequest) GetReason() string { + if x != nil { + return x.Reason + } + return "" +} + +type CheckoutCartInput struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CheckoutCartInput) Reset() { + *x = CheckoutCartInput{} + mi := &file_cart_v1_cart_actor_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CheckoutCartInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CheckoutCartInput) ProtoMessage() {} + +func (x *CheckoutCartInput) ProtoReflect() protoreflect.Message { + mi := &file_cart_v1_cart_actor_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CheckoutCartInput.ProtoReflect.Descriptor instead. +func (*CheckoutCartInput) Descriptor() ([]byte, []int) { + return file_cart_v1_cart_actor_proto_rawDescGZIP(), []int{7} +} + +type CheckoutCartOutput struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CheckoutCartOutput) Reset() { + *x = CheckoutCartOutput{} + mi := &file_cart_v1_cart_actor_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CheckoutCartOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CheckoutCartOutput) ProtoMessage() {} + +func (x *CheckoutCartOutput) ProtoReflect() protoreflect.Message { + mi := &file_cart_v1_cart_actor_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CheckoutCartOutput.ProtoReflect.Descriptor instead. +func (*CheckoutCartOutput) Descriptor() ([]byte, []int) { + return file_cart_v1_cart_actor_proto_rawDescGZIP(), []int{8} +} + +var File_cart_v1_cart_actor_proto protoreflect.FileDescriptor + +var file_cart_v1_cart_actor_proto_rawDesc = string([]byte{ + 0x0a, 0x18, 0x63, 0x61, 0x72, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x61, 0x72, 0x74, 0x5f, 0x61, + 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x07, 0x63, 0x61, 0x72, 0x74, + 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x1a, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x65, + 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x66, 0x0a, 0x0b, + 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x63, + 0x61, 0x72, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x61, + 0x72, 0x74, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x5f, + 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, 0x63, 0x6b, 0x65, + 0x74, 0x49, 0x64, 0x73, 0x22, 0x32, 0x0a, 0x0c, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x8f, 0x01, 0x0a, 0x13, 0x52, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x12, 0x17, 0x0a, 0x07, 0x63, 0x61, 0x72, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x63, 0x61, 0x72, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x69, 0x63, + 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x74, + 0x69, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x73, 0x12, 0x40, 0x0a, 0x1c, 0x72, 0x65, 0x73, 0x65, + 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1a, + 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x2e, 0x0a, 0x14, 0x52, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x4c, 0x0a, 0x12, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x12, 0x17, 0x0a, 0x07, 0x63, 0x61, 0x72, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x63, 0x61, 0x72, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x69, 0x63, + 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x74, + 0x69, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x73, 0x22, 0x2d, 0x0a, 0x13, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x4a, 0x0a, 0x17, 0x43, 0x61, 0x6e, 0x63, 0x65, + 0x6c, 0x43, 0x61, 0x72, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x63, 0x61, 0x72, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x61, 0x72, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x22, 0x13, 0x0a, 0x11, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x43, + 0x61, 0x72, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x14, 0x0a, 0x12, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x6f, 0x75, 0x74, 0x43, 0x61, 0x72, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x32, 0xdb, + 0x03, 0x0a, 0x09, 0x43, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x54, 0x0a, 0x09, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x61, 0x72, 0x74, 0x12, 0x14, 0x2e, 0x63, 0x61, 0x72, 0x74, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x15, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x72, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x8a, 0xc4, 0x03, 0x16, 0x2a, 0x14, 0x63, 0x61, + 0x72, 0x74, 0x2f, 0x24, 0x7b, 0x21, 0x20, 0x75, 0x75, 0x69, 0x64, 0x5f, 0x76, 0x34, 0x28, 0x29, + 0x20, 0x7d, 0x12, 0x63, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x54, 0x69, 0x63, + 0x6b, 0x65, 0x74, 0x73, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x2e, 0x63, + 0x61, 0x72, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x54, 0x69, + 0x63, 0x6b, 0x65, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x1d, 0x2e, 0x63, 0x61, 0x72, + 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x54, 0x69, 0x63, 0x6b, + 0x65, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x0c, 0x92, 0xc4, 0x03, 0x08, 0x22, + 0x02, 0x08, 0x1e, 0x32, 0x02, 0x20, 0x03, 0x12, 0x60, 0x0a, 0x15, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, + 0x12, 0x1b, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x1c, 0x2e, + 0x63, 0x61, 0x72, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, + 0x63, 0x6b, 0x65, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x0c, 0x92, 0xc4, 0x03, + 0x08, 0x22, 0x02, 0x08, 0x1e, 0x32, 0x02, 0x20, 0x03, 0x12, 0x5d, 0x0a, 0x14, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x43, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, + 0x79, 0x12, 0x1a, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x6f, 0x75, 0x74, 0x43, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x1b, 0x2e, + 0x63, 0x61, 0x72, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, + 0x43, 0x61, 0x72, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x0c, 0x92, 0xc4, 0x03, 0x08, + 0x22, 0x02, 0x08, 0x1e, 0x32, 0x02, 0x20, 0x03, 0x12, 0x52, 0x0a, 0x10, 0x43, 0x61, 0x6e, 0x63, + 0x65, 0x6c, 0x43, 0x61, 0x72, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x12, 0x20, 0x2e, 0x63, + 0x61, 0x72, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x43, 0x61, 0x72, + 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x04, 0xa2, 0xc4, 0x03, 0x00, 0x42, 0x97, 0x01, 0x0a, + 0x0b, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x61, 0x72, 0x74, 0x2e, 0x76, 0x31, 0x42, 0x0e, 0x43, 0x61, + 0x72, 0x74, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3b, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x61, 0x6c, 0x74, 0x65, + 0x6d, 0x75, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x2d, 0x64, 0x69, 0x66, 0x66, + 0x2d, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x63, 0x61, 0x72, + 0x74, 0x2f, 0x76, 0x31, 0x3b, 0x63, 0x61, 0x72, 0x74, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x58, + 0x58, 0xaa, 0x02, 0x07, 0x43, 0x61, 0x72, 0x74, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x07, 0x43, 0x61, + 0x72, 0x74, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x13, 0x43, 0x61, 0x72, 0x74, 0x5c, 0x56, 0x31, 0x5c, + 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x08, 0x43, 0x61, + 0x72, 0x74, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +}) + +var ( + file_cart_v1_cart_actor_proto_rawDescOnce sync.Once + file_cart_v1_cart_actor_proto_rawDescData []byte +) + +func file_cart_v1_cart_actor_proto_rawDescGZIP() []byte { + file_cart_v1_cart_actor_proto_rawDescOnce.Do(func() { + file_cart_v1_cart_actor_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_cart_v1_cart_actor_proto_rawDesc), len(file_cart_v1_cart_actor_proto_rawDesc))) + }) + return file_cart_v1_cart_actor_proto_rawDescData +} + +var file_cart_v1_cart_actor_proto_msgTypes = make([]protoimpl.MessageInfo, 9) +var file_cart_v1_cart_actor_proto_goTypes = []any{ + (*CartRequest)(nil), // 0: cart.v1.CartRequest + (*CartResponse)(nil), // 1: cart.v1.CartResponse + (*ReserveTicketsInput)(nil), // 2: cart.v1.ReserveTicketsInput + (*ReserveTicketsOutput)(nil), // 3: cart.v1.ReserveTicketsOutput + (*RemoveTicketsInput)(nil), // 4: cart.v1.RemoveTicketsInput + (*RemoveTicketsOutput)(nil), // 5: cart.v1.RemoveTicketsOutput + (*CancelCartSignalRequest)(nil), // 6: cart.v1.CancelCartSignalRequest + (*CheckoutCartInput)(nil), // 7: cart.v1.CheckoutCartInput + (*CheckoutCartOutput)(nil), // 8: cart.v1.CheckoutCartOutput + (*emptypb.Empty)(nil), // 9: google.protobuf.Empty +} +var file_cart_v1_cart_actor_proto_depIdxs = []int32{ + 0, // 0: cart.v1.CartActor.StartCart:input_type -> cart.v1.CartRequest + 2, // 1: cart.v1.CartActor.ReserveTicketsActivity:input_type -> cart.v1.ReserveTicketsInput + 4, // 2: cart.v1.CartActor.RemoveTicketsActivity:input_type -> cart.v1.RemoveTicketsInput + 7, // 3: cart.v1.CartActor.CheckoutCartActivity:input_type -> cart.v1.CheckoutCartInput + 6, // 4: cart.v1.CartActor.CancelCartSignal:input_type -> cart.v1.CancelCartSignalRequest + 1, // 5: cart.v1.CartActor.StartCart:output_type -> cart.v1.CartResponse + 3, // 6: cart.v1.CartActor.ReserveTicketsActivity:output_type -> cart.v1.ReserveTicketsOutput + 5, // 7: cart.v1.CartActor.RemoveTicketsActivity:output_type -> cart.v1.RemoveTicketsOutput + 8, // 8: cart.v1.CartActor.CheckoutCartActivity:output_type -> cart.v1.CheckoutCartOutput + 9, // 9: cart.v1.CartActor.CancelCartSignal:output_type -> google.protobuf.Empty + 5, // [5:10] is the sub-list for method output_type + 0, // [0:5] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_cart_v1_cart_actor_proto_init() } +func file_cart_v1_cart_actor_proto_init() { + if File_cart_v1_cart_actor_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: unsafe.Slice(unsafe.StringData(file_cart_v1_cart_actor_proto_rawDesc), len(file_cart_v1_cart_actor_proto_rawDesc)), + NumEnums: 0, + NumMessages: 9, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_cart_v1_cart_actor_proto_goTypes, + DependencyIndexes: file_cart_v1_cart_actor_proto_depIdxs, + MessageInfos: file_cart_v1_cart_actor_proto_msgTypes, + }.Build() + File_cart_v1_cart_actor_proto = out.File + file_cart_v1_cart_actor_proto_goTypes = nil + file_cart_v1_cart_actor_proto_depIdxs = nil +} diff --git a/gen/cart/v1/cart_actor_temporal.pb.go b/gen/cart/v1/cart_actor_temporal.pb.go new file mode 100644 index 0000000..4853c97 --- /dev/null +++ b/gen/cart/v1/cart_actor_temporal.pb.go @@ -0,0 +1,1901 @@ +// Code generated by protoc-gen-go_temporal. DO NOT EDIT. +// versions: +// +// protoc-gen-go_temporal dev (latest) +// go go1.24.1 +// protoc (unknown) +// +// source: cart/v1/cart_actor.proto +package cartv1 + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "fmt" + expression "github.com/cludden/protoc-gen-go-temporal/pkg/expression" + helpers "github.com/cludden/protoc-gen-go-temporal/pkg/helpers" + gohomedir "github.com/mitchellh/go-homedir" + v2 "github.com/urfave/cli/v2" + enumsv1 "go.temporal.io/api/enums/v1" + activity "go.temporal.io/sdk/activity" + client "go.temporal.io/sdk/client" + temporal "go.temporal.io/sdk/temporal" + testsuite "go.temporal.io/sdk/testsuite" + worker "go.temporal.io/sdk/worker" + workflow "go.temporal.io/sdk/workflow" + protojson "google.golang.org/protobuf/encoding/protojson" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + "log/slog" + "os" + "sort" + "time" +) + +// cart.v1.CartActor workflow names +const ( + StartCartWorkflowName = "cart.v1.CartActor.StartCart" +) + +// cart.v1.CartActor workflow id expressions +var ( + StartCartIdexpression = expression.MustParseExpression("cart/${! uuid_v4() }") +) + +// cart.v1.CartActor activity names +const ( + CheckoutCartActivityActivityName = "cart.v1.CartActor.CheckoutCartActivity" + RemoveTicketsActivityActivityName = "cart.v1.CartActor.RemoveTicketsActivity" + ReserveTicketsActivityActivityName = "cart.v1.CartActor.ReserveTicketsActivity" +) + +// cart.v1.CartActor signal names +const ( + CancelCartSignalSignalName = "cart.v1.CartActor.CancelCartSignal" +) + +// CartActorClient describes a client for a(n) cart.v1.CartActor worker +type CartActorClient interface { + // Starts the shopping cart workflow. + StartCart(ctx context.Context, req *CartRequest, opts ...*StartCartOptions) (*CartResponse, error) + + // StartCartAsync starts a(n) cart.v1.CartActor.StartCart workflow and returns a handle to the workflow run + StartCartAsync(ctx context.Context, req *CartRequest, opts ...*StartCartOptions) (StartCartRun, error) + + // GetStartCart retrieves a handle to an existing cart.v1.CartActor.StartCart workflow execution + GetStartCart(ctx context.Context, workflowID string, runID string) StartCartRun + + // CancelWorkflow requests cancellation of an existing workflow execution + CancelWorkflow(ctx context.Context, workflowID string, runID string) error + + // TerminateWorkflow an existing workflow execution + TerminateWorkflow(ctx context.Context, workflowID string, runID string, reason string, details ...interface{}) error + + // CancelCartSignal allows external callers to cancel the cart reservation. + CancelCartSignal(ctx context.Context, workflowID string, runID string, signal *CancelCartSignalRequest) error +} + +// cartActorClient implements a temporal client for a cart.v1.CartActor service +type cartActorClient struct { + client client.Client + log *slog.Logger +} + +// NewCartActorClient initializes a new cart.v1.CartActor client +func NewCartActorClient(c client.Client, options ...*cartActorClientOptions) CartActorClient { + var cfg *cartActorClientOptions + if len(options) > 0 { + cfg = options[0] + } else { + cfg = NewCartActorClientOptions() + } + return &cartActorClient{ + client: c, + log: cfg.getLogger(), + } +} + +// NewCartActorClientWithOptions initializes a new CartActor client with the given options +func NewCartActorClientWithOptions(c client.Client, opts client.Options, options ...*cartActorClientOptions) (CartActorClient, error) { + var err error + c, err = client.NewClientFromExisting(c, opts) + if err != nil { + return nil, fmt.Errorf("error initializing client with options: %w", err) + } + var cfg *cartActorClientOptions + if len(options) > 0 { + cfg = options[0] + } else { + cfg = NewCartActorClientOptions() + } + return &cartActorClient{ + client: c, + log: cfg.getLogger(), + }, nil +} + +// cartActorClientOptions describes optional runtime configuration for a CartActorClient +type cartActorClientOptions struct { + log *slog.Logger +} + +// NewCartActorClientOptions initializes a new cartActorClientOptions value +func NewCartActorClientOptions() *cartActorClientOptions { + return &cartActorClientOptions{} +} + +// WithLogger can be used to override the default logger +func (opts *cartActorClientOptions) WithLogger(l *slog.Logger) *cartActorClientOptions { + if l != nil { + opts.log = l + } + return opts +} + +// getLogger returns the configured logger, or the default logger +func (opts *cartActorClientOptions) getLogger() *slog.Logger { + if opts != nil && opts.log != nil { + return opts.log + } + return slog.Default() +} + +// Starts the shopping cart workflow. +func (c *cartActorClient) StartCart(ctx context.Context, req *CartRequest, options ...*StartCartOptions) (*CartResponse, error) { + run, err := c.StartCartAsync(ctx, req, options...) + if err != nil { + return nil, err + } + return run.Get(ctx) +} + +// Starts the shopping cart workflow. +func (c *cartActorClient) StartCartAsync(ctx context.Context, req *CartRequest, options ...*StartCartOptions) (StartCartRun, error) { + var o *StartCartOptions + if len(options) > 0 && options[0] != nil { + o = options[0] + } else { + o = NewStartCartOptions() + } + opts, err := o.Build(req.ProtoReflect()) + if err != nil { + return nil, fmt.Errorf("error initializing client.StartWorkflowOptions: %w", err) + } + run, err := c.client.ExecuteWorkflow(ctx, opts, StartCartWorkflowName, req) + if err != nil { + return nil, err + } + if run == nil { + return nil, errors.New("execute workflow returned nil run") + } + return &startCartRun{ + client: c, + run: run, + }, nil +} + +// GetStartCart fetches an existing cart.v1.CartActor.StartCart execution +func (c *cartActorClient) GetStartCart(ctx context.Context, workflowID string, runID string) StartCartRun { + return &startCartRun{ + client: c, + run: c.client.GetWorkflow(ctx, workflowID, runID), + } +} + +// CancelWorkflow requests cancellation of an existing workflow execution +func (c *cartActorClient) CancelWorkflow(ctx context.Context, workflowID string, runID string) error { + return c.client.CancelWorkflow(ctx, workflowID, runID) +} + +// TerminateWorkflow terminates an existing workflow execution +func (c *cartActorClient) TerminateWorkflow(ctx context.Context, workflowID string, runID string, reason string, details ...interface{}) error { + return c.client.TerminateWorkflow(ctx, workflowID, runID, reason, details...) +} + +// CancelCartSignal allows external callers to cancel the cart reservation. +func (c *cartActorClient) CancelCartSignal(ctx context.Context, workflowID string, runID string, signal *CancelCartSignalRequest) error { + return c.client.SignalWorkflow(ctx, workflowID, runID, CancelCartSignalSignalName, signal) +} + +// StartCartOptions provides configuration for a cart.v1.CartActor.StartCart workflow operation +type StartCartOptions struct { + options client.StartWorkflowOptions + executionTimeout *time.Duration + id *string + idReusePolicy enumsv1.WorkflowIdReusePolicy + retryPolicy *temporal.RetryPolicy + runTimeout *time.Duration + searchAttributes map[string]any + taskQueue *string + taskTimeout *time.Duration +} + +// NewStartCartOptions initializes a new StartCartOptions value +func NewStartCartOptions() *StartCartOptions { + return &StartCartOptions{} +} + +// Build initializes a new go.temporal.io/sdk/client.StartWorkflowOptions value with defaults and overrides applied +func (o *StartCartOptions) Build(req protoreflect.Message) (client.StartWorkflowOptions, error) { + opts := o.options + if v := o.id; v != nil { + opts.ID = *v + } else if opts.ID == "" { + id, err := expression.EvalExpression(StartCartIdexpression, req) + if err != nil { + return opts, fmt.Errorf("error evaluating id expression for %q workflow: %w", StartCartWorkflowName, err) + } + opts.ID = id + } + if v := o.idReusePolicy; v != enumsv1.WORKFLOW_ID_REUSE_POLICY_UNSPECIFIED { + opts.WorkflowIDReusePolicy = v + } + if v := o.taskQueue; v != nil { + opts.TaskQueue = *v + } else if opts.TaskQueue == "" { + return opts, errors.New("TaskQueue is required") + } + if v := o.retryPolicy; v != nil { + opts.RetryPolicy = v + } + if v := o.searchAttributes; v != nil { + opts.SearchAttributes = o.searchAttributes + } + if v := o.executionTimeout; v != nil { + opts.WorkflowExecutionTimeout = *v + } + if v := o.runTimeout; v != nil { + opts.WorkflowRunTimeout = *v + } + if v := o.taskTimeout; v != nil { + opts.WorkflowTaskTimeout = *v + } + return opts, nil +} + +// WithStartWorkflowOptions sets the initial go.temporal.io/sdk/client.StartWorkflowOptions +func (o *StartCartOptions) WithStartWorkflowOptions(options client.StartWorkflowOptions) *StartCartOptions { + o.options = options + return o +} + +// WithExecutionTimeout sets the WorkflowExecutionTimeout value +func (o *StartCartOptions) WithExecutionTimeout(d time.Duration) *StartCartOptions { + o.executionTimeout = &d + return o +} + +// WithID sets the ID value +func (o *StartCartOptions) WithID(id string) *StartCartOptions { + o.id = &id + return o +} + +// WithIDReusePolicy sets the WorkflowIDReusePolicy value +func (o *StartCartOptions) WithIDReusePolicy(policy enumsv1.WorkflowIdReusePolicy) *StartCartOptions { + o.idReusePolicy = policy + return o +} + +// WithRetryPolicy sets the RetryPolicy value +func (o *StartCartOptions) WithRetryPolicy(policy *temporal.RetryPolicy) *StartCartOptions { + o.retryPolicy = policy + return o +} + +// WithRunTimeout sets the WorkflowRunTimeout value +func (o *StartCartOptions) WithRunTimeout(d time.Duration) *StartCartOptions { + o.runTimeout = &d + return o +} + +// WithSearchAttributes sets the SearchAttributes value +func (o *StartCartOptions) WithSearchAttributes(sa map[string]any) *StartCartOptions { + o.searchAttributes = sa + return o +} + +// WithTaskTimeout sets the WorkflowTaskTimeout value +func (o *StartCartOptions) WithTaskTimeout(d time.Duration) *StartCartOptions { + o.taskTimeout = &d + return o +} + +// WithTaskQueue sets the TaskQueue value +func (o *StartCartOptions) WithTaskQueue(tq string) *StartCartOptions { + o.taskQueue = &tq + return o +} + +// StartCartRun describes a(n) cart.v1.CartActor.StartCart workflow run +type StartCartRun interface { + // ID returns the workflow ID + ID() string + + // RunID returns the workflow instance ID + RunID() string + + // Run returns the inner client.WorkflowRun + Run() client.WorkflowRun + + // Get blocks until the workflow is complete and returns the result + Get(ctx context.Context) (*CartResponse, error) + + // Cancel requests cancellation of a workflow in execution, returning an error if applicable + Cancel(ctx context.Context) error + + // Terminate terminates a workflow in execution, returning an error if applicable + Terminate(ctx context.Context, reason string, details ...interface{}) error +} + +// startCartRun provides an internal implementation of a(n) StartCartRunRun +type startCartRun struct { + client *cartActorClient + run client.WorkflowRun +} + +// ID returns the workflow ID +func (r *startCartRun) ID() string { + return r.run.GetID() +} + +// Run returns the inner client.WorkflowRun +func (r *startCartRun) Run() client.WorkflowRun { + return r.run +} + +// RunID returns the execution ID +func (r *startCartRun) RunID() string { + return r.run.GetRunID() +} + +// Cancel requests cancellation of a workflow in execution, returning an error if applicable +func (r *startCartRun) Cancel(ctx context.Context) error { + return r.client.CancelWorkflow(ctx, r.ID(), r.RunID()) +} + +// Get blocks until the workflow is complete, returning the result if applicable +func (r *startCartRun) Get(ctx context.Context) (*CartResponse, error) { + var resp CartResponse + if err := r.run.Get(ctx, &resp); err != nil { + return nil, err + } + return &resp, nil +} + +// Terminate terminates a workflow in execution, returning an error if applicable +func (r *startCartRun) Terminate(ctx context.Context, reason string, details ...interface{}) error { + return r.client.TerminateWorkflow(ctx, r.ID(), r.RunID(), reason, details...) +} + +// Reference to generated workflow functions +var ( + // Starts the shopping cart workflow. + StartCartFunction func(workflow.Context, *CartRequest) (*CartResponse, error) +) + +// CartActorWorkflowFunctions describes a mockable dependency for inlining workflows within other workflows +type ( + // CartActorWorkflowFunctions describes a mockable dependency for inlining workflows within other workflows + CartActorWorkflowFunctions interface { + // Starts the shopping cart workflow. + StartCart(workflow.Context, *CartRequest) (*CartResponse, error) + } + // cartActorWorkflowFunctions provides an internal CartActorWorkflowFunctions implementation + cartActorWorkflowFunctions struct{} +) + +func NewCartActorWorkflowFunctions() CartActorWorkflowFunctions { + return &cartActorWorkflowFunctions{} +} + +// Starts the shopping cart workflow. +func (f *cartActorWorkflowFunctions) StartCart(ctx workflow.Context, req *CartRequest) (*CartResponse, error) { + if StartCartFunction == nil { + return nil, errors.New("StartCart requires workflow registration via RegisterCartActorWorkflows or RegisterStartCartWorkflow") + } + return StartCartFunction(ctx, req) +} + +// CartActorWorkflows provides methods for initializing new cart.v1.CartActor workflow values +type CartActorWorkflows interface { + // Starts the shopping cart workflow. + StartCart(ctx workflow.Context, input *StartCartWorkflowInput) (StartCartWorkflow, error) +} + +// RegisterCartActorWorkflows registers cart.v1.CartActor workflows with the given worker +func RegisterCartActorWorkflows(r worker.WorkflowRegistry, workflows CartActorWorkflows) { + RegisterStartCartWorkflow(r, workflows.StartCart) +} + +// RegisterStartCartWorkflow registers a cart.v1.CartActor.StartCart workflow with the given worker +func RegisterStartCartWorkflow(r worker.WorkflowRegistry, wf func(workflow.Context, *StartCartWorkflowInput) (StartCartWorkflow, error)) { + StartCartFunction = buildStartCart(wf) + r.RegisterWorkflowWithOptions(StartCartFunction, workflow.RegisterOptions{Name: StartCartWorkflowName}) +} + +// buildStartCart converts a StartCart workflow struct into a valid workflow function +func buildStartCart(ctor func(workflow.Context, *StartCartWorkflowInput) (StartCartWorkflow, error)) func(workflow.Context, *CartRequest) (*CartResponse, error) { + return func(ctx workflow.Context, req *CartRequest) (*CartResponse, error) { + input := &StartCartWorkflowInput{ + Req: req, + } + wf, err := ctor(ctx, input) + if err != nil { + return nil, err + } + if initializable, ok := wf.(helpers.Initializable); ok { + if err := initializable.Initialize(ctx); err != nil { + return nil, err + } + } + return wf.Execute(ctx) + } +} + +// StartCartWorkflowInput describes the input to a(n) cart.v1.CartActor.StartCart workflow constructor +type StartCartWorkflowInput struct { + Req *CartRequest +} + +// Starts the shopping cart workflow. +// +// workflow details: (name: "cart.v1.CartActor.StartCart", id: "cart/${! uuid_v4() }") +type StartCartWorkflow interface { + // Execute defines the entrypoint to a(n) cart.v1.CartActor.StartCart workflow + Execute(ctx workflow.Context) (*CartResponse, error) +} + +// Starts the shopping cart workflow. +func StartCartChild(ctx workflow.Context, req *CartRequest, options ...*StartCartChildOptions) (*CartResponse, error) { + childRun, err := StartCartChildAsync(ctx, req, options...) + if err != nil { + return nil, err + } + return childRun.Get(ctx) +} + +// Starts the shopping cart workflow. +func StartCartChildAsync(ctx workflow.Context, req *CartRequest, options ...*StartCartChildOptions) (*StartCartChildRun, error) { + var o *StartCartChildOptions + if len(options) > 0 && options[0] != nil { + o = options[0] + } else { + o = NewStartCartChildOptions() + } + opts, err := o.Build(ctx, req.ProtoReflect()) + if err != nil { + return nil, fmt.Errorf("error initializing workflow.ChildWorkflowOptions: %w", err) + } + ctx = workflow.WithChildOptions(ctx, opts) + return &StartCartChildRun{Future: workflow.ExecuteChildWorkflow(ctx, StartCartWorkflowName, req)}, nil +} + +// StartCartChildOptions provides configuration for a child cart.v1.CartActor.StartCart workflow operation +type StartCartChildOptions struct { + options workflow.ChildWorkflowOptions + executionTimeout *time.Duration + id *string + idReusePolicy enumsv1.WorkflowIdReusePolicy + retryPolicy *temporal.RetryPolicy + runTimeout *time.Duration + searchAttributes map[string]any + taskQueue *string + taskTimeout *time.Duration + parentClosePolicy enumsv1.ParentClosePolicy + waitForCancellation *bool +} + +// NewStartCartChildOptions initializes a new StartCartChildOptions value +func NewStartCartChildOptions() *StartCartChildOptions { + return &StartCartChildOptions{} +} + +// Build initializes a new go.temporal.io/sdk/workflow.ChildWorkflowOptions value with defaults and overrides applied +func (o *StartCartChildOptions) Build(ctx workflow.Context, req protoreflect.Message) (workflow.ChildWorkflowOptions, error) { + opts := o.options + if v := o.id; v != nil { + opts.WorkflowID = *v + } else if opts.WorkflowID == "" { + // wrap expression evaluation in local activity + // more info: https://cludden.github.io/protoc-gen-go-temporal/docs/guides/patches#pv_64-expression-evaluation-local-activity + if workflow.GetVersion(ctx, "cludden_protoc-gen-go-temporal_64_expression-evaluation-local-activity", workflow.DefaultVersion, 1) == 1 { + lao := workflow.GetLocalActivityOptions(ctx) + lao.ScheduleToCloseTimeout = time.Second * 10 + if err := workflow.ExecuteLocalActivity(workflow.WithLocalActivityOptions(ctx, lao), func(ctx context.Context) (string, error) { + id, err := expression.EvalExpression(StartCartIdexpression, req) + if err != nil { + return "", fmt.Errorf("error evaluating id expression for %q workflow: %w", StartCartWorkflowName, err) + } + return id, nil + }).Get(ctx, &opts.WorkflowID); err != nil { + return opts, fmt.Errorf("error evaluating id expression for %q workflow: %w", StartCartWorkflowName, err) + } + } else { + id, err := expression.EvalExpression(StartCartIdexpression, req) + if err != nil { + return opts, fmt.Errorf("error evaluating id expression for %q workflow: %w", StartCartWorkflowName, err) + } + opts.WorkflowID = id + } + } + if v := o.idReusePolicy; v != enumsv1.WORKFLOW_ID_REUSE_POLICY_UNSPECIFIED { + opts.WorkflowIDReusePolicy = v + } + if v := o.taskQueue; v != nil { + opts.TaskQueue = *v + } else if opts.TaskQueue == "" { + opts.TaskQueue = workflow.GetInfo(ctx).TaskQueueName + } + if v := o.retryPolicy; v != nil { + opts.RetryPolicy = v + } + if v := o.searchAttributes; v != nil { + opts.SearchAttributes = o.searchAttributes + } + if v := o.executionTimeout; v != nil { + opts.WorkflowExecutionTimeout = *v + } + if v := o.runTimeout; v != nil { + opts.WorkflowRunTimeout = *v + } + if v := o.taskTimeout; v != nil { + opts.WorkflowTaskTimeout = *v + } + if v := o.parentClosePolicy; v != enumsv1.PARENT_CLOSE_POLICY_UNSPECIFIED { + opts.ParentClosePolicy = v + } + if v := o.waitForCancellation; v != nil { + opts.WaitForCancellation = *v + } + return opts, nil +} + +// WithChildWorkflowOptions sets the initial go.temporal.io/sdk/workflow.ChildWorkflowOptions +func (o *StartCartChildOptions) WithChildWorkflowOptions(options workflow.ChildWorkflowOptions) *StartCartChildOptions { + o.options = options + return o +} + +// WithExecutionTimeout sets the WorkflowExecutionTimeout value +func (o *StartCartChildOptions) WithExecutionTimeout(d time.Duration) *StartCartChildOptions { + o.executionTimeout = &d + return o +} + +// WithID sets the WorkflowID value +func (o *StartCartChildOptions) WithID(id string) *StartCartChildOptions { + o.id = &id + return o +} + +// WithIDReusePolicy sets the WorkflowIDReusePolicy value +func (o *StartCartChildOptions) WithIDReusePolicy(policy enumsv1.WorkflowIdReusePolicy) *StartCartChildOptions { + o.idReusePolicy = policy + return o +} + +// WithParentClosePolicy sets the WorkflowIDReusePolicy value +func (o *StartCartChildOptions) WithParentClosePolicy(policy enumsv1.ParentClosePolicy) *StartCartChildOptions { + o.parentClosePolicy = policy + return o +} + +// WithRetryPolicy sets the RetryPolicy value +func (o *StartCartChildOptions) WithRetryPolicy(policy *temporal.RetryPolicy) *StartCartChildOptions { + o.retryPolicy = policy + return o +} + +// WithRunTimeout sets the WorkflowRunTimeout value +func (o *StartCartChildOptions) WithRunTimeout(d time.Duration) *StartCartChildOptions { + o.runTimeout = &d + return o +} + +// WithSearchAttributes sets the SearchAttributes value +func (o *StartCartChildOptions) WithSearchAttributes(sa map[string]any) *StartCartChildOptions { + o.searchAttributes = sa + return o +} + +// WithTaskTimeout sets the WorkflowTaskTimeout value +func (o *StartCartChildOptions) WithTaskTimeout(d time.Duration) *StartCartChildOptions { + o.taskTimeout = &d + return o +} + +// WithTaskQueue sets the TaskQueue value +func (o *StartCartChildOptions) WithTaskQueue(tq string) *StartCartChildOptions { + o.taskQueue = &tq + return o +} + +// WithWaitForCancellation sets the WaitForCancellation value +func (o *StartCartChildOptions) WithWaitForCancellation(wait bool) *StartCartChildOptions { + o.waitForCancellation = &wait + return o +} + +// StartCartChildRun describes a child StartCart workflow run +type StartCartChildRun struct { + Future workflow.ChildWorkflowFuture +} + +// Get blocks until the workflow is completed, returning the response value +func (r *StartCartChildRun) Get(ctx workflow.Context) (*CartResponse, error) { + var resp CartResponse + if err := r.Future.Get(ctx, &resp); err != nil { + return nil, err + } + return &resp, nil +} + +// Select adds this completion to the selector. Callback can be nil. +func (r *StartCartChildRun) Select(sel workflow.Selector, fn func(*StartCartChildRun)) workflow.Selector { + return sel.AddFuture(r.Future, func(workflow.Future) { + if fn != nil { + fn(r) + } + }) +} + +// SelectStart adds waiting for start to the selector. Callback can be nil. +func (r *StartCartChildRun) SelectStart(sel workflow.Selector, fn func(*StartCartChildRun)) workflow.Selector { + return sel.AddFuture(r.Future.GetChildWorkflowExecution(), func(workflow.Future) { + if fn != nil { + fn(r) + } + }) +} + +// WaitStart waits for the child workflow to start +func (r *StartCartChildRun) WaitStart(ctx workflow.Context) (*workflow.Execution, error) { + var exec workflow.Execution + if err := r.Future.GetChildWorkflowExecution().Get(ctx, &exec); err != nil { + return nil, err + } + return &exec, nil +} + +// CancelCartSignalSignal describes a(n) cart.v1.CartActor.CancelCartSignal signal +type CancelCartSignalSignal struct { + Channel workflow.ReceiveChannel +} + +// NewCancelCartSignalSignal initializes a new cart.v1.CartActor.CancelCartSignal signal wrapper +func NewCancelCartSignalSignal(ctx workflow.Context) *CancelCartSignalSignal { + return &CancelCartSignalSignal{Channel: workflow.GetSignalChannel(ctx, CancelCartSignalSignalName)} +} + +// Receive blocks until a(n) cart.v1.CartActor.CancelCartSignal signal is received +func (s *CancelCartSignalSignal) Receive(ctx workflow.Context) (*CancelCartSignalRequest, bool) { + var resp CancelCartSignalRequest + more := s.Channel.Receive(ctx, &resp) + return &resp, more +} + +// ReceiveAsync checks for a cart.v1.CartActor.CancelCartSignal signal without blocking +func (s *CancelCartSignalSignal) ReceiveAsync() *CancelCartSignalRequest { + var resp CancelCartSignalRequest + if ok := s.Channel.ReceiveAsync(&resp); !ok { + return nil + } + return &resp +} + +// ReceiveWithTimeout blocks until a(n) cart.v1.CartActor.CancelCartSignal signal is received or timeout expires. +// Returns more value of false when Channel is closed. +// Returns ok value of false when no value was found in the channel for the duration of timeout or the ctx was canceled. +// resp will be nil if ok is false. +func (s *CancelCartSignalSignal) ReceiveWithTimeout(ctx workflow.Context, timeout time.Duration) (resp *CancelCartSignalRequest, ok bool, more bool) { + resp = &CancelCartSignalRequest{} + if ok, more = s.Channel.ReceiveWithTimeout(ctx, timeout, &resp); !ok { + return nil, false, more + } + return +} + +// Select checks for a(n) cart.v1.CartActor.CancelCartSignal signal without blocking +func (s *CancelCartSignalSignal) Select(sel workflow.Selector, fn func(*CancelCartSignalRequest)) workflow.Selector { + return sel.AddReceive(s.Channel, func(workflow.ReceiveChannel, bool) { + req := s.ReceiveAsync() + if fn != nil { + fn(req) + } + }) +} + +// CancelCartSignal allows external callers to cancel the cart reservation. +func CancelCartSignalExternal(ctx workflow.Context, workflowID string, runID string, req *CancelCartSignalRequest) error { + return CancelCartSignalExternalAsync(ctx, workflowID, runID, req).Get(ctx, nil) +} + +// CancelCartSignal allows external callers to cancel the cart reservation. +func CancelCartSignalExternalAsync(ctx workflow.Context, workflowID string, runID string, req *CancelCartSignalRequest) workflow.Future { + return workflow.SignalExternalWorkflow(ctx, workflowID, runID, CancelCartSignalSignalName, req) +} + +// CartActorActivities describes available worker activities +type CartActorActivities interface { + // CheckoutCartActivity is an activity that removes tickets from the cart after a timeout. + CheckoutCartActivity(ctx context.Context, req *CheckoutCartInput) (*CheckoutCartOutput, error) + + // RemoveTickets is an activity that removes tickets from the cart after a timeout. + RemoveTicketsActivity(ctx context.Context, req *RemoveTicketsInput) (*RemoveTicketsOutput, error) + + // ReserveTickets is an activity that reserves tickets. + ReserveTicketsActivity(ctx context.Context, req *ReserveTicketsInput) (*ReserveTicketsOutput, error) +} + +// RegisterCartActorActivities registers activities with a worker +func RegisterCartActorActivities(r worker.ActivityRegistry, activities CartActorActivities) { + RegisterCheckoutCartActivityActivity(r, activities.CheckoutCartActivity) + RegisterRemoveTicketsActivityActivity(r, activities.RemoveTicketsActivity) + RegisterReserveTicketsActivityActivity(r, activities.ReserveTicketsActivity) +} + +// RegisterCheckoutCartActivityActivity registers a cart.v1.CartActor.CheckoutCartActivity activity +func RegisterCheckoutCartActivityActivity(r worker.ActivityRegistry, fn func(context.Context, *CheckoutCartInput) (*CheckoutCartOutput, error)) { + r.RegisterActivityWithOptions(fn, activity.RegisterOptions{ + Name: CheckoutCartActivityActivityName, + }) +} + +// CheckoutCartActivityFuture describes a(n) cart.v1.CartActor.CheckoutCartActivity activity execution +type CheckoutCartActivityFuture struct { + Future workflow.Future +} + +// Get blocks on the activity's completion, returning the response +func (f *CheckoutCartActivityFuture) Get(ctx workflow.Context) (*CheckoutCartOutput, error) { + var resp CheckoutCartOutput + if err := f.Future.Get(ctx, &resp); err != nil { + return nil, err + } + return &resp, nil +} + +// Select adds the activity's completion to the selector, callback can be nil +func (f *CheckoutCartActivityFuture) Select(sel workflow.Selector, fn func(*CheckoutCartActivityFuture)) workflow.Selector { + return sel.AddFuture(f.Future, func(workflow.Future) { + if fn != nil { + fn(f) + } + }) +} + +// CheckoutCartActivity is an activity that removes tickets from the cart after a timeout. +func CheckoutCartActivity(ctx workflow.Context, req *CheckoutCartInput, options ...*CheckoutCartActivityActivityOptions) (*CheckoutCartOutput, error) { + return CheckoutCartActivityAsync(ctx, req, options...).Get(ctx) +} + +// CheckoutCartActivity is an activity that removes tickets from the cart after a timeout. +func CheckoutCartActivityAsync(ctx workflow.Context, req *CheckoutCartInput, options ...*CheckoutCartActivityActivityOptions) *CheckoutCartActivityFuture { + var o *CheckoutCartActivityActivityOptions + if len(options) > 0 && options[0] != nil { + o = options[0] + } else { + o = NewCheckoutCartActivityActivityOptions() + } + var err error + if ctx, err = o.Build(ctx); err != nil { + errF, errS := workflow.NewFuture(ctx) + errS.SetError(err) + return &CheckoutCartActivityFuture{Future: errF} + } + activity := CheckoutCartActivityActivityName + future := &CheckoutCartActivityFuture{Future: workflow.ExecuteActivity(ctx, activity, req)} + return future +} + +// CheckoutCartActivity is an activity that removes tickets from the cart after a timeout. +func CheckoutCartActivityLocal(ctx workflow.Context, req *CheckoutCartInput, options ...*CheckoutCartActivityLocalActivityOptions) (*CheckoutCartOutput, error) { + return CheckoutCartActivityLocalAsync(ctx, req, options...).Get(ctx) +} + +// CheckoutCartActivity is an activity that removes tickets from the cart after a timeout. +func CheckoutCartActivityLocalAsync(ctx workflow.Context, req *CheckoutCartInput, options ...*CheckoutCartActivityLocalActivityOptions) *CheckoutCartActivityFuture { + var o *CheckoutCartActivityLocalActivityOptions + if len(options) > 0 && options[0] != nil { + o = options[0] + } else { + o = NewCheckoutCartActivityLocalActivityOptions() + } + var err error + if ctx, err = o.Build(ctx); err != nil { + errF, errS := workflow.NewFuture(ctx) + errS.SetError(err) + return &CheckoutCartActivityFuture{Future: errF} + } + var activity any + if o.fn != nil { + activity = o.fn + } else { + activity = CheckoutCartActivityActivityName + } + future := &CheckoutCartActivityFuture{Future: workflow.ExecuteLocalActivity(ctx, activity, req)} + return future +} + +// CheckoutCartActivityActivityOptions provides configuration for a(n) cart.v1.CartActor.CheckoutCartActivity activity +type CheckoutCartActivityActivityOptions struct { + options workflow.ActivityOptions + retryPolicy *temporal.RetryPolicy + scheduleToCloseTimeout *time.Duration + startToCloseTimeout *time.Duration + heartbeatTimeout *time.Duration + scheduleToStartTimeout *time.Duration + taskQueue *string + waitForCancellation *bool +} + +// NewCheckoutCartActivityActivityOptions initializes a new CheckoutCartActivityActivityOptions value +func NewCheckoutCartActivityActivityOptions() *CheckoutCartActivityActivityOptions { + return &CheckoutCartActivityActivityOptions{} +} + +// Build initializes a workflow.Context with appropriate ActivityOptions values derived from schema defaults and any user-defined overrides +func (o *CheckoutCartActivityActivityOptions) Build(ctx workflow.Context) (workflow.Context, error) { + opts := o.options + if v := o.heartbeatTimeout; v != nil { + opts.HeartbeatTimeout = *v + } + if v := o.retryPolicy; v != nil { + opts.RetryPolicy = v + } else if opts.RetryPolicy == nil { + opts.RetryPolicy = &temporal.RetryPolicy{MaximumAttempts: int32(3)} + } + if v := o.scheduleToCloseTimeout; v != nil { + opts.ScheduleToCloseTimeout = *v + } + if v := o.scheduleToStartTimeout; v != nil { + opts.ScheduleToStartTimeout = *v + } + if v := o.startToCloseTimeout; v != nil { + opts.StartToCloseTimeout = *v + } else if opts.StartToCloseTimeout == 0 { + opts.StartToCloseTimeout = 30000000000 // 30 seconds + } + if v := o.taskQueue; v != nil { + opts.TaskQueue = *v + } else if opts.TaskQueue == "" { + opts.TaskQueue = workflow.GetInfo(ctx).TaskQueueName + } + if v := o.waitForCancellation; v != nil { + opts.WaitForCancellation = *v + } + return workflow.WithActivityOptions(ctx, opts), nil +} + +// WithActivityOptions specifies an initial ActivityOptions value to which defaults will be applied +func (o *CheckoutCartActivityActivityOptions) WithActivityOptions(options workflow.ActivityOptions) *CheckoutCartActivityActivityOptions { + o.options = options + return o +} + +// WithHeartbeatTimeout sets the HeartbeatTimeout value +func (o *CheckoutCartActivityActivityOptions) WithHeartbeatTimeout(d time.Duration) *CheckoutCartActivityActivityOptions { + o.heartbeatTimeout = &d + return o +} + +// WithRetryPolicy sets the RetryPolicy value +func (o *CheckoutCartActivityActivityOptions) WithRetryPolicy(policy *temporal.RetryPolicy) *CheckoutCartActivityActivityOptions { + o.retryPolicy = policy + return o +} + +// WithScheduleToCloseTimeout sets the ScheduleToCloseTimeout value +func (o *CheckoutCartActivityActivityOptions) WithScheduleToCloseTimeout(d time.Duration) *CheckoutCartActivityActivityOptions { + o.scheduleToCloseTimeout = &d + return o +} + +// WithScheduleToStartTimeout sets the ScheduleToStartTimeout value +func (o *CheckoutCartActivityActivityOptions) WithScheduleToStartTimeout(d time.Duration) *CheckoutCartActivityActivityOptions { + o.scheduleToStartTimeout = &d + return o +} + +// WithStartToCloseTimeout sets the StartToCloseTimeout value +func (o *CheckoutCartActivityActivityOptions) WithStartToCloseTimeout(d time.Duration) *CheckoutCartActivityActivityOptions { + o.startToCloseTimeout = &d + return o +} + +// WithTaskQueue sets the TaskQueue value +func (o *CheckoutCartActivityActivityOptions) WithTaskQueue(tq string) *CheckoutCartActivityActivityOptions { + o.taskQueue = &tq + return o +} + +// WithWaitForCancellation sets the WaitForCancellation value +func (o *CheckoutCartActivityActivityOptions) WithWaitForCancellation(wait bool) *CheckoutCartActivityActivityOptions { + o.waitForCancellation = &wait + return o +} + +// CheckoutCartActivityLocalActivityOptions provides configuration for a(n) cart.v1.CartActor.CheckoutCartActivity activity +type CheckoutCartActivityLocalActivityOptions struct { + options workflow.LocalActivityOptions + retryPolicy *temporal.RetryPolicy + scheduleToCloseTimeout *time.Duration + startToCloseTimeout *time.Duration + fn func(context.Context, *CheckoutCartInput) (*CheckoutCartOutput, error) +} + +// NewCheckoutCartActivityLocalActivityOptions initializes a new CheckoutCartActivityLocalActivityOptions value +func NewCheckoutCartActivityLocalActivityOptions() *CheckoutCartActivityLocalActivityOptions { + return &CheckoutCartActivityLocalActivityOptions{} +} + +// Build initializes a workflow.Context with appropriate LocalActivityOptions values derived from schema defaults and any user-defined overrides +func (o *CheckoutCartActivityLocalActivityOptions) Build(ctx workflow.Context) (workflow.Context, error) { + opts := o.options + if v := o.retryPolicy; v != nil { + opts.RetryPolicy = v + } else if opts.RetryPolicy == nil { + opts.RetryPolicy = &temporal.RetryPolicy{MaximumAttempts: int32(3)} + } + if v := o.scheduleToCloseTimeout; v != nil { + opts.ScheduleToCloseTimeout = *v + } + if v := o.startToCloseTimeout; v != nil { + opts.StartToCloseTimeout = *v + } else if opts.StartToCloseTimeout == 0 { + opts.StartToCloseTimeout = 30000000000 // 30 seconds + } + return workflow.WithLocalActivityOptions(ctx, opts), nil +} + +// Local specifies a custom cart.v1.CartActor.CheckoutCartActivity implementation +func (o *CheckoutCartActivityLocalActivityOptions) Local(fn func(context.Context, *CheckoutCartInput) (*CheckoutCartOutput, error)) *CheckoutCartActivityLocalActivityOptions { + o.fn = fn + return o +} + +// WithLocalActivityOptions specifies an initial LocalActivityOptions value to which defaults will be applied +func (o *CheckoutCartActivityLocalActivityOptions) WithLocalActivityOptions(options workflow.LocalActivityOptions) *CheckoutCartActivityLocalActivityOptions { + o.options = options + return o +} + +// WithRetryPolicy sets the RetryPolicy value +func (o *CheckoutCartActivityLocalActivityOptions) WithRetryPolicy(policy *temporal.RetryPolicy) *CheckoutCartActivityLocalActivityOptions { + o.retryPolicy = policy + return o +} + +// WithScheduleToCloseTimeout sets the ScheduleToCloseTimeout value +func (o *CheckoutCartActivityLocalActivityOptions) WithScheduleToCloseTimeout(d time.Duration) *CheckoutCartActivityLocalActivityOptions { + o.scheduleToCloseTimeout = &d + return o +} + +// WithStartToCloseTimeout sets the StartToCloseTimeout value +func (o *CheckoutCartActivityLocalActivityOptions) WithStartToCloseTimeout(d time.Duration) *CheckoutCartActivityLocalActivityOptions { + o.startToCloseTimeout = &d + return o +} + +// RegisterRemoveTicketsActivityActivity registers a cart.v1.CartActor.RemoveTicketsActivity activity +func RegisterRemoveTicketsActivityActivity(r worker.ActivityRegistry, fn func(context.Context, *RemoveTicketsInput) (*RemoveTicketsOutput, error)) { + r.RegisterActivityWithOptions(fn, activity.RegisterOptions{ + Name: RemoveTicketsActivityActivityName, + }) +} + +// RemoveTicketsActivityFuture describes a(n) cart.v1.CartActor.RemoveTicketsActivity activity execution +type RemoveTicketsActivityFuture struct { + Future workflow.Future +} + +// Get blocks on the activity's completion, returning the response +func (f *RemoveTicketsActivityFuture) Get(ctx workflow.Context) (*RemoveTicketsOutput, error) { + var resp RemoveTicketsOutput + if err := f.Future.Get(ctx, &resp); err != nil { + return nil, err + } + return &resp, nil +} + +// Select adds the activity's completion to the selector, callback can be nil +func (f *RemoveTicketsActivityFuture) Select(sel workflow.Selector, fn func(*RemoveTicketsActivityFuture)) workflow.Selector { + return sel.AddFuture(f.Future, func(workflow.Future) { + if fn != nil { + fn(f) + } + }) +} + +// RemoveTickets is an activity that removes tickets from the cart after a timeout. +func RemoveTicketsActivity(ctx workflow.Context, req *RemoveTicketsInput, options ...*RemoveTicketsActivityActivityOptions) (*RemoveTicketsOutput, error) { + return RemoveTicketsActivityAsync(ctx, req, options...).Get(ctx) +} + +// RemoveTickets is an activity that removes tickets from the cart after a timeout. +func RemoveTicketsActivityAsync(ctx workflow.Context, req *RemoveTicketsInput, options ...*RemoveTicketsActivityActivityOptions) *RemoveTicketsActivityFuture { + var o *RemoveTicketsActivityActivityOptions + if len(options) > 0 && options[0] != nil { + o = options[0] + } else { + o = NewRemoveTicketsActivityActivityOptions() + } + var err error + if ctx, err = o.Build(ctx); err != nil { + errF, errS := workflow.NewFuture(ctx) + errS.SetError(err) + return &RemoveTicketsActivityFuture{Future: errF} + } + activity := RemoveTicketsActivityActivityName + future := &RemoveTicketsActivityFuture{Future: workflow.ExecuteActivity(ctx, activity, req)} + return future +} + +// RemoveTickets is an activity that removes tickets from the cart after a timeout. +func RemoveTicketsActivityLocal(ctx workflow.Context, req *RemoveTicketsInput, options ...*RemoveTicketsActivityLocalActivityOptions) (*RemoveTicketsOutput, error) { + return RemoveTicketsActivityLocalAsync(ctx, req, options...).Get(ctx) +} + +// RemoveTickets is an activity that removes tickets from the cart after a timeout. +func RemoveTicketsActivityLocalAsync(ctx workflow.Context, req *RemoveTicketsInput, options ...*RemoveTicketsActivityLocalActivityOptions) *RemoveTicketsActivityFuture { + var o *RemoveTicketsActivityLocalActivityOptions + if len(options) > 0 && options[0] != nil { + o = options[0] + } else { + o = NewRemoveTicketsActivityLocalActivityOptions() + } + var err error + if ctx, err = o.Build(ctx); err != nil { + errF, errS := workflow.NewFuture(ctx) + errS.SetError(err) + return &RemoveTicketsActivityFuture{Future: errF} + } + var activity any + if o.fn != nil { + activity = o.fn + } else { + activity = RemoveTicketsActivityActivityName + } + future := &RemoveTicketsActivityFuture{Future: workflow.ExecuteLocalActivity(ctx, activity, req)} + return future +} + +// RemoveTicketsActivityActivityOptions provides configuration for a(n) cart.v1.CartActor.RemoveTicketsActivity activity +type RemoveTicketsActivityActivityOptions struct { + options workflow.ActivityOptions + retryPolicy *temporal.RetryPolicy + scheduleToCloseTimeout *time.Duration + startToCloseTimeout *time.Duration + heartbeatTimeout *time.Duration + scheduleToStartTimeout *time.Duration + taskQueue *string + waitForCancellation *bool +} + +// NewRemoveTicketsActivityActivityOptions initializes a new RemoveTicketsActivityActivityOptions value +func NewRemoveTicketsActivityActivityOptions() *RemoveTicketsActivityActivityOptions { + return &RemoveTicketsActivityActivityOptions{} +} + +// Build initializes a workflow.Context with appropriate ActivityOptions values derived from schema defaults and any user-defined overrides +func (o *RemoveTicketsActivityActivityOptions) Build(ctx workflow.Context) (workflow.Context, error) { + opts := o.options + if v := o.heartbeatTimeout; v != nil { + opts.HeartbeatTimeout = *v + } + if v := o.retryPolicy; v != nil { + opts.RetryPolicy = v + } else if opts.RetryPolicy == nil { + opts.RetryPolicy = &temporal.RetryPolicy{MaximumAttempts: int32(3)} + } + if v := o.scheduleToCloseTimeout; v != nil { + opts.ScheduleToCloseTimeout = *v + } + if v := o.scheduleToStartTimeout; v != nil { + opts.ScheduleToStartTimeout = *v + } + if v := o.startToCloseTimeout; v != nil { + opts.StartToCloseTimeout = *v + } else if opts.StartToCloseTimeout == 0 { + opts.StartToCloseTimeout = 30000000000 // 30 seconds + } + if v := o.taskQueue; v != nil { + opts.TaskQueue = *v + } else if opts.TaskQueue == "" { + opts.TaskQueue = workflow.GetInfo(ctx).TaskQueueName + } + if v := o.waitForCancellation; v != nil { + opts.WaitForCancellation = *v + } + return workflow.WithActivityOptions(ctx, opts), nil +} + +// WithActivityOptions specifies an initial ActivityOptions value to which defaults will be applied +func (o *RemoveTicketsActivityActivityOptions) WithActivityOptions(options workflow.ActivityOptions) *RemoveTicketsActivityActivityOptions { + o.options = options + return o +} + +// WithHeartbeatTimeout sets the HeartbeatTimeout value +func (o *RemoveTicketsActivityActivityOptions) WithHeartbeatTimeout(d time.Duration) *RemoveTicketsActivityActivityOptions { + o.heartbeatTimeout = &d + return o +} + +// WithRetryPolicy sets the RetryPolicy value +func (o *RemoveTicketsActivityActivityOptions) WithRetryPolicy(policy *temporal.RetryPolicy) *RemoveTicketsActivityActivityOptions { + o.retryPolicy = policy + return o +} + +// WithScheduleToCloseTimeout sets the ScheduleToCloseTimeout value +func (o *RemoveTicketsActivityActivityOptions) WithScheduleToCloseTimeout(d time.Duration) *RemoveTicketsActivityActivityOptions { + o.scheduleToCloseTimeout = &d + return o +} + +// WithScheduleToStartTimeout sets the ScheduleToStartTimeout value +func (o *RemoveTicketsActivityActivityOptions) WithScheduleToStartTimeout(d time.Duration) *RemoveTicketsActivityActivityOptions { + o.scheduleToStartTimeout = &d + return o +} + +// WithStartToCloseTimeout sets the StartToCloseTimeout value +func (o *RemoveTicketsActivityActivityOptions) WithStartToCloseTimeout(d time.Duration) *RemoveTicketsActivityActivityOptions { + o.startToCloseTimeout = &d + return o +} + +// WithTaskQueue sets the TaskQueue value +func (o *RemoveTicketsActivityActivityOptions) WithTaskQueue(tq string) *RemoveTicketsActivityActivityOptions { + o.taskQueue = &tq + return o +} + +// WithWaitForCancellation sets the WaitForCancellation value +func (o *RemoveTicketsActivityActivityOptions) WithWaitForCancellation(wait bool) *RemoveTicketsActivityActivityOptions { + o.waitForCancellation = &wait + return o +} + +// RemoveTicketsActivityLocalActivityOptions provides configuration for a(n) cart.v1.CartActor.RemoveTicketsActivity activity +type RemoveTicketsActivityLocalActivityOptions struct { + options workflow.LocalActivityOptions + retryPolicy *temporal.RetryPolicy + scheduleToCloseTimeout *time.Duration + startToCloseTimeout *time.Duration + fn func(context.Context, *RemoveTicketsInput) (*RemoveTicketsOutput, error) +} + +// NewRemoveTicketsActivityLocalActivityOptions initializes a new RemoveTicketsActivityLocalActivityOptions value +func NewRemoveTicketsActivityLocalActivityOptions() *RemoveTicketsActivityLocalActivityOptions { + return &RemoveTicketsActivityLocalActivityOptions{} +} + +// Build initializes a workflow.Context with appropriate LocalActivityOptions values derived from schema defaults and any user-defined overrides +func (o *RemoveTicketsActivityLocalActivityOptions) Build(ctx workflow.Context) (workflow.Context, error) { + opts := o.options + if v := o.retryPolicy; v != nil { + opts.RetryPolicy = v + } else if opts.RetryPolicy == nil { + opts.RetryPolicy = &temporal.RetryPolicy{MaximumAttempts: int32(3)} + } + if v := o.scheduleToCloseTimeout; v != nil { + opts.ScheduleToCloseTimeout = *v + } + if v := o.startToCloseTimeout; v != nil { + opts.StartToCloseTimeout = *v + } else if opts.StartToCloseTimeout == 0 { + opts.StartToCloseTimeout = 30000000000 // 30 seconds + } + return workflow.WithLocalActivityOptions(ctx, opts), nil +} + +// Local specifies a custom cart.v1.CartActor.RemoveTicketsActivity implementation +func (o *RemoveTicketsActivityLocalActivityOptions) Local(fn func(context.Context, *RemoveTicketsInput) (*RemoveTicketsOutput, error)) *RemoveTicketsActivityLocalActivityOptions { + o.fn = fn + return o +} + +// WithLocalActivityOptions specifies an initial LocalActivityOptions value to which defaults will be applied +func (o *RemoveTicketsActivityLocalActivityOptions) WithLocalActivityOptions(options workflow.LocalActivityOptions) *RemoveTicketsActivityLocalActivityOptions { + o.options = options + return o +} + +// WithRetryPolicy sets the RetryPolicy value +func (o *RemoveTicketsActivityLocalActivityOptions) WithRetryPolicy(policy *temporal.RetryPolicy) *RemoveTicketsActivityLocalActivityOptions { + o.retryPolicy = policy + return o +} + +// WithScheduleToCloseTimeout sets the ScheduleToCloseTimeout value +func (o *RemoveTicketsActivityLocalActivityOptions) WithScheduleToCloseTimeout(d time.Duration) *RemoveTicketsActivityLocalActivityOptions { + o.scheduleToCloseTimeout = &d + return o +} + +// WithStartToCloseTimeout sets the StartToCloseTimeout value +func (o *RemoveTicketsActivityLocalActivityOptions) WithStartToCloseTimeout(d time.Duration) *RemoveTicketsActivityLocalActivityOptions { + o.startToCloseTimeout = &d + return o +} + +// RegisterReserveTicketsActivityActivity registers a cart.v1.CartActor.ReserveTicketsActivity activity +func RegisterReserveTicketsActivityActivity(r worker.ActivityRegistry, fn func(context.Context, *ReserveTicketsInput) (*ReserveTicketsOutput, error)) { + r.RegisterActivityWithOptions(fn, activity.RegisterOptions{ + Name: ReserveTicketsActivityActivityName, + }) +} + +// ReserveTicketsActivityFuture describes a(n) cart.v1.CartActor.ReserveTicketsActivity activity execution +type ReserveTicketsActivityFuture struct { + Future workflow.Future +} + +// Get blocks on the activity's completion, returning the response +func (f *ReserveTicketsActivityFuture) Get(ctx workflow.Context) (*ReserveTicketsOutput, error) { + var resp ReserveTicketsOutput + if err := f.Future.Get(ctx, &resp); err != nil { + return nil, err + } + return &resp, nil +} + +// Select adds the activity's completion to the selector, callback can be nil +func (f *ReserveTicketsActivityFuture) Select(sel workflow.Selector, fn func(*ReserveTicketsActivityFuture)) workflow.Selector { + return sel.AddFuture(f.Future, func(workflow.Future) { + if fn != nil { + fn(f) + } + }) +} + +// ReserveTickets is an activity that reserves tickets. +func ReserveTicketsActivity(ctx workflow.Context, req *ReserveTicketsInput, options ...*ReserveTicketsActivityActivityOptions) (*ReserveTicketsOutput, error) { + return ReserveTicketsActivityAsync(ctx, req, options...).Get(ctx) +} + +// ReserveTickets is an activity that reserves tickets. +func ReserveTicketsActivityAsync(ctx workflow.Context, req *ReserveTicketsInput, options ...*ReserveTicketsActivityActivityOptions) *ReserveTicketsActivityFuture { + var o *ReserveTicketsActivityActivityOptions + if len(options) > 0 && options[0] != nil { + o = options[0] + } else { + o = NewReserveTicketsActivityActivityOptions() + } + var err error + if ctx, err = o.Build(ctx); err != nil { + errF, errS := workflow.NewFuture(ctx) + errS.SetError(err) + return &ReserveTicketsActivityFuture{Future: errF} + } + activity := ReserveTicketsActivityActivityName + future := &ReserveTicketsActivityFuture{Future: workflow.ExecuteActivity(ctx, activity, req)} + return future +} + +// ReserveTickets is an activity that reserves tickets. +func ReserveTicketsActivityLocal(ctx workflow.Context, req *ReserveTicketsInput, options ...*ReserveTicketsActivityLocalActivityOptions) (*ReserveTicketsOutput, error) { + return ReserveTicketsActivityLocalAsync(ctx, req, options...).Get(ctx) +} + +// ReserveTickets is an activity that reserves tickets. +func ReserveTicketsActivityLocalAsync(ctx workflow.Context, req *ReserveTicketsInput, options ...*ReserveTicketsActivityLocalActivityOptions) *ReserveTicketsActivityFuture { + var o *ReserveTicketsActivityLocalActivityOptions + if len(options) > 0 && options[0] != nil { + o = options[0] + } else { + o = NewReserveTicketsActivityLocalActivityOptions() + } + var err error + if ctx, err = o.Build(ctx); err != nil { + errF, errS := workflow.NewFuture(ctx) + errS.SetError(err) + return &ReserveTicketsActivityFuture{Future: errF} + } + var activity any + if o.fn != nil { + activity = o.fn + } else { + activity = ReserveTicketsActivityActivityName + } + future := &ReserveTicketsActivityFuture{Future: workflow.ExecuteLocalActivity(ctx, activity, req)} + return future +} + +// ReserveTicketsActivityActivityOptions provides configuration for a(n) cart.v1.CartActor.ReserveTicketsActivity activity +type ReserveTicketsActivityActivityOptions struct { + options workflow.ActivityOptions + retryPolicy *temporal.RetryPolicy + scheduleToCloseTimeout *time.Duration + startToCloseTimeout *time.Duration + heartbeatTimeout *time.Duration + scheduleToStartTimeout *time.Duration + taskQueue *string + waitForCancellation *bool +} + +// NewReserveTicketsActivityActivityOptions initializes a new ReserveTicketsActivityActivityOptions value +func NewReserveTicketsActivityActivityOptions() *ReserveTicketsActivityActivityOptions { + return &ReserveTicketsActivityActivityOptions{} +} + +// Build initializes a workflow.Context with appropriate ActivityOptions values derived from schema defaults and any user-defined overrides +func (o *ReserveTicketsActivityActivityOptions) Build(ctx workflow.Context) (workflow.Context, error) { + opts := o.options + if v := o.heartbeatTimeout; v != nil { + opts.HeartbeatTimeout = *v + } + if v := o.retryPolicy; v != nil { + opts.RetryPolicy = v + } else if opts.RetryPolicy == nil { + opts.RetryPolicy = &temporal.RetryPolicy{MaximumAttempts: int32(3)} + } + if v := o.scheduleToCloseTimeout; v != nil { + opts.ScheduleToCloseTimeout = *v + } + if v := o.scheduleToStartTimeout; v != nil { + opts.ScheduleToStartTimeout = *v + } + if v := o.startToCloseTimeout; v != nil { + opts.StartToCloseTimeout = *v + } else if opts.StartToCloseTimeout == 0 { + opts.StartToCloseTimeout = 30000000000 // 30 seconds + } + if v := o.taskQueue; v != nil { + opts.TaskQueue = *v + } else if opts.TaskQueue == "" { + opts.TaskQueue = workflow.GetInfo(ctx).TaskQueueName + } + if v := o.waitForCancellation; v != nil { + opts.WaitForCancellation = *v + } + return workflow.WithActivityOptions(ctx, opts), nil +} + +// WithActivityOptions specifies an initial ActivityOptions value to which defaults will be applied +func (o *ReserveTicketsActivityActivityOptions) WithActivityOptions(options workflow.ActivityOptions) *ReserveTicketsActivityActivityOptions { + o.options = options + return o +} + +// WithHeartbeatTimeout sets the HeartbeatTimeout value +func (o *ReserveTicketsActivityActivityOptions) WithHeartbeatTimeout(d time.Duration) *ReserveTicketsActivityActivityOptions { + o.heartbeatTimeout = &d + return o +} + +// WithRetryPolicy sets the RetryPolicy value +func (o *ReserveTicketsActivityActivityOptions) WithRetryPolicy(policy *temporal.RetryPolicy) *ReserveTicketsActivityActivityOptions { + o.retryPolicy = policy + return o +} + +// WithScheduleToCloseTimeout sets the ScheduleToCloseTimeout value +func (o *ReserveTicketsActivityActivityOptions) WithScheduleToCloseTimeout(d time.Duration) *ReserveTicketsActivityActivityOptions { + o.scheduleToCloseTimeout = &d + return o +} + +// WithScheduleToStartTimeout sets the ScheduleToStartTimeout value +func (o *ReserveTicketsActivityActivityOptions) WithScheduleToStartTimeout(d time.Duration) *ReserveTicketsActivityActivityOptions { + o.scheduleToStartTimeout = &d + return o +} + +// WithStartToCloseTimeout sets the StartToCloseTimeout value +func (o *ReserveTicketsActivityActivityOptions) WithStartToCloseTimeout(d time.Duration) *ReserveTicketsActivityActivityOptions { + o.startToCloseTimeout = &d + return o +} + +// WithTaskQueue sets the TaskQueue value +func (o *ReserveTicketsActivityActivityOptions) WithTaskQueue(tq string) *ReserveTicketsActivityActivityOptions { + o.taskQueue = &tq + return o +} + +// WithWaitForCancellation sets the WaitForCancellation value +func (o *ReserveTicketsActivityActivityOptions) WithWaitForCancellation(wait bool) *ReserveTicketsActivityActivityOptions { + o.waitForCancellation = &wait + return o +} + +// ReserveTicketsActivityLocalActivityOptions provides configuration for a(n) cart.v1.CartActor.ReserveTicketsActivity activity +type ReserveTicketsActivityLocalActivityOptions struct { + options workflow.LocalActivityOptions + retryPolicy *temporal.RetryPolicy + scheduleToCloseTimeout *time.Duration + startToCloseTimeout *time.Duration + fn func(context.Context, *ReserveTicketsInput) (*ReserveTicketsOutput, error) +} + +// NewReserveTicketsActivityLocalActivityOptions initializes a new ReserveTicketsActivityLocalActivityOptions value +func NewReserveTicketsActivityLocalActivityOptions() *ReserveTicketsActivityLocalActivityOptions { + return &ReserveTicketsActivityLocalActivityOptions{} +} + +// Build initializes a workflow.Context with appropriate LocalActivityOptions values derived from schema defaults and any user-defined overrides +func (o *ReserveTicketsActivityLocalActivityOptions) Build(ctx workflow.Context) (workflow.Context, error) { + opts := o.options + if v := o.retryPolicy; v != nil { + opts.RetryPolicy = v + } else if opts.RetryPolicy == nil { + opts.RetryPolicy = &temporal.RetryPolicy{MaximumAttempts: int32(3)} + } + if v := o.scheduleToCloseTimeout; v != nil { + opts.ScheduleToCloseTimeout = *v + } + if v := o.startToCloseTimeout; v != nil { + opts.StartToCloseTimeout = *v + } else if opts.StartToCloseTimeout == 0 { + opts.StartToCloseTimeout = 30000000000 // 30 seconds + } + return workflow.WithLocalActivityOptions(ctx, opts), nil +} + +// Local specifies a custom cart.v1.CartActor.ReserveTicketsActivity implementation +func (o *ReserveTicketsActivityLocalActivityOptions) Local(fn func(context.Context, *ReserveTicketsInput) (*ReserveTicketsOutput, error)) *ReserveTicketsActivityLocalActivityOptions { + o.fn = fn + return o +} + +// WithLocalActivityOptions specifies an initial LocalActivityOptions value to which defaults will be applied +func (o *ReserveTicketsActivityLocalActivityOptions) WithLocalActivityOptions(options workflow.LocalActivityOptions) *ReserveTicketsActivityLocalActivityOptions { + o.options = options + return o +} + +// WithRetryPolicy sets the RetryPolicy value +func (o *ReserveTicketsActivityLocalActivityOptions) WithRetryPolicy(policy *temporal.RetryPolicy) *ReserveTicketsActivityLocalActivityOptions { + o.retryPolicy = policy + return o +} + +// WithScheduleToCloseTimeout sets the ScheduleToCloseTimeout value +func (o *ReserveTicketsActivityLocalActivityOptions) WithScheduleToCloseTimeout(d time.Duration) *ReserveTicketsActivityLocalActivityOptions { + o.scheduleToCloseTimeout = &d + return o +} + +// WithStartToCloseTimeout sets the StartToCloseTimeout value +func (o *ReserveTicketsActivityLocalActivityOptions) WithStartToCloseTimeout(d time.Duration) *ReserveTicketsActivityLocalActivityOptions { + o.startToCloseTimeout = &d + return o +} + +// TestClient provides a testsuite-compatible Client +type TestCartActorClient struct { + env *testsuite.TestWorkflowEnvironment + workflows CartActorWorkflows +} + +var _ CartActorClient = &TestCartActorClient{} + +// NewTestCartActorClient initializes a new TestCartActorClient value +func NewTestCartActorClient(env *testsuite.TestWorkflowEnvironment, workflows CartActorWorkflows, activities CartActorActivities) *TestCartActorClient { + if workflows != nil { + RegisterCartActorWorkflows(env, workflows) + } + if activities != nil { + RegisterCartActorActivities(env, activities) + } + return &TestCartActorClient{env, workflows} +} + +// StartCart executes a(n) cart.v1.CartActor.StartCart workflow in the test environment +func (c *TestCartActorClient) StartCart(ctx context.Context, req *CartRequest, opts ...*StartCartOptions) (*CartResponse, error) { + run, err := c.StartCartAsync(ctx, req, opts...) + if err != nil { + return nil, err + } + return run.Get(ctx) +} + +// StartCartAsync executes a(n) cart.v1.CartActor.StartCart workflow in the test environment +func (c *TestCartActorClient) StartCartAsync(ctx context.Context, req *CartRequest, options ...*StartCartOptions) (StartCartRun, error) { + var o *StartCartOptions + if len(options) > 0 && options[0] != nil { + o = options[0] + } else { + o = NewStartCartOptions() + } + opts, err := o.Build(req.ProtoReflect()) + if err != nil { + return nil, fmt.Errorf("error initializing client.StartWorkflowOptions: %w", err) + } + return &testStartCartRun{client: c, env: c.env, opts: &opts, req: req, workflows: c.workflows}, nil +} + +// GetStartCart is a noop +func (c *TestCartActorClient) GetStartCart(ctx context.Context, workflowID string, runID string) StartCartRun { + return &testStartCartRun{env: c.env, workflows: c.workflows} +} + +// CancelWorkflow requests cancellation of an existing workflow execution +func (c *TestCartActorClient) CancelWorkflow(ctx context.Context, workflowID string, runID string) error { + c.env.CancelWorkflow() + return nil +} + +// TerminateWorkflow terminates an existing workflow execution +func (c *TestCartActorClient) TerminateWorkflow(ctx context.Context, workflowID string, runID string, reason string, details ...interface{}) error { + return c.CancelWorkflow(ctx, workflowID, runID) +} + +// CancelCartSignal executes a cart.v1.CartActor.CancelCartSignal signal +func (c *TestCartActorClient) CancelCartSignal(ctx context.Context, workflowID string, runID string, req *CancelCartSignalRequest) error { + c.env.SignalWorkflow(CancelCartSignalSignalName, req) + return nil +} + +var _ StartCartRun = &testStartCartRun{} + +// testStartCartRun provides convenience methods for interacting with a(n) cart.v1.CartActor.StartCart workflow in the test environment +type testStartCartRun struct { + client *TestCartActorClient + env *testsuite.TestWorkflowEnvironment + opts *client.StartWorkflowOptions + req *CartRequest + workflows CartActorWorkflows +} + +// Cancel requests cancellation of a workflow in execution, returning an error if applicable +func (r *testStartCartRun) Cancel(ctx context.Context) error { + return r.client.CancelWorkflow(ctx, r.ID(), r.RunID()) +} + +// Get retrieves a test cart.v1.CartActor.StartCart workflow result +func (r *testStartCartRun) Get(context.Context) (*CartResponse, error) { + r.env.ExecuteWorkflow(StartCartWorkflowName, r.req) + if !r.env.IsWorkflowCompleted() { + return nil, errors.New("workflow in progress") + } + if err := r.env.GetWorkflowError(); err != nil { + return nil, err + } + var result CartResponse + if err := r.env.GetWorkflowResult(&result); err != nil { + return nil, err + } + return &result, nil +} + +// ID returns a test cart.v1.CartActor.StartCart workflow run's workflow ID +func (r *testStartCartRun) ID() string { + if r.opts != nil { + return r.opts.ID + } + return "" +} + +// Run noop implementation +func (r *testStartCartRun) Run() client.WorkflowRun { + return nil +} + +// RunID noop implementation +func (r *testStartCartRun) RunID() string { + return "" +} + +// Terminate terminates a workflow in execution, returning an error if applicable +func (r *testStartCartRun) Terminate(ctx context.Context, reason string, details ...interface{}) error { + return r.client.TerminateWorkflow(ctx, r.ID(), r.RunID(), reason, details...) +} + +// CartActorCliOptions describes runtime configuration for cart.v1.CartActor cli +type CartActorCliOptions struct { + after func(*v2.Context) error + before func(*v2.Context) error + clientForCommand func(*v2.Context) (client.Client, error) + worker func(*v2.Context, client.Client) (worker.Worker, error) +} + +// NewCartActorCliOptions initializes a new CartActorCliOptions value +func NewCartActorCliOptions() *CartActorCliOptions { + return &CartActorCliOptions{} +} + +// WithAfter injects a custom After hook to be run after any command invocation +func (opts *CartActorCliOptions) WithAfter(fn func(*v2.Context) error) *CartActorCliOptions { + opts.after = fn + return opts +} + +// WithBefore injects a custom Before hook to be run prior to any command invocation +func (opts *CartActorCliOptions) WithBefore(fn func(*v2.Context) error) *CartActorCliOptions { + opts.before = fn + return opts +} + +// WithClient provides a Temporal client factory for use by commands +func (opts *CartActorCliOptions) WithClient(fn func(*v2.Context) (client.Client, error)) *CartActorCliOptions { + opts.clientForCommand = fn + return opts +} + +// WithWorker provides an method for initializing a worker +func (opts *CartActorCliOptions) WithWorker(fn func(*v2.Context, client.Client) (worker.Worker, error)) *CartActorCliOptions { + opts.worker = fn + return opts +} + +// NewCartActorCli initializes a cli for a(n) cart.v1.CartActor service +func NewCartActorCli(options ...*CartActorCliOptions) (*v2.App, error) { + commands, err := newCartActorCommands(options...) + if err != nil { + return nil, fmt.Errorf("error initializing subcommands: %w", err) + } + return &v2.App{ + Name: "cart-actor", + Commands: commands, + DisableSliceFlagSeparator: true, + }, nil +} + +// NewCartActorCliCommand initializes a cli command for a cart.v1.CartActor service with subcommands for each query, signal, update, and workflow +func NewCartActorCliCommand(options ...*CartActorCliOptions) (*v2.Command, error) { + subcommands, err := newCartActorCommands(options...) + if err != nil { + return nil, fmt.Errorf("error initializing subcommands: %w", err) + } + return &v2.Command{ + Name: "cart-actor", + Subcommands: subcommands, + }, nil +} + +// newCartActorCommands initializes (sub)commands for a cart.v1.CartActor cli or command +func newCartActorCommands(options ...*CartActorCliOptions) ([]*v2.Command, error) { + opts := &CartActorCliOptions{} + if len(options) > 0 { + opts = options[0] + } + if opts.clientForCommand == nil { + opts.clientForCommand = func(*v2.Context) (client.Client, error) { + return client.Dial(client.Options{}) + } + } + commands := []*v2.Command{ + { + Name: "cancel-cart-signal", + Usage: "CancelCartSignal allows external callers to cancel the cart reservation.", + Category: "SIGNALS", + UseShortOptionHandling: true, + Before: opts.before, + After: opts.after, + Flags: []v2.Flag{ + &v2.StringFlag{ + Name: "workflow-id", + Usage: "workflow id", + Required: true, + Aliases: []string{"w"}, + }, + &v2.StringFlag{ + Name: "run-id", + Usage: "run id", + Aliases: []string{"r"}, + }, + &v2.StringFlag{ + Name: "input-file", + Usage: "path to json-formatted input file", + Aliases: []string{"f"}, + }, + &v2.StringFlag{ + Name: "cart-id", + Usage: "set the value of the operation's \"CartId\" parameter", + Category: "INPUT", + }, + &v2.StringFlag{ + Name: "reason", + Usage: "set the value of the operation's \"Reason\" parameter", + Category: "INPUT", + }, + }, + Action: func(cmd *v2.Context) error { + c, err := opts.clientForCommand(cmd) + if err != nil { + return fmt.Errorf("error initializing client for command: %w", err) + } + defer c.Close() + client := NewCartActorClient(c) + req, err := UnmarshalCliFlagsToCancelCartSignalRequest(cmd) + if err != nil { + return fmt.Errorf("error unmarshalling request: %w", err) + } + if err := client.CancelCartSignal(cmd.Context, cmd.String("workflow-id"), cmd.String("run-id"), req); err != nil { + return fmt.Errorf("error sending %q signal: %w", CancelCartSignalSignalName, err) + } + fmt.Println("success") + return nil + }, + }, + { + Name: "start-cart", + Usage: "Starts the shopping cart workflow.", + Category: "WORKFLOWS", + UseShortOptionHandling: true, + Before: opts.before, + After: opts.after, + Flags: []v2.Flag{ + &v2.BoolFlag{ + Name: "detach", + Usage: "run workflow in the background and print workflow and execution id", + Aliases: []string{"d"}, + }, + &v2.StringFlag{ + Name: "task-queue", + Usage: "task queue name", + Aliases: []string{"t"}, + EnvVars: []string{"TEMPORAL_TASK_QUEUE_NAME", "TEMPORAL_TASK_QUEUE", "TASK_QUEUE_NAME", "TASK_QUEUE"}, + Required: true, + }, + &v2.StringFlag{ + Name: "input-file", + Usage: "path to json-formatted input file", + Aliases: []string{"f"}, + }, + &v2.StringFlag{ + Name: "cart-id", + Usage: "set the value of the operation's \"CartId\" parameter", + Category: "INPUT", + }, + &v2.StringFlag{ + Name: "customer-id", + Usage: "set the value of the operation's \"CustomerId\" parameter", + Category: "INPUT", + }, + &v2.StringFlag{ + Name: "ticket-ids", + Usage: "Comma-separated ticket IDs.", + Category: "INPUT", + }, + }, + Action: func(cmd *v2.Context) error { + tc, err := opts.clientForCommand(cmd) + if err != nil { + return fmt.Errorf("error initializing client for command: %w", err) + } + defer tc.Close() + c := NewCartActorClient(tc) + req, err := UnmarshalCliFlagsToCartRequest(cmd) + if err != nil { + return fmt.Errorf("error unmarshalling request: %w", err) + } + opts := client.StartWorkflowOptions{} + if tq := cmd.String("task-queue"); tq != "" { + opts.TaskQueue = tq + } + run, err := c.StartCartAsync(cmd.Context, req, NewStartCartOptions().WithStartWorkflowOptions(opts)) + if err != nil { + return fmt.Errorf("error starting %s workflow: %w", StartCartWorkflowName, err) + } + if cmd.Bool("detach") { + fmt.Println("success") + fmt.Printf("workflow id: %s\n", run.ID()) + fmt.Printf("run id: %s\n", run.RunID()) + return nil + } + if resp, err := run.Get(cmd.Context); err != nil { + return err + } else { + b, err := protojson.Marshal(resp) + if err != nil { + return fmt.Errorf("error serializing response json: %w", err) + } + var out bytes.Buffer + if err := json.Indent(&out, b, "", " "); err != nil { + return fmt.Errorf("error formatting json: %w", err) + } + fmt.Println(out.String()) + return nil + } + }, + }, + } + if opts.worker != nil { + commands = append(commands, []*v2.Command{ + { + Name: "worker", + Usage: "runs a cart.v1.CartActor worker process", + UseShortOptionHandling: true, + Before: opts.before, + After: opts.after, + Action: func(cmd *v2.Context) error { + c, err := opts.clientForCommand(cmd) + if err != nil { + return fmt.Errorf("error initializing client for command: %w", err) + } + defer c.Close() + w, err := opts.worker(cmd, c) + if opts.worker != nil { + if err != nil { + return fmt.Errorf("error initializing worker: %w", err) + } + } + if err := w.Start(); err != nil { + return fmt.Errorf("error starting worker: %w", err) + } + defer w.Stop() + <-cmd.Context.Done() + return nil + }, + }, + }...) + } + sort.Slice(commands, func(i, j int) bool { + return commands[i].Name < commands[j].Name + }) + return commands, nil +} + +// UnmarshalCliFlagsToCancelCartSignalRequest unmarshals a CancelCartSignalRequest from command line flags +func UnmarshalCliFlagsToCancelCartSignalRequest(cmd *v2.Context, options ...helpers.UnmarshalCliFlagsOptions) (*CancelCartSignalRequest, error) { + var result CancelCartSignalRequest + if cmd.IsSet("input-file") { + inputFile, err := gohomedir.Expand(cmd.String("input-file")) + if err != nil { + inputFile = cmd.String("input-file") + } + b, err := os.ReadFile(inputFile) + if err != nil { + return nil, fmt.Errorf("error reading input-file: %w", err) + } + if err := protojson.Unmarshal(b, &result); err != nil { + return nil, fmt.Errorf("error parsing input-file json: %w", err) + } + } + opts := helpers.UnmarshalCliFlagsOptions{} + if len(options) > 0 { + opts = options[0] + } + if flag := opts.FlagName("cart-id"); cmd.IsSet(flag) { + value := cmd.String(flag) + result.CartId = value + } + if flag := opts.FlagName("reason"); cmd.IsSet(flag) { + value := cmd.String(flag) + result.Reason = value + } + return &result, nil +} + +// UnmarshalCliFlagsToCartRequest unmarshals a CartRequest from command line flags +func UnmarshalCliFlagsToCartRequest(cmd *v2.Context, options ...helpers.UnmarshalCliFlagsOptions) (*CartRequest, error) { + var result CartRequest + if cmd.IsSet("input-file") { + inputFile, err := gohomedir.Expand(cmd.String("input-file")) + if err != nil { + inputFile = cmd.String("input-file") + } + b, err := os.ReadFile(inputFile) + if err != nil { + return nil, fmt.Errorf("error reading input-file: %w", err) + } + if err := protojson.Unmarshal(b, &result); err != nil { + return nil, fmt.Errorf("error parsing input-file json: %w", err) + } + } + opts := helpers.UnmarshalCliFlagsOptions{} + if len(options) > 0 { + opts = options[0] + } + if flag := opts.FlagName("cart-id"); cmd.IsSet(flag) { + value := cmd.String(flag) + result.CartId = value + } + if flag := opts.FlagName("customer-id"); cmd.IsSet(flag) { + value := cmd.String(flag) + result.CustomerId = value + } + if flag := opts.FlagName("ticket-ids"); cmd.IsSet(flag) { + value := cmd.String(flag) + result.TicketIds = value + } + return &result, nil +} diff --git a/gen/cart/v1/cartv1xns/cart_actor_xns_temporal.pb.go b/gen/cart/v1/cartv1xns/cart_actor_xns_temporal.pb.go new file mode 100644 index 0000000..329f7c5 --- /dev/null +++ b/gen/cart/v1/cartv1xns/cart_actor_xns_temporal.pb.go @@ -0,0 +1,583 @@ +// Code generated by protoc-gen-go_temporal. DO NOT EDIT. +// versions: +// +// protoc-gen-go_temporal dev (latest) +// go go1.24.1 +// protoc (unknown) +// +// source: cart/v1/cart_actor.proto +package cartv1xns + +import ( + "context" + "errors" + "fmt" + temporalv1 "github.com/cludden/protoc-gen-go-temporal/gen/temporal/v1" + xnsv1 "github.com/cludden/protoc-gen-go-temporal/gen/temporal/xns/v1" + expression "github.com/cludden/protoc-gen-go-temporal/pkg/expression" + xns "github.com/cludden/protoc-gen-go-temporal/pkg/xns" + uuid "github.com/google/uuid" + v1 "github.com/taltemus/stacked-diff-example/gen/cart/v1" + enumsv1 "go.temporal.io/api/enums/v1" + activity "go.temporal.io/sdk/activity" + client "go.temporal.io/sdk/client" + temporal "go.temporal.io/sdk/temporal" + worker "go.temporal.io/sdk/worker" + workflow "go.temporal.io/sdk/workflow" + anypb "google.golang.org/protobuf/types/known/anypb" + durationpb "google.golang.org/protobuf/types/known/durationpb" + "time" +) + +// CartActorOptions is used to configure cart.v1.CartActor xns activity registration +type CartActorOptions struct { + // errorConverter is used to customize error + errorConverter func(error) error + // filter is used to filter xns activity registrations. It receives as + // input the original activity name, and should return one of the following: + // 1. the original activity name, for no changes + // 2. a modified activity name, to override the original activity name + // 3. an empty string, to skip registration + filter func(string) string +} + +// NewCartActorOptions initializes a new CartActorOptions value +func NewCartActorOptions() *CartActorOptions { + return &CartActorOptions{} +} + +// WithErrorConverter overrides the default error converter applied to xns activity errors +func (opts *CartActorOptions) WithErrorConverter(errorConverter func(error) error) *CartActorOptions { + opts.errorConverter = errorConverter + return opts +} + +// Filter is used to filter registered xns activities or customize their name +func (opts *CartActorOptions) WithFilter(filter func(string) string) *CartActorOptions { + opts.filter = filter + return opts +} + +// convertError is applied to all xns activity errors +func (opts *CartActorOptions) convertError(err error) error { + if err == nil { + return nil + } + if opts != nil && opts.errorConverter != nil { + return opts.errorConverter(err) + } + return xns.ErrorToApplicationError(err) +} + +// filterActivity is used to filter xns activity registrations +func (opts *CartActorOptions) filterActivity(name string) string { + if opts == nil || opts.filter == nil { + return name + } + return opts.filter(name) +} + +// cartActorOptions is a reference to the CartActorOptions initialized at registration +var cartActorOptions *CartActorOptions + +// RegisterCartActorActivities registers cart.v1.CartActor cross-namespace activities +func RegisterCartActorActivities(r worker.ActivityRegistry, c v1.CartActorClient, options ...*CartActorOptions) { + if cartActorOptions == nil && len(options) > 0 && options[0] != nil { + cartActorOptions = options[0] + } + a := &cartActorActivities{c} + if name := cartActorOptions.filterActivity("cart.v1.CartActor.CancelWorkflow"); name != "" { + r.RegisterActivityWithOptions(a.CancelWorkflow, activity.RegisterOptions{Name: name}) + } + if name := cartActorOptions.filterActivity(v1.StartCartWorkflowName); name != "" { + r.RegisterActivityWithOptions(a.StartCart, activity.RegisterOptions{Name: name}) + } + if name := cartActorOptions.filterActivity(v1.CancelCartSignalSignalName); name != "" { + r.RegisterActivityWithOptions(a.CancelCartSignal, activity.RegisterOptions{Name: name}) + } +} + +// StartCartWorkflowOptions are used to configure a(n) cart.v1.CartActor.StartCart workflow execution +type StartCartWorkflowOptions struct { + ActivityOptions *workflow.ActivityOptions + Detached bool + HeartbeatInterval time.Duration + ParentClosePolicy enumsv1.ParentClosePolicy + StartWorkflowOptions *client.StartWorkflowOptions +} + +// NewStartCartWorkflowOptions initializes a new StartCartWorkflowOptions value +func NewStartCartWorkflowOptions() *StartCartWorkflowOptions { + return &StartCartWorkflowOptions{} +} + +// WithActivityOptions can be used to customize the activity options +func (opts *StartCartWorkflowOptions) WithActivityOptions(ao workflow.ActivityOptions) *StartCartWorkflowOptions { + opts.ActivityOptions = &ao + return opts +} + +// WithDetached can be used to start a workflow execution and exit immediately +func (opts *StartCartWorkflowOptions) WithDetached(d bool) *StartCartWorkflowOptions { + opts.Detached = d + return opts +} + +// WithHeartbeatInterval can be used to customize the activity heartbeat interval +func (opts *StartCartWorkflowOptions) WithHeartbeatInterval(d time.Duration) *StartCartWorkflowOptions { + opts.HeartbeatInterval = d + return opts +} + +// WithParentClosePolicy can be used to customize the cancellation propagation behavior +func (opts *StartCartWorkflowOptions) WithParentClosePolicy(policy enumsv1.ParentClosePolicy) *StartCartWorkflowOptions { + opts.ParentClosePolicy = policy + return opts +} + +// WithStartWorkflowOptions can be used to customize the start workflow options +func (opts *StartCartWorkflowOptions) WithStartWorkflow(swo client.StartWorkflowOptions) *StartCartWorkflowOptions { + opts.StartWorkflowOptions = &swo + return opts +} + +// StartCartRun provides a handle to a cart.v1.CartActor.StartCart workflow execution +type StartCartRun interface { + // Cancel cancels the workflow + Cancel(workflow.Context) error + + // Future returns the inner workflow.Future + Future() workflow.Future + + // Get returns the inner workflow.Future + Get(workflow.Context) (*v1.CartResponse, error) + + // ID returns the workflow id + ID() string +} + +// startCartRun provides a(n) StartCartRun implementation +type startCartRun struct { + cancel func() + future workflow.Future + id string +} + +// Cancel the underlying workflow execution +func (r *startCartRun) Cancel(ctx workflow.Context) error { + if r.cancel != nil { + r.cancel() + if _, err := r.Get(ctx); err != nil && !errors.Is(err, workflow.ErrCanceled) { + return err + } + return nil + } + return CancelCartActorWorkflow(ctx, r.id, "") +} + +// Future returns the underlying activity future +func (r *startCartRun) Future() workflow.Future { + return r.future +} + +// Get blocks on activity completion and returns the underlying workflow result +func (r *startCartRun) Get(ctx workflow.Context) (*v1.CartResponse, error) { + var resp v1.CartResponse + if err := r.future.Get(ctx, &resp); err != nil { + return nil, err + } + return &resp, nil +} + +// ID returns the underlying workflow id +func (r *startCartRun) ID() string { + return r.id +} + +// Starts the shopping cart workflow. +func StartCart(ctx workflow.Context, req *v1.CartRequest, opts ...*StartCartWorkflowOptions) (*v1.CartResponse, error) { + run, err := StartCartAsync(ctx, req, opts...) + if err != nil { + return nil, err + } + return run.Get(ctx) +} + +// Starts the shopping cart workflow. +func StartCartAsync(ctx workflow.Context, req *v1.CartRequest, opts ...*StartCartWorkflowOptions) (StartCartRun, error) { + activityName := cartActorOptions.filterActivity(v1.StartCartWorkflowName) + if activityName == "" { + return nil, temporal.NewNonRetryableApplicationError( + fmt.Sprintf("no activity registered for %s", v1.StartCartWorkflowName), + "Unimplemented", + nil, + ) + } + + opt := &StartCartWorkflowOptions{} + if len(opts) > 0 && opts[0] != nil { + opt = opts[0] + } + if opt.HeartbeatInterval == 0 { + opt.HeartbeatInterval = time.Second * 30 + } + + // configure activity options + ao := workflow.GetActivityOptions(ctx) + if opt.ActivityOptions != nil { + ao = *opt.ActivityOptions + } + if ao.HeartbeatTimeout == 0 { + ao.HeartbeatTimeout = opt.HeartbeatInterval * 2 + } + // WaitForCancellation must be set otherwise the underlying workflow is not guaranteed to be canceled + ao.WaitForCancellation = true + + if ao.StartToCloseTimeout == 0 && ao.ScheduleToCloseTimeout == 0 { + ao.ScheduleToCloseTimeout = 86400000000000 // 1 day + } + ctx = workflow.WithActivityOptions(ctx, ao) + + // configure start workflow options + wo := client.StartWorkflowOptions{} + if opt.StartWorkflowOptions != nil { + wo = *opt.StartWorkflowOptions + } + if wo.ID == "" { + if err := workflow.SideEffect(ctx, func(ctx workflow.Context) any { + id, err := expression.EvalExpression(v1.StartCartIdexpression, req.ProtoReflect()) + if err != nil { + workflow.GetLogger(ctx).Error("error evaluating id expression for \"cart.v1.CartActor.StartCart\" workflow", "error", err) + return nil + } + return id + }).Get(&wo.ID); err != nil { + return nil, err + } + } + if wo.ID == "" { + if err := workflow.SideEffect(ctx, func(ctx workflow.Context) any { + id, err := uuid.NewRandom() + if err != nil { + workflow.GetLogger(ctx).Error("error generating workflow id", "error", err) + return nil + } + return id + }).Get(&wo.ID); err != nil { + return nil, err + } + } + if wo.ID == "" { + return nil, temporal.NewNonRetryableApplicationError("workflow id is required", "InvalidArgument", nil) + } + + // marshal start workflow options protobuf message + swo, err := xns.MarshalStartWorkflowOptions(wo) + if err != nil { + return nil, fmt.Errorf("error marshalling start workflow options: %w", err) + } + + // marshal workflow request protobuf message + wreq, err := anypb.New(req) + if err != nil { + return nil, fmt.Errorf("error marshalling workflow request: %w", err) + } + + var parentClosePolicy temporalv1.ParentClosePolicy + switch opt.ParentClosePolicy { + case enumsv1.PARENT_CLOSE_POLICY_ABANDON: + parentClosePolicy = temporalv1.ParentClosePolicy_PARENT_CLOSE_POLICY_ABANDON + case enumsv1.PARENT_CLOSE_POLICY_REQUEST_CANCEL: + parentClosePolicy = temporalv1.ParentClosePolicy_PARENT_CLOSE_POLICY_REQUEST_CANCEL + case enumsv1.PARENT_CLOSE_POLICY_TERMINATE: + parentClosePolicy = temporalv1.ParentClosePolicy_PARENT_CLOSE_POLICY_TERMINATE + } + + ctx, cancel := workflow.WithCancel(ctx) + return &startCartRun{ + cancel: cancel, + id: wo.ID, + future: workflow.ExecuteActivity(ctx, activityName, &xnsv1.WorkflowRequest{ + Detached: opt.Detached, + HeartbeatInterval: durationpb.New(opt.HeartbeatInterval), + ParentClosePolicy: parentClosePolicy, + Request: wreq, + StartWorkflowOptions: swo, + }), + }, nil +} + +// CancelCartSignalSignalOptions are used to configure a(n) cart.v1.CartActor.CancelCartSignal signal execution +type CancelCartSignalSignalOptions struct { + ActivityOptions *workflow.ActivityOptions + HeartbeatInterval time.Duration +} + +// NewCancelCartSignalSignalOptions initializes a new CancelCartSignalSignalOptions value +func NewCancelCartSignalSignalOptions() *CancelCartSignalSignalOptions { + return &CancelCartSignalSignalOptions{} +} + +// WithActivityOptions can be used to customize the activity options +func (opts *CancelCartSignalSignalOptions) WithActivityOptions(ao workflow.ActivityOptions) *CancelCartSignalSignalOptions { + opts.ActivityOptions = &ao + return opts +} + +// WithHeartbeatInterval can be used to customize the activity heartbeat interval +func (opts *CancelCartSignalSignalOptions) WithHeartbeatInterval(d time.Duration) *CancelCartSignalSignalOptions { + opts.HeartbeatInterval = d + return opts +} + +// CancelCartSignalSignalHandle provides a handle for a cart.v1.CartActor.CancelCartSignal signal activity +type CancelCartSignalSignalHandle interface { + // Cancel cancels the workflow + Cancel(workflow.Context) error + // Future returns the inner workflow.Future + Future() workflow.Future + // Get returns the inner workflow.Future + Get(workflow.Context) error +} + +// cancelCartSignalSignalHandle provides a(n) CancelCartSignalQueryHandle implementation +type cancelCartSignalSignalHandle struct { + cancel func() + future workflow.Future +} + +// Cancel the underlying signal activity +func (r *cancelCartSignalSignalHandle) Cancel(ctx workflow.Context) error { + r.cancel() + if err := r.Get(ctx); err != nil && !errors.Is(err, workflow.ErrCanceled) { + return err + } + return nil +} + +// Future returns the underlying activity future +func (r *cancelCartSignalSignalHandle) Future() workflow.Future { + return r.future +} + +// Get blocks on activity completion +func (r *cancelCartSignalSignalHandle) Get(ctx workflow.Context) error { + return r.future.Get(ctx, nil) +} + +// CancelCartSignal allows external callers to cancel the cart reservation. +func CancelCartSignal(ctx workflow.Context, workflowID string, runID string, req *v1.CancelCartSignalRequest, opts ...*CancelCartSignalSignalOptions) error { + handle, err := CancelCartSignalAsync(ctx, workflowID, runID, req, opts...) + if err != nil { + return err + } + return handle.Get(ctx) +} + +// CancelCartSignalAsync executes a(n) cart.v1.CartActor.CancelCartSignal signal +func CancelCartSignalAsync(ctx workflow.Context, workflowID string, runID string, req *v1.CancelCartSignalRequest, opts ...*CancelCartSignalSignalOptions) (CancelCartSignalSignalHandle, error) { + activityName := cartActorOptions.filterActivity(v1.CancelCartSignalSignalName) + if activityName == "" { + return nil, temporal.NewNonRetryableApplicationError( + fmt.Sprintf("no activity registered for %s", v1.CancelCartSignalSignalName), + "Unimplemented", + nil, + ) + } + + opt := &CancelCartSignalSignalOptions{} + if len(opts) > 0 && opts[0] != nil { + opt = opts[0] + } + + if opt.HeartbeatInterval == 0 { + opt.HeartbeatInterval = time.Second * 30 + } + + // configure activity options + ao := workflow.GetActivityOptions(ctx) + if opt.ActivityOptions != nil { + ao = *opt.ActivityOptions + } + if ao.HeartbeatTimeout == 0 { + ao.HeartbeatTimeout = opt.HeartbeatInterval * 2 + } + // WaitForCancellation must be set otherwise the underlying workflow is not guaranteed to be canceled + ao.WaitForCancellation = true + + if ao.StartToCloseTimeout == 0 && ao.ScheduleToCloseTimeout == 0 { + ao.ScheduleToCloseTimeout = 60000000000 // 1 minute + } + ctx = workflow.WithActivityOptions(ctx, ao) + + // marshal workflow request + wreq, err := anypb.New(req) + if err != nil { + return nil, fmt.Errorf("error marshalling workflow request: %w", err) + } + + ctx, cancel := workflow.WithCancel(ctx) + return &cancelCartSignalSignalHandle{ + cancel: cancel, + future: workflow.ExecuteActivity(ctx, activityName, &xnsv1.SignalRequest{ + HeartbeatInterval: durationpb.New(opt.HeartbeatInterval), + WorkflowId: workflowID, + RunId: runID, + Request: wreq, + }), + }, nil +} + +// CancelCartActorWorkflow cancels an existing workflow +func CancelCartActorWorkflow(ctx workflow.Context, workflowID string, runID string) error { + return CancelCartActorWorkflowAsync(ctx, workflowID, runID).Get(ctx, nil) +} + +// CancelCartActorWorkflowAsync cancels an existing workflow +func CancelCartActorWorkflowAsync(ctx workflow.Context, workflowID string, runID string) workflow.Future { + activityName := cartActorOptions.filterActivity("cart.v1.CartActor.CancelWorkflow") + if activityName == "" { + f, s := workflow.NewFuture(ctx) + s.SetError(temporal.NewNonRetryableApplicationError( + "no activity registered for cart.v1.CartActor.CancelWorkflow", + "Unimplemented", + nil, + )) + return f + } + ao := workflow.GetActivityOptions(ctx) + if ao.StartToCloseTimeout == 0 && ao.ScheduleToCloseTimeout == 0 { + ao.StartToCloseTimeout = time.Minute + } + ctx = workflow.WithActivityOptions(ctx, ao) + return workflow.ExecuteActivity(ctx, activityName, workflowID, runID) +} + +// cartActorActivities provides activities that can be used to interact with a(n) CartActor service's workflow, queries, signals, and updates across namespaces +type cartActorActivities struct { + client v1.CartActorClient +} + +// CancelWorkflow cancels an existing workflow execution +func (a *cartActorActivities) CancelWorkflow(ctx context.Context, workflowID string, runID string) error { + return a.client.CancelWorkflow(ctx, workflowID, runID) +} + +// StartCart executes a(n) cart.v1.CartActor.StartCart workflow via an activity +func (a *cartActorActivities) StartCart(ctx context.Context, input *xnsv1.WorkflowRequest) (resp *v1.CartResponse, err error) { + // unmarshal workflow request + var req v1.CartRequest + if err := input.Request.UnmarshalTo(&req); err != nil { + return nil, cartActorOptions.convertError(temporal.NewNonRetryableApplicationError( + fmt.Sprintf("error unmarshalling workflow request of type %s as github.com/taltemus/stacked-diff-example/gen/cart/v1.CartRequest", input.Request.GetTypeUrl()), + "InvalidArgument", + err, + )) + } + + // initialize workflow execution + var run v1.StartCartRun + run, err = a.client.StartCartAsync(ctx, &req, v1.NewStartCartOptions().WithStartWorkflowOptions( + xns.UnmarshalStartWorkflowOptions(input.GetStartWorkflowOptions()), + )) + if err != nil { + return nil, cartActorOptions.convertError(err) + } + + // exit early if detached enabled + if input.GetDetached() { + return nil, nil + } + + // otherwise, wait for execution to complete in child goroutine + doneCh := make(chan struct{}) + go func() { + resp, err = run.Get(ctx) + close(doneCh) + }() + + heartbeatInterval := input.GetHeartbeatInterval().AsDuration() + if heartbeatInterval == 0 { + heartbeatInterval = time.Second * 30 + } + + // heartbeat activity while waiting for workflow execution to complete + for { + select { + // send heartbeats periodically + case <-time.After(heartbeatInterval): + activity.RecordHeartbeat(ctx, run.ID()) + + // return retryable error on worker close + case <-activity.GetWorkerStopChannel(ctx): + return nil, temporal.NewApplicationError("worker is stopping", "WorkerStopped") + + // catch parent activity context cancellation. in most cases, this should indicate a + // server-sent cancellation, but there's a non-zero possibility that this cancellation + // is received due to the worker stopping, prior to detecting the closing of the worker + // stop channel. to give us an opportunity to detect a cancellation stemming from the + // worker closing, we again check to see if the worker stop channel is closed before + // propagating the cancellation + case <-ctx.Done(): + select { + case <-activity.GetWorkerStopChannel(ctx): + return nil, temporal.NewApplicationError("worker is stopping", "WorkerStopped") + default: + parentClosePolicy := input.GetParentClosePolicy() + if parentClosePolicy == temporalv1.ParentClosePolicy_PARENT_CLOSE_POLICY_REQUEST_CANCEL || parentClosePolicy == temporalv1.ParentClosePolicy_PARENT_CLOSE_POLICY_TERMINATE { + disconnectedCtx, cancel := context.WithTimeout(context.Background(), time.Minute) + defer cancel() + if parentClosePolicy == temporalv1.ParentClosePolicy_PARENT_CLOSE_POLICY_REQUEST_CANCEL { + err = run.Cancel(disconnectedCtx) + } else { + err = run.Terminate(disconnectedCtx, "xns activity cancellation received", "error", ctx.Err()) + } + if err != nil { + return nil, cartActorOptions.convertError(err) + } + } + return nil, cartActorOptions.convertError(temporal.NewCanceledError(ctx.Err().Error())) + } + + // handle workflow completion + case <-doneCh: + return resp, cartActorOptions.convertError(err) + } + } +} + +// CancelCartSignal executes a(n) cart.v1.CartActor.CancelCartSignal signal via an activity +func (a *cartActorActivities) CancelCartSignal(ctx context.Context, input *xnsv1.SignalRequest) (err error) { + // unmarshal signal request + var req v1.CancelCartSignalRequest + if err := input.Request.UnmarshalTo(&req); err != nil { + return cartActorOptions.convertError(temporal.NewNonRetryableApplicationError( + fmt.Sprintf("error unmarshalling signal request of type %s as github.com/taltemus/stacked-diff-example/gen/cart/v1.CancelCartSignalRequest", input.Request.GetTypeUrl()), + "InvalidArgument", + err, + )) + } + // execute signal in child goroutine + doneCh := make(chan struct{}) + go func() { + err = a.client.CancelCartSignal(ctx, input.GetWorkflowId(), input.GetRunId(), &req) + close(doneCh) + }() + + heartbeatInterval := input.GetHeartbeatInterval().AsDuration() + if heartbeatInterval == 0 { + heartbeatInterval = time.Second * 10 + } + + // heartbeat activity while waiting for signal to complete + for { + select { + case <-time.After(heartbeatInterval): + activity.RecordHeartbeat(ctx) + case <-ctx.Done(): + cartActorOptions.convertError(ctx.Err()) + case <-doneCh: + return cartActorOptions.convertError(err) + } + } +} diff --git a/gen/cart/v1/signal.pb.go b/gen/cart/v1/signal.pb.go new file mode 100644 index 0000000..fbb033b --- /dev/null +++ b/gen/cart/v1/signal.pb.go @@ -0,0 +1,5 @@ +package cartv1 + +import "go.temporal.io/sdk/workflow" + +var CancelCartSignalSignalChannel workflow.Channel diff --git a/go.mod b/go.mod index a75d7aa..aaffb4b 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,72 @@ module github.com/taltemus/stacked-diff-example go 1.24.1 + +require ( + github.com/cludden/protoc-gen-go-temporal v1.16.0 + github.com/google/uuid v1.6.0 + github.com/mitchellh/go-homedir v1.1.0 + github.com/urfave/cli/v2 v2.27.6 + go.temporal.io/api v1.45.0 + go.temporal.io/sdk v1.33.0 + google.golang.org/protobuf v1.36.5 +) + +require ( + github.com/Jeffail/gabs/v2 v2.7.0 // indirect + github.com/OneOfOne/xxhash v1.2.8 // indirect + github.com/PaesslerAG/gval v1.2.2 // indirect + github.com/PaesslerAG/jsonpath v0.1.1 // indirect + github.com/aymerick/douceur v0.2.0 // indirect + github.com/bwmarrin/snowflake v0.3.0 // indirect + github.com/clbanning/mxj/v2 v2.7.0 // indirect + github.com/cludden/benthos/v4 v4.24.0-no-otel.2 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a // indirect + github.com/generikvault/gvalstrings v0.0.0-20180926130504-471f38f0112a // indirect + github.com/go-faker/faker/v4 v4.2.0 // indirect + github.com/gofrs/uuid v4.4.0+incompatible // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/mock v1.7.0-rc.1 // indirect + github.com/gorilla/css v1.0.1 // indirect + github.com/gosimple/slug v1.13.1 // indirect + github.com/gosimple/unidecode v1.0.1 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect + github.com/itchyny/timefmt-go v0.1.5 // indirect + github.com/klauspost/compress v1.17.3 // indirect + github.com/klauspost/pgzip v1.2.6 // indirect + github.com/matoous/go-nanoid/v2 v2.0.0 // indirect + github.com/microcosm-cc/bluemonday v1.0.26 // indirect + github.com/nexus-rpc/sdk-go v0.3.0 // indirect + github.com/oklog/ulid v1.3.1 // indirect + github.com/pborman/uuid v1.2.1 // indirect + github.com/pierrec/lz4/v4 v4.1.18 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/rickb777/date v1.20.5 // indirect + github.com/rickb777/plural v1.4.1 // indirect + github.com/robfig/cron v1.2.0 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/segmentio/ksuid v1.0.4 // indirect + github.com/shopspring/decimal v1.3.1 // indirect + github.com/stretchr/objx v0.5.2 // indirect + github.com/stretchr/testify v1.10.0 // indirect + github.com/tilinna/z85 v1.0.0 // indirect + github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect + github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect + github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect + github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect + github.com/xeipuuv/gojsonschema v1.2.0 // indirect + github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect + golang.org/x/exp v0.0.0-20231127185646-65229373498e // indirect + golang.org/x/net v0.28.0 // indirect + golang.org/x/sync v0.8.0 // indirect + golang.org/x/sys v0.24.0 // indirect + golang.org/x/text v0.17.0 // indirect + golang.org/x/time v0.4.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed // indirect + google.golang.org/grpc v1.66.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..754c2b8 --- /dev/null +++ b/go.sum @@ -0,0 +1,263 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/Jeffail/gabs/v2 v2.7.0 h1:Y2edYaTcE8ZpRsR2AtmPu5xQdFDIthFG0jYhu5PY8kg= +github.com/Jeffail/gabs/v2 v2.7.0/go.mod h1:dp5ocw1FvBBQYssgHsG7I1WYsiLRtkUaB1FEtSwvNUw= +github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= +github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= +github.com/PaesslerAG/gval v0.1.1/go.mod h1:y/nm5yEyTeX6av0OfKJNp9rBNj2XrGhAf5+v24IBN1I= +github.com/PaesslerAG/gval v1.0.0/go.mod h1:y/nm5yEyTeX6av0OfKJNp9rBNj2XrGhAf5+v24IBN1I= +github.com/PaesslerAG/gval v1.2.2 h1:Y7iBzhgE09IGTt5QgGQ2IdaYYYOU134YGHBThD+wm9E= +github.com/PaesslerAG/gval v1.2.2/go.mod h1:XRFLwvmkTEdYziLdaCeCa5ImcGVrfQbeNUbVR+C6xac= +github.com/PaesslerAG/jsonpath v0.1.0/go.mod h1:4BzmtoM/PI8fPO4aQGIusjGxGir2BzcV0grWtFzq1Y8= +github.com/PaesslerAG/jsonpath v0.1.1 h1:c1/AToHQMVsduPAa4Vh6xp2U0evy4t8SWp8imEsylIk= +github.com/PaesslerAG/jsonpath v0.1.1/go.mod h1:lVboNxFGal/VwW6d9JzIy56bUsYAP6tH/x80vjnCseY= +github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= +github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0= +github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME= +github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cludden/benthos/v4 v4.24.0-no-otel.2 h1:u8BWE6O1xfWSITx4nGhexmsl8d3tLuLDBz0Dy+7YEv8= +github.com/cludden/benthos/v4 v4.24.0-no-otel.2/go.mod h1:lbr412TPhtS9tNecnWPNLhmaW7QamZ1MuLS6ulWQ2nU= +github.com/cludden/protoc-gen-go-temporal v1.16.0 h1:+JNl968veKEYIwDK+bA2J2fz8MYNBpXi2vSw0QClb/A= +github.com/cludden/protoc-gen-go-temporal v1.16.0/go.mod h1:LLk7b0TYHFTIwbFC6h7risGex8nOYcpd+lfFj5T3c7w= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc= +github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a h1:yDWHCSQ40h88yih2JAcL6Ls/kVkSE8GFACTGVnMPruw= +github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a/go.mod h1:7Ga40egUymuWXxAe151lTNnCv97MddSOVsjpPPkityA= +github.com/generikvault/gvalstrings v0.0.0-20180926130504-471f38f0112a h1:J8FuFJ7K+Hiwkla2kT9fVIVix+EZhAlDsZwRlfFI3MA= +github.com/generikvault/gvalstrings v0.0.0-20180926130504-471f38f0112a/go.mod h1:ms6iGk40n2YQrbM9Sr6onzwYBD1q5D0T5DQmcaye6uU= +github.com/go-faker/faker/v4 v4.2.0 h1:dGebOupKwssrODV51E0zbMrv5e2gO9VWSLNC1WDCpWg= +github.com/go-faker/faker/v4 v4.2.0/go.mod h1:F/bBy8GH9NxOxMInug5Gx4WYeG6fHJZ8Ol/dhcpRub4= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= +github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.5.0 h1:LUVKkCeviFUMKqHa4tXIIij/lbhnMbP7Fn5wKdKkRh4= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= +github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= +github.com/gosimple/slug v1.13.1 h1:bQ+kpX9Qa6tHRaK+fZR0A0M2Kd7Pa5eHPPsb1JpHD+Q= +github.com/gosimple/slug v1.13.1/go.mod h1:UiRaFH+GEilHstLUmcBgWcI42viBN7mAb818JrYOeFQ= +github.com/gosimple/unidecode v1.0.1 h1:hZzFTMMqSswvf0LBJZCZgThIZrpDHFXux9KeGmn6T/o= +github.com/gosimple/unidecode v1.0.1/go.mod h1:CP0Cr1Y1kogOtx0bJblKzsVWrqYaqfNOnHzpgWw4Awc= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= +github.com/itchyny/timefmt-go v0.1.5 h1:G0INE2la8S6ru/ZI5JecgyzbbJNs5lG1RcBqa7Jm6GE= +github.com/itchyny/timefmt-go v0.1.5/go.mod h1:nEP7L+2YmAbT2kZ2HfSs1d8Xtw9LY8D2stDBckWakZ8= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.17.3 h1:qkRjuerhUU1EmXLYGkSH6EZL+vPSxIrYjLNAK4slzwA= +github.com/klauspost/compress v1.17.3/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= +github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= +github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/matoous/go-nanoid v1.5.0/go.mod h1:zyD2a71IubI24efhpvkJz+ZwfwagzgSO6UNiFsZKN7U= +github.com/matoous/go-nanoid/v2 v2.0.0 h1:d19kur2QuLeHmJBkvYkFdhFBzLoo1XVm2GgTpL+9Tj0= +github.com/matoous/go-nanoid/v2 v2.0.0/go.mod h1:FtS4aGPVfEkxKxhdWPAspZpZSh1cOjtM7Ej/So3hR0g= +github.com/microcosm-cc/bluemonday v1.0.26 h1:xbqSvqzQMeEHCqMi64VAs4d8uy6Mequs3rQ0k/Khz58= +github.com/microcosm-cc/bluemonday v1.0.26/go.mod h1:JyzOCs9gkyQyjs+6h10UEVSe02CGwkhd72Xdqh78TWs= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/nexus-rpc/sdk-go v0.3.0 h1:Y3B0kLYbMhd4C2u00kcYajvmOrfozEtTV/nHSnV57jA= +github.com/nexus-rpc/sdk-go v0.3.0/go.mod h1:TpfkM2Cw0Rlk9drGkoiSMpFqflKTiQLWUNyKJjF8mKQ= +github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= +github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ= +github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rickb777/date v1.20.5 h1:Ybjz7J7ga9ui4VJizQpil0l330r6wkn6CicaoattIxQ= +github.com/rickb777/date v1.20.5/go.mod h1:6BPrm3/aQI0I8jvlD1fAlm/86k5eSeTQ2mR5FEmTnSw= +github.com/rickb777/plural v1.4.1 h1:5MMLcbIaapLFmvDGRT5iPk8877hpTPt8Y9cdSKRw9sU= +github.com/rickb777/plural v1.4.1/go.mod h1:kdmXUpmKBJTS0FtG/TFumd//VBWsNTD7zOw7x4umxNw= +github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ= +github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/segmentio/ksuid v1.0.4 h1:sBo2BdShXjmcugAMwjugoGUdUV0pcxY5mW4xKRn3v4c= +github.com/segmentio/ksuid v1.0.4/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE= +github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= +github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tilinna/z85 v1.0.0 h1:uqFnJBlD01dosSeo5sK1G1YGbPuwqVHqR+12OJDRjUw= +github.com/tilinna/z85 v1.0.0/go.mod h1:EfpFU/DUY4ddEy6CRvk2l+UQNEzHbh+bqBQS+04Nkxs= +github.com/urfave/cli/v2 v2.27.6 h1:VdRdS98FNhKZ8/Az8B7MTyGQmpIr36O1EHybx/LaZ4g= +github.com/urfave/cli/v2 v2.27.6/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ= +github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8= +github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= +github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= +github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4= +github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +go.temporal.io/api v1.45.0 h1:2FZ3eUoOYjavBaQi3/V93MBl99Nq1ifFRjrRwT3MeC8= +go.temporal.io/api v1.45.0/go.mod h1:iaxoP/9OXMJcQkETTECfwYq4cw/bj4nwov8b3ZLVnXM= +go.temporal.io/sdk v1.33.0 h1:T91UzeRdlHTiMGgpygsItOH9+VSkg+M/mG85PqNjdog= +go.temporal.io/sdk v1.33.0/go.mod h1:WwCmJZLy7zabz3ar5NRAQEygsdP8tgR9sDjISSHuWZw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20231127185646-65229373498e h1:Gvh4YaCaXNs6dKTlfgismwWZKyjVZXwOPfIyUaqU3No= +golang.org/x/exp v0.0.0-20231127185646-65229373498e/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= +golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= +golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= +golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/time v0.4.0 h1:Z81tqI5ddIoXDPvVQ7/7CC9TnLM7ubaFG2qXYd5BbYY= +golang.org/x/time v0.4.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed h1:3RgNmBoI9MZhsj3QxC+AP/qQhNwpCLOvYDYYsFrhFt0= +google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed h1:J6izYgfBXAI3xTKLgxzTmUltdYaLsuBxFCgDHWJ/eXg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.66.0 h1:DibZuoBznOxbDQxRINckZcUvnCEvrW9pcWIE2yF9r1c= +google.golang.org/grpc v1.66.0/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= +google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= +google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/proto/README.md b/proto/README.md new file mode 100644 index 0000000..3334245 --- /dev/null +++ b/proto/README.md @@ -0,0 +1,488 @@ +# Table of Contents + +- [cart.v1](#cart-v1) + - Services + - [cart.v1.CartActor](#cart-v1-cartactor) + - [Workflows](#cart-v1-cartactor-workflows) + - [cart.v1.CartActor.StartCart](#cart-v1-cartactor-startcart-workflow) + - [Signals](#cart-v1-cartactor-signals) + - [cart.v1.CartActor.CancelCartSignal](#cart-v1-cartactor-cancelcartsignal-signal) + - [Activities](#cart-v1-cartactor-activities) + - [cart.v1.CartActor.ReserveTicketsActivity](#cart-v1-cartactor-reserveticketsactivity-activity) + - [cart.v1.CartActor.RemoveTicketsActivity](#cart-v1-cartactor-removeticketsactivity-activity) + - [cart.v1.CartActor.CheckoutCartActivity](#cart-v1-cartactor-checkoutcartactivity-activity) + - Messages + - [cart.v1.CancelCartSignalRequest](#cart-v1-cancelcartsignalrequest) + - [cart.v1.CartRequest](#cart-v1-cartrequest) + - [cart.v1.CartResponse](#cart-v1-cartresponse) + - [cart.v1.CheckoutCartInput](#cart-v1-checkoutcartinput) + - [cart.v1.CheckoutCartOutput](#cart-v1-checkoutcartoutput) + - [cart.v1.RemoveTicketsInput](#cart-v1-removeticketsinput) + - [cart.v1.RemoveTicketsOutput](#cart-v1-removeticketsoutput) + - [cart.v1.ReserveTicketsInput](#cart-v1-reserveticketsinput) + - [cart.v1.ReserveTicketsOutput](#cart-v1-reserveticketsoutput) + + +# cart.v1 + + +## Services + + +## cart.v1.CartActor + +
+The CartActor defines the actor-style cart workflow, its activities, and signal.
+
+ + +### Workflows + +--- + +### cart.v1.CartActor.StartCart + +
+Starts the shopping cart workflow.
+
+ +**Input:** [cart.v1.CartRequest](#cart-v1-cartrequest) + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
cart_idstring
+json_name: cartId
+go_name: CartId
customer_idstring
+json_name: customerId
+go_name: CustomerId
ticket_idsstring
+Comma-separated ticket IDs.
+ +json_name: ticketIds +go_name: TicketIds
+ +**Output:** [cart.v1.CartResponse](#cart-v1-cartresponse) + + + + + + + + + + + + +
AttributeTypeDescription
confirmationstring
+json_name: confirmation
+go_name: Confirmation
+ +**Defaults:** + + + + + +
NameValue
id
cart/${! uuid_v4() }
id_reuse_policy
WORKFLOW_ID_REUSE_POLICY_UNSPECIFIED
+ + +### Signals + +--- + +### cart.v1.CartActor.CancelCartSignal + +
+CancelCartSignal allows external callers to cancel the cart reservation.
+
+ +**Input:** [cart.v1.CancelCartSignalRequest](#cart-v1-cancelcartsignalrequest) + + + + + + + + + + + + + + + + +
AttributeTypeDescription
cart_idstring
+json_name: cartId
+go_name: CartId
reasonstring
+json_name: reason
+go_name: Reason
+ + +### Activities + +--- + +### cart.v1.CartActor.ReserveTicketsActivity + +
+ReserveTickets is an activity that reserves tickets.
+
+ +**Input:** [cart.v1.ReserveTicketsInput](#cart-v1-reserveticketsinput) + + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
cart_idstring
+json_name: cartId
+go_name: CartId
reservation_duration_secondsint32
+json_name: reservationDurationSeconds
+go_name: ReservationDurationSeconds
ticket_idsstring
+json_name: ticketIds
+go_name: TicketIds
+ +**Output:** [cart.v1.ReserveTicketsOutput](#cart-v1-reserveticketsoutput) + + + + + + + + + + + + +
AttributeTypeDescription
statusstring
+json_name: status
+go_name: Status
+ +**Defaults:** + + + + + +
NameValue
retry_policy.max_attempts3
start_to_close_timeout30 seconds
+ +--- + +### cart.v1.CartActor.RemoveTicketsActivity + +
+RemoveTickets is an activity that removes tickets from the cart after a timeout.
+
+ +**Input:** [cart.v1.RemoveTicketsInput](#cart-v1-removeticketsinput) + + + + + + + + + + + + + + + + +
AttributeTypeDescription
cart_idstring
+json_name: cartId
+go_name: CartId
ticket_idsstring
+json_name: ticketIds
+go_name: TicketIds
+ +**Output:** [cart.v1.RemoveTicketsOutput](#cart-v1-removeticketsoutput) + + + + + + + + + + + + +
AttributeTypeDescription
statusstring
+json_name: status
+go_name: Status
+ +**Defaults:** + + + + + +
NameValue
retry_policy.max_attempts3
start_to_close_timeout30 seconds
+ +--- + +### cart.v1.CartActor.CheckoutCartActivity + +
+CheckoutCartActivity is an activity that removes tickets from the cart after a timeout.
+
+ +**Input:** [cart.v1.CheckoutCartInput](#cart-v1-checkoutcartinput) + + + +**Output:** [cart.v1.CheckoutCartOutput](#cart-v1-checkoutcartoutput) + + + +**Defaults:** + + + + + +
NameValue
retry_policy.max_attempts3
start_to_close_timeout30 seconds
+ + +## Messages + + +### cart.v1.CancelCartSignalRequest + +
+Signal to cancel the cart.
+
+ + + + + + + + + + + + + + + + +
AttributeTypeDescription
cart_idstring
+json_name: cartId
+go_name: CartId
reasonstring
+json_name: reason
+go_name: Reason
+ + + + +### cart.v1.CartRequest + +
+Message definitions.
+
+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
cart_idstring
+json_name: cartId
+go_name: CartId
customer_idstring
+json_name: customerId
+go_name: CustomerId
ticket_idsstring
+Comma-separated ticket IDs.
+ +json_name: ticketIds +go_name: TicketIds
+ + + + +### cart.v1.CartResponse + + + + + + + + + + + + +
AttributeTypeDescription
confirmationstring
+json_name: confirmation
+go_name: Confirmation
+ + + + +### cart.v1.CheckoutCartInput + + + + +### cart.v1.CheckoutCartOutput + + + + +### cart.v1.RemoveTicketsInput + +
+RemoveTickets messages.
+
+ + + + + + + + + + + + + + + + +
AttributeTypeDescription
cart_idstring
+json_name: cartId
+go_name: CartId
ticket_idsstring
+json_name: ticketIds
+go_name: TicketIds
+ + + + +### cart.v1.RemoveTicketsOutput + + + + + + + + + + + + +
AttributeTypeDescription
statusstring
+json_name: status
+go_name: Status
+ + + + +### cart.v1.ReserveTicketsInput + +
+ReserveTickets messages.
+
+ + + + + + + + + + + + + + + + + + + + +
AttributeTypeDescription
cart_idstring
+json_name: cartId
+go_name: CartId
reservation_duration_secondsint32
+json_name: reservationDurationSeconds
+go_name: ReservationDurationSeconds
ticket_idsstring
+json_name: ticketIds
+go_name: TicketIds
+ + + + +### cart.v1.ReserveTicketsOutput + + + + + + + + + + + + +
AttributeTypeDescription
statusstring
+json_name: status
+go_name: Status
+ diff --git a/proto/cart/v1/cart_actor.proto b/proto/cart/v1/cart_actor.proto new file mode 100644 index 0000000..5143d99 --- /dev/null +++ b/proto/cart/v1/cart_actor.proto @@ -0,0 +1,88 @@ +syntax = "proto3"; + +package cart.v1; + +import "google/protobuf/empty.proto"; +import "temporal/v1/temporal.proto"; + +option go_package = "github.com/taltemus/stacked-diff-example/generated/cart/v1;cartv1"; + +// The CartActor defines the actor-style cart workflow, its activities, and signal. +service CartActor { + // Starts the shopping cart workflow. + rpc StartCart(CartRequest) returns (CartResponse) { + option (temporal.v1.workflow) = {id: "cart/${! uuid_v4() }"}; + } + + // ReserveTickets is an activity that reserves tickets. + rpc ReserveTicketsActivity(ReserveTicketsInput) returns (ReserveTicketsOutput) { + option (temporal.v1.activity) = { + start_to_close_timeout: {seconds: 30} + retry_policy: {max_attempts: 3} + }; + } + + // RemoveTickets is an activity that removes tickets from the cart after a timeout. + rpc RemoveTicketsActivity(RemoveTicketsInput) returns (RemoveTicketsOutput) { + option (temporal.v1.activity) = { + start_to_close_timeout: {seconds: 30} + retry_policy: {max_attempts: 3} + }; + } + + // CheckoutCartActivity is an activity that removes tickets from the cart after a timeout. + rpc CheckoutCartActivity(CheckoutCartInput) returns (CheckoutCartOutput) { + option (temporal.v1.activity) = { + start_to_close_timeout: {seconds: 30} + retry_policy: {max_attempts: 3} + }; + } + + // CancelCartSignal allows external callers to cancel the cart reservation. + rpc CancelCartSignal(CancelCartSignalRequest) returns (google.protobuf.Empty) { + option (temporal.v1.signal) = {}; + } +} + +// Message definitions. +message CartRequest { + string cart_id = 1; + string customer_id = 2; + // Comma-separated ticket IDs. + string ticket_ids = 3; +} + +message CartResponse { + string confirmation = 1; +} + +// ReserveTickets messages. +message ReserveTicketsInput { + string cart_id = 1; + repeated string ticket_ids = 2; + int32 reservation_duration_seconds = 3; +} + +message ReserveTicketsOutput { + string status = 1; +} + +// RemoveTickets messages. +message RemoveTicketsInput { + string cart_id = 1; + repeated string ticket_ids = 2; +} + +message RemoveTicketsOutput { + string status = 1; +} + +// Signal to cancel the cart. +message CancelCartSignalRequest { + string cart_id = 1; + string reason = 2; +} + +message CheckoutCartInput {} + +message CheckoutCartOutput {} diff --git a/workflow/cart/v1/remove_tickets_activity.go b/workflow/cart/v1/remove_tickets_activity.go new file mode 100644 index 0000000..7d89509 --- /dev/null +++ b/workflow/cart/v1/remove_tickets_activity.go @@ -0,0 +1,11 @@ +package workflow + +import ( + "context" + + cartv1 "github.com/taltemus/stacked-diff-example/gen/cart/v1" +) + +func (w *CartWorkflow) RemoveTicketsActivity(ctx context.Context, input *cartv1.RemoveTicketsInput) (*cartv1.RemoveTicketsOutput, error) { + panic("not implemented") +} diff --git a/workflow/cart/v1/reserve_tickets_activity.go b/workflow/cart/v1/reserve_tickets_activity.go new file mode 100644 index 0000000..ba86cf0 --- /dev/null +++ b/workflow/cart/v1/reserve_tickets_activity.go @@ -0,0 +1,11 @@ +package workflow + +import ( + "context" + + cartv1 "github.com/taltemus/stacked-diff-example/gen/cart/v1" +) + +func (w *CartWorkflow) ReserveTicketsActivity(ctx context.Context, input *cartv1.ReserveTicketsInput) (*cartv1.ReserveTicketsOutput, error) { + panic("not implemented") +} diff --git a/workflow/cart/v1/workflow.go b/workflow/cart/v1/workflow.go new file mode 100644 index 0000000..4003654 --- /dev/null +++ b/workflow/cart/v1/workflow.go @@ -0,0 +1,22 @@ +package workflow + +import ( + cartv1 "github.com/taltemus/stacked-diff-example/gen/cart/v1" + "go.temporal.io/sdk/workflow" +) + +type CartWorkflowReq struct { + Request *cartv1.CartRequest + Response *cartv1.CartResponse +} + +// CartWorkflowImpl implements the shopping cart workflow. +type CartWorkflow struct { + *CartWorkflowReq + cancelled bool +} + +// Run executes the workflow. +func (w *CartWorkflow) Run(ctx workflow.Context) { + panic("not implemented") +}