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 }