github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/tiltfile/config/object.go (about) 1 package config 2 3 import ( 4 "encoding/json" 5 "flag" 6 "fmt" 7 8 "go.starlark.net/starlark" 9 10 "github.com/tilt-dev/tilt/internal/tiltfile/encoding" 11 ) 12 13 type objectSetting struct { 14 value starlark.Value 15 isSet bool 16 } 17 18 var _ configValue = &objectSetting{} 19 var _ flag.Value = &objectSetting{} 20 21 func (s *objectSetting) starlark() starlark.Value { 22 return s.value 23 } 24 25 func (s *objectSetting) IsSet() bool { 26 return s.isSet 27 } 28 29 func (s *objectSetting) Type() string { 30 return "object" 31 } 32 33 func (s *objectSetting) setFromInterface(i interface{}) error { 34 if i == nil { 35 return nil 36 } 37 v, err := encoding.ConvertStructuredDataToStarlark(i) 38 if err != nil { 39 return err 40 } 41 42 s.value = v 43 s.isSet = true 44 45 return nil 46 } 47 48 func (s *objectSetting) Set(str string) error { 49 if s.isSet { 50 return fmt.Errorf("object settings can only be specified once. multiple values found (last value: %s)", s.value) 51 } 52 53 var decoded interface{} 54 err := json.Unmarshal([]byte(str), &decoded) 55 if err != nil { 56 return fmt.Errorf("decoding JSON, got %q: %v", str, err) 57 } 58 59 v, err := encoding.ConvertStructuredDataToStarlark(decoded) 60 if err != nil { 61 return err 62 } 63 64 s.value = v 65 s.isSet = true 66 return nil 67 } 68 69 func (s *objectSetting) String() string { 70 if !s.isSet { 71 return "None" 72 } 73 return s.value.String() 74 }