bldy.build/build@v0.0.0-20181002085557-d04b29acc6a7/skylark/outputs.go (about) 1 package skylark 2 3 import ( 4 "github.com/google/skylark" 5 "github.com/google/skylark/skylarkstruct" 6 "github.com/pkg/errors" 7 ) 8 9 // inconsistent behaviour described here 10 // https://docs.bazel.build/versions/master/skylark/rules.html#files 11 // https://docs.bazel.build/versions/master/skylark/lib/ctx.html#outputs 12 func processOutputs(ctx *context, ruleAttrs *skylark.Dict, ruleOutputs *skylark.Dict) ([]string, error) { 13 outputs := []string{} 14 if ruleOutputs != nil && len(ruleOutputs.Keys()) > 0 { 15 outs := skylark.StringDict{} 16 for _, tup := range ruleOutputs.Items() { 17 if formatted, err := format(tup[1].(skylark.String), ctx.Attrs()); err == nil { 18 outputs = append(outputs, formatted) 19 if name, ok := skylark.AsString(tup[0]); ok { 20 _ = name 21 outs[name] = output(formatted) 22 } 23 } 24 } 25 ctx.outputs = skylarkstruct.FromStringDict(skylarkstruct.Default, outs) 26 return outputs, nil 27 } 28 return outputs, nil 29 } 30 31 type output string 32 33 func (f output) String() string { return string(f) } 34 func (f output) Type() string { return "file" } 35 func (f output) Freeze() {} 36 func (f output) Truth() skylark.Bool { return true } 37 func (f output) Hash() (uint32, error) { return hashString(string(f)), nil } 38 39 func (f output) Attr(name string) (skylark.Value, error) { 40 switch name { 41 case "path": 42 return skylark.String(string(f)), nil 43 default: 44 return nil, errors.New("not implemented") 45 } 46 } 47 48 func (f output) AttrNames() []string { 49 panic("not implemented") 50 }