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  }