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  }