github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/tiltfile/value/path.go (about)

     1  package value
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"go.starlark.net/starlark"
     7  )
     8  
     9  type LocalPath struct {
    10  	t     *starlark.Thread
    11  	Value string
    12  	IsSet bool
    13  }
    14  
    15  func NewLocalPathUnpacker(t *starlark.Thread) LocalPath {
    16  	return LocalPath{
    17  		t: t,
    18  	}
    19  }
    20  
    21  func (p *LocalPath) Unpack(v starlark.Value) error {
    22  	str, err := ValueToAbsPath(p.t, v)
    23  	if err != nil {
    24  		return err
    25  	}
    26  
    27  	p.Value = str
    28  	p.IsSet = true
    29  	return nil
    30  }
    31  
    32  type LocalPathList struct {
    33  	t     *starlark.Thread
    34  	Value []string
    35  }
    36  
    37  func NewLocalPathListUnpacker(t *starlark.Thread) LocalPathList {
    38  	return LocalPathList{
    39  		t: t,
    40  	}
    41  }
    42  
    43  func (p *LocalPathList) Unpack(v starlark.Value) error {
    44  	_, ok := AsString(v)
    45  	if ok {
    46  		str, err := ValueToAbsPath(p.t, v)
    47  		if err != nil {
    48  			return err
    49  		}
    50  		p.Value = []string{str}
    51  		return nil
    52  	}
    53  
    54  	var iter starlark.Iterator
    55  	switch x := v.(type) {
    56  	case *starlark.List:
    57  		iter = x.Iterate()
    58  	case starlark.Tuple:
    59  		iter = x.Iterate()
    60  	case starlark.NoneType:
    61  		return nil
    62  	default:
    63  		return fmt.Errorf("value should be a string or List or Tuple of strings, but is of type %s", v.Type())
    64  
    65  	}
    66  
    67  	defer iter.Done()
    68  
    69  	values := []string{}
    70  	var item starlark.Value
    71  	for iter.Next(&item) {
    72  		str, err := ValueToAbsPath(p.t, item)
    73  		if err != nil {
    74  			return fmt.Errorf("unpacking list item at index %d: %v", len(values), err)
    75  		}
    76  		values = append(values, str)
    77  	}
    78  	p.Value = values
    79  	return nil
    80  }