File tree Expand file tree Collapse file tree 2 files changed +62
-0
lines changed Expand file tree Collapse file tree 2 files changed +62
-0
lines changed Original file line number Diff line number Diff line change @@ -34,6 +34,14 @@ func (e *ErrInvalidWorkflow) Error() string {
34
34
return e .msg
35
35
}
36
36
37
+ type ErrInvalidActivity struct {
38
+ msg string
39
+ }
40
+
41
+ func (e * ErrInvalidActivity ) Error () string {
42
+ return e .msg
43
+ }
44
+
37
45
func (r * Registry ) RegisterWorkflow (workflow Workflow ) error {
38
46
r .Lock ()
39
47
defer r .Unlock ()
@@ -83,6 +91,10 @@ func (r *Registry) RegisterActivity(activity interface{}) error {
83
91
}
84
92
85
93
// Activity as function
94
+ if err := checkActivity (reflect .TypeOf (activity )); err != nil {
95
+ return err
96
+ }
97
+
86
98
name := fn .Name (activity )
87
99
r .activityMap [name ] = activity
88
100
@@ -102,13 +114,34 @@ func (r *Registry) registerActivitiesFromStruct(a interface{}) error {
102
114
continue
103
115
}
104
116
117
+ if err := checkActivity (mt .Type ); err != nil {
118
+ return err
119
+ }
120
+
105
121
name := mt .Name
106
122
r .activityMap [name ] = mv .Interface ()
107
123
}
108
124
109
125
return nil
110
126
}
111
127
128
+ func checkActivity (actType reflect.Type ) error {
129
+ if actType .Kind () != reflect .Func {
130
+ return & ErrInvalidActivity {"activity not a func" }
131
+ }
132
+
133
+ if actType .NumOut () == 0 {
134
+ return & ErrInvalidActivity {"activity must return error" }
135
+ }
136
+
137
+ errType := reflect .TypeOf ((* error )(nil )).Elem ()
138
+ if ! actType .Out (actType .NumOut () - 1 ).Implements (errType ) {
139
+ return & ErrInvalidWorkflow {"activity must return error as last return value" }
140
+ }
141
+
142
+ return nil
143
+ }
144
+
112
145
func (r * Registry ) GetWorkflow (name string ) (Workflow , error ) {
113
146
r .Lock ()
114
147
defer r .Unlock ()
Original file line number Diff line number Diff line change @@ -110,6 +110,17 @@ func Test_ActivityRegistration(t *testing.T) {
110
110
require .NoError (t , err )
111
111
}
112
112
113
+ func reg_activity_invalid (ctx context.Context ) {
114
+ }
115
+
116
+ func Test_ActivityRegistration_Invalid (t * testing.T ) {
117
+ r := NewRegistry ()
118
+ require .NotNil (t , r )
119
+
120
+ err := r .RegisterActivity (reg_activity_invalid )
121
+ require .Error (t , err )
122
+ }
123
+
113
124
type reg_activities struct {
114
125
SomeValue string
115
126
}
@@ -149,3 +160,21 @@ func Test_ActivityRegistrationOnStruct(t *testing.T) {
149
160
require .NoError (t , err )
150
161
require .Equal (t , "test" , v )
151
162
}
163
+
164
+ type reg_invalid_activities struct {
165
+ SomeValue string
166
+ }
167
+
168
+ func (r * reg_invalid_activities ) Activity1 (ctx context.Context ) {
169
+ }
170
+
171
+ func Test_ActivityRegistrationOnStruct_Invalid (t * testing.T ) {
172
+ r := NewRegistry ()
173
+ require .NotNil (t , r )
174
+
175
+ a := & reg_invalid_activities {
176
+ SomeValue : "test" ,
177
+ }
178
+ err := r .RegisterActivity (a )
179
+ require .Error (t , err )
180
+ }
You can’t perform that action at this time.
0 commit comments