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  }