github.com/mavryk-network/mvgo@v1.19.9/internal/compose/alpha/task/batch.go (about) 1 // Copyright (c) 2023 Blockwatch Data Inc. 2 // Author: alex@blockwatch.cc, abdul@blockwatch.cc 3 4 package task 5 6 import ( 7 "fmt" 8 9 "github.com/mavryk-network/mvgo/codec" 10 "github.com/mavryk-network/mvgo/internal/compose" 11 "github.com/mavryk-network/mvgo/internal/compose/alpha" 12 "github.com/mavryk-network/mvgo/rpc" 13 "github.com/mavryk-network/mvgo/signer" 14 15 "github.com/pkg/errors" 16 ) 17 18 var _ alpha.TaskBuilder = (*BatchTask)(nil) 19 20 func init() { 21 alpha.RegisterTask("batch", NewBatchTask) 22 } 23 24 type BatchTask struct { 25 BaseTask 26 } 27 28 func NewBatchTask() alpha.TaskBuilder { 29 return &BatchTask{} 30 } 31 32 func (t *BatchTask) Type() string { 33 return "batch" 34 } 35 36 func (t *BatchTask) Build(ctx compose.Context, task alpha.Task) (*codec.Op, *rpc.CallOptions, error) { 37 if err := t.parse(ctx, task); err != nil { 38 return nil, nil, errors.Wrap(err, "parse") 39 } 40 opts := rpc.NewCallOptions() 41 opts.Signer = signer.NewFromKey(t.Key) 42 op := codec.NewOp().WithSource(t.Source) 43 for i, ct := range task.Contents { 44 // use common source 45 ct.Source = task.Source 46 childTask, err := alpha.NewTask(ct.Type) 47 if err != nil { 48 return nil, nil, fmt.Errorf("batch[%d]: %v", i, err) 49 } 50 childOp, _, err := childTask.Build(ctx, ct) 51 if err != nil { 52 return nil, nil, fmt.Errorf("batch[%d]: %v", i, err) 53 } 54 for _, o := range childOp.Contents { 55 op.WithContents(o) 56 } 57 } 58 return op, opts, nil 59 } 60 61 func (t *BatchTask) Validate(ctx compose.Context, task alpha.Task) error { 62 return t.parse(ctx, task) 63 } 64 65 func (t *BatchTask) parse(ctx compose.Context, task alpha.Task) (err error) { 66 if err = t.BaseTask.parse(ctx, task); err != nil { 67 return err 68 } 69 return 70 }