bldy.build/build@v0.0.0-20181002085557-d04b29acc6a7/skylark/action.go (about)

     1  package skylark
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"bldy.build/build/executor"
     7  	"github.com/google/skylark"
     8  	"github.com/pkg/errors"
     9  )
    10  
    11  // BldyFunc represents a callable SkylarkFunc that will run by bldy
    12  type BldyFunc func(thread *skylark.Thread, args skylark.Tuple, kwargs []skylark.Tuple) (skylark.Value, error)
    13  
    14  type action struct {
    15  	name           string
    16  	a              BldyFunc
    17  	actionRecorder *actionRecorder
    18  }
    19  
    20  func (a *action) Name() string          { return a.name }
    21  func (a *action) Freeze()               {}
    22  func (a *action) Truth() skylark.Bool   { return true }
    23  func (a *action) String() string        { return fmt.Sprintf("action.%s", a.name) }
    24  func (a *action) Type() string          { return fmt.Sprintf("actions.%s", a.name) }
    25  func (a *action) Hash() (uint32, error) { return hashString(a.name), nil }
    26  
    27  func (a *action) Call(thread *skylark.Thread, args skylark.Tuple, kwargs []skylark.Tuple) (skylark.Value, error) {
    28  
    29  	var i executor.Action
    30  	switch a.name {
    31  	case "run":
    32  		i = &run{}
    33  	case "do_nothing":
    34  		i = &doNothing{}
    35  	}
    36  	if err := unpackStruct(i, kwargs); err != nil {
    37  		return skylark.None, errors.Wrap(err, "action.call")
    38  	}
    39  	a.actionRecorder.Record(i)
    40  	return skylark.None, nil
    41  }
    42  
    43  type actionRecorder struct{ calls []executor.Action }
    44  
    45  func (ar *actionRecorder) Record(a executor.Action) {
    46  	ar.calls = append(ar.calls, a)
    47  }
    48  
    49  // newAction retunrs a new action that will be called during building
    50  func newAction(name string, ac *actionRecorder) *action {
    51  	return &action{
    52  		name:           name,
    53  		actionRecorder: ac,
    54  	}
    55  }