github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/tiltfile/telemetry/telemetry.go (about) 1 package telemetry 2 3 import ( 4 "fmt" 5 "path/filepath" 6 7 "go.starlark.net/starlark" 8 9 "github.com/tilt-dev/tilt/internal/tiltfile/starkit" 10 "github.com/tilt-dev/tilt/internal/tiltfile/value" 11 "github.com/tilt-dev/tilt/pkg/model" 12 ) 13 14 type Plugin struct{} 15 16 func NewPlugin() Plugin { 17 return Plugin{} 18 } 19 20 func (e Plugin) NewState() interface{} { 21 return model.TelemetrySettings{ 22 Period: model.DefaultTelemetryPeriod, 23 } 24 } 25 26 func (Plugin) OnStart(env *starkit.Environment) error { 27 return env.AddBuiltin("experimental_telemetry_cmd", setTelemetryCmd) 28 } 29 30 func setTelemetryCmd(thread *starlark.Thread, fn *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) { 31 var cmdVal, cmdBatVal, cmdDirVal starlark.Value 32 var period value.Duration 33 err := starkit.UnpackArgs(thread, fn.Name(), args, kwargs, 34 "cmd", &cmdVal, 35 "cmd_bat?", &cmdBatVal, 36 "period?", &period, 37 "dir?", &cmdDirVal) 38 if err != nil { 39 return starlark.None, err 40 } 41 42 cmd, err := value.ValueGroupToCmdHelper(thread, cmdVal, cmdBatVal, cmdDirVal, nil) 43 if err != nil { 44 return nil, err 45 } 46 47 if cmd.Empty() { 48 return starlark.None, fmt.Errorf("cmd cannot be empty") 49 } 50 51 err = starkit.SetState(thread, func(settings model.TelemetrySettings) (model.TelemetrySettings, error) { 52 if len(settings.Cmd.Argv) > 0 { 53 return settings, fmt.Errorf("%v called multiple times; already set to %v", fn.Name(), settings.Cmd) 54 } 55 56 settings.Cmd = cmd 57 settings.Workdir = filepath.Dir(starkit.CurrentExecPath(thread)) 58 if !period.IsZero() { 59 settings.Period = period.AsDuration() 60 } 61 62 return settings, nil 63 }) 64 65 if err != nil { 66 return starlark.None, err 67 } 68 69 return starlark.None, nil 70 } 71 72 var _ starkit.StatefulPlugin = Plugin{} 73 74 func MustState(model starkit.Model) model.TelemetrySettings { 75 state, err := GetState(model) 76 if err != nil { 77 panic(err) 78 } 79 return state 80 } 81 82 func GetState(m starkit.Model) (model.TelemetrySettings, error) { 83 var state model.TelemetrySettings 84 err := m.Load(&state) 85 return state, err 86 }