@@ -8,15 +8,21 @@ import (
88 "sync"
99 "time"
1010
11+ "github.com/google/uuid"
1112 "github.com/siherrmann/queuer/helper"
1213 "github.com/siherrmann/queuer/model"
1314 vh "github.com/siherrmann/validator/helper"
1415)
1516
17+ type ContextKey string
18+
19+ const JobRIDContextKey ContextKey = "JobRIDContextKey"
20+
1621type Runner struct {
1722 cancel context.CancelFunc
1823 cancelMu sync.RWMutex
1924 Options * model.Options
25+ JobRID * uuid.UUID
2026 Task interface {}
2127 Parameters model.Parameters
2228 // Result channel to return results
@@ -31,14 +37,22 @@ func NewRunner(options *model.Options, task interface{}, parameters ...interface
3137 taskInputParameters , err := helper .GetInputParametersFromTask (task )
3238 if err != nil {
3339 return nil , helper .NewError ("getting task input parameters" , err )
34- } else if len (taskInputParameters ) != len (parameters ) {
35- return nil , fmt .Errorf ("task expects %d parameters, got %d" , len (taskInputParameters ), len (parameters ))
40+ }
41+
42+ startIndex := 0
43+ contextType := reflect .TypeOf ((* context .Context )(nil )).Elem ()
44+ if len (taskInputParameters ) > 0 && taskInputParameters [0 ] == contextType {
45+ startIndex = 1
46+ }
47+
48+ if len (taskInputParameters )- startIndex != len (parameters ) {
49+ return nil , fmt .Errorf ("task expects %d parameters, got %d" , len (taskInputParameters )- startIndex , len (parameters ))
3650 }
3751
3852 for i , param := range parameters {
39- paramConverted , err := vh .AnyToType (param , taskInputParameters [i ])
53+ paramConverted , err := vh .AnyToType (param , taskInputParameters [i + startIndex ])
4054 if err != nil {
41- return nil , fmt .Errorf ("error converting parameter %d to type %s: %v" , i , taskInputParameters [i ].Kind (), err )
55+ return nil , fmt .Errorf ("error converting parameter %d to type %s: %v" , i , taskInputParameters [i + startIndex ].Kind (), err )
4256 }
4357 parameters [i ] = paramConverted
4458 }
@@ -73,6 +87,7 @@ func NewRunnerFromJob(task *model.Task, job *model.Job) (*Runner, error) {
7387 return nil , fmt .Errorf ("error creating runner from job: %v" , err )
7488 }
7589
90+ runner .JobRID = & job .RID
7691 return runner , nil
7792}
7893
@@ -111,7 +126,21 @@ func (r *Runner) Run(ctx context.Context) {
111126 }()
112127
113128 taskFunc := reflect .ValueOf (r .Task )
114- results := taskFunc .Call (r .Parameters .ToReflectValues ())
129+
130+ var callParameters []reflect.Value
131+ taskType := reflect .TypeOf (r .Task )
132+ contextType := reflect .TypeOf ((* context .Context )(nil )).Elem ()
133+
134+ if taskType .NumIn () > 0 && taskType .In (0 ) == contextType {
135+ jobCtx := ctx
136+ if r .JobRID != nil {
137+ jobCtx = context .WithValue (ctx , JobRIDContextKey , * r .JobRID )
138+ }
139+ callParameters = append (callParameters , reflect .ValueOf (jobCtx ))
140+ }
141+
142+ callParameters = append (callParameters , r .Parameters .ToReflectValues ()... )
143+ results := taskFunc .Call (callParameters )
115144 resultValues := []interface {}{}
116145 for _ , result := range results {
117146 resultValues = append (resultValues , result .Interface ())
@@ -125,7 +154,8 @@ func (r *Runner) Run(ctx context.Context) {
125154
126155 var ok bool
127156 if len (resultValues ) > 0 {
128- if err , ok = resultValues [len (resultValues )- 1 ].(error ); ok || (outputParameters [1 ].String () == "error" && resultValues [len (resultValues )- 1 ] == nil ) {
157+ lastOutIdx := len (outputParameters ) - 1
158+ if err , ok = resultValues [len (resultValues )- 1 ].(error ); ok || (lastOutIdx >= 0 && outputParameters [lastOutIdx ].String () == "error" && resultValues [len (resultValues )- 1 ] == nil ) {
129159 resultValues = resultValues [:len (resultValues )- 1 ]
130160 }
131161 }
0 commit comments