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  }