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)
+
+
+
+| Attribute |
+Type |
+Description |
+
+
+| cart_id |
+string |
+
+json_name: cartId
+go_name: CartId |
+
+| customer_id |
+string |
+
+json_name: customerId
+go_name: CustomerId |
+
+| ticket_ids |
+string |
+
+Comma-separated ticket IDs.
+
+json_name: ticketIds
+go_name: TicketIds |
+
+
+
+**Output:** [cart.v1.CartResponse](#cart-v1-cartresponse)
+
+
+
+| Attribute |
+Type |
+Description |
+
+
+| confirmation |
+string |
+
+json_name: confirmation
+go_name: Confirmation |
+
+
+
+**Defaults:**
+
+
+| Name | Value |
+| 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)
+
+
+
+| Attribute |
+Type |
+Description |
+
+
+| cart_id |
+string |
+
+json_name: cartId
+go_name: CartId |
+
+| reason |
+string |
+
+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)
+
+
+
+| Attribute |
+Type |
+Description |
+
+
+| cart_id |
+string |
+
+json_name: cartId
+go_name: CartId |
+
+| reservation_duration_seconds |
+int32 |
+
+json_name: reservationDurationSeconds
+go_name: ReservationDurationSeconds |
+
+| ticket_ids |
+string |
+
+json_name: ticketIds
+go_name: TicketIds |
+
+
+
+**Output:** [cart.v1.ReserveTicketsOutput](#cart-v1-reserveticketsoutput)
+
+
+
+| Attribute |
+Type |
+Description |
+
+
+| status |
+string |
+
+json_name: status
+go_name: Status |
+
+
+
+**Defaults:**
+
+
+| Name | Value |
+| retry_policy.max_attempts | 3 |
+| start_to_close_timeout | 30 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)
+
+
+
+| Attribute |
+Type |
+Description |
+
+
+| cart_id |
+string |
+
+json_name: cartId
+go_name: CartId |
+
+| ticket_ids |
+string |
+
+json_name: ticketIds
+go_name: TicketIds |
+
+
+
+**Output:** [cart.v1.RemoveTicketsOutput](#cart-v1-removeticketsoutput)
+
+
+
+| Attribute |
+Type |
+Description |
+
+
+| status |
+string |
+
+json_name: status
+go_name: Status |
+
+
+
+**Defaults:**
+
+
+| Name | Value |
+| retry_policy.max_attempts | 3 |
+| start_to_close_timeout | 30 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:**
+
+
+| Name | Value |
+| retry_policy.max_attempts | 3 |
+| start_to_close_timeout | 30 seconds |
+
+
+
+## Messages
+
+
+### cart.v1.CancelCartSignalRequest
+
+
+Signal to cancel the cart.
+
+
+
+
+| Attribute |
+Type |
+Description |
+
+
+| cart_id |
+string |
+
+json_name: cartId
+go_name: CartId |
+
+| reason |
+string |
+
+json_name: reason
+go_name: Reason |
+
+
+
+
+
+
+### cart.v1.CartRequest
+
+
+Message definitions.
+
+
+
+
+| Attribute |
+Type |
+Description |
+
+
+| cart_id |
+string |
+
+json_name: cartId
+go_name: CartId |
+
+| customer_id |
+string |
+
+json_name: customerId
+go_name: CustomerId |
+
+| ticket_ids |
+string |
+
+Comma-separated ticket IDs.
+
+json_name: ticketIds
+go_name: TicketIds |
+
+
+
+
+
+
+### cart.v1.CartResponse
+
+
+
+| Attribute |
+Type |
+Description |
+
+
+| confirmation |
+string |
+
+json_name: confirmation
+go_name: Confirmation |
+
+
+
+
+
+
+### cart.v1.CheckoutCartInput
+
+
+
+
+### cart.v1.CheckoutCartOutput
+
+
+
+
+### cart.v1.RemoveTicketsInput
+
+
+RemoveTickets messages.
+
+
+
+
+| Attribute |
+Type |
+Description |
+
+
+| cart_id |
+string |
+
+json_name: cartId
+go_name: CartId |
+
+| ticket_ids |
+string |
+
+json_name: ticketIds
+go_name: TicketIds |
+
+
+
+
+
+
+### cart.v1.RemoveTicketsOutput
+
+
+
+| Attribute |
+Type |
+Description |
+
+
+| status |
+string |
+
+json_name: status
+go_name: Status |
+
+
+
+
+
+
+### cart.v1.ReserveTicketsInput
+
+
+ReserveTickets messages.
+
+
+
+
+| Attribute |
+Type |
+Description |
+
+
+| cart_id |
+string |
+
+json_name: cartId
+go_name: CartId |
+
+| reservation_duration_seconds |
+int32 |
+
+json_name: reservationDurationSeconds
+go_name: ReservationDurationSeconds |
+
+| ticket_ids |
+string |
+
+json_name: ticketIds
+go_name: TicketIds |
+
+
+
+
+
+
+### cart.v1.ReserveTicketsOutput
+
+
+
+| Attribute |
+Type |
+Description |
+
+
+| status |
+string |
+
+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")
+}