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 }