github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/tiltfile/value/image.go (about) 1 package value 2 3 import ( 4 "fmt" 5 6 "github.com/distribution/reference" 7 "go.starlark.net/starlark" 8 ) 9 10 type ImageList []reference.Named 11 12 var _ starlark.Unpacker = &ImageList{} 13 14 // Unpack an argument that can be expressed as a list or tuple of image references. 15 func (s *ImageList) Unpack(v starlark.Value) error { 16 *s = nil 17 if v == nil { 18 return nil 19 } 20 21 var iter starlark.Iterator 22 switch x := v.(type) { 23 case *starlark.List: 24 iter = x.Iterate() 25 case starlark.Tuple: 26 iter = x.Iterate() 27 case starlark.NoneType: 28 return nil 29 default: 30 return fmt.Errorf("value should be a List or Tuple of strings, but is of type %s", v.Type()) 31 } 32 33 defer iter.Done() 34 var item starlark.Value 35 for iter.Next(&item) { 36 sv, ok := AsString(item) 37 if !ok { 38 return fmt.Errorf("value should contain only strings, but element %q was of type %s", item.String(), item.Type()) 39 } 40 ref, err := reference.ParseNormalizedNamed(sv) 41 if err != nil { 42 return fmt.Errorf("must be a valid image reference: %v", err) 43 } 44 *s = append(*s, ref) 45 } 46 47 return nil 48 }