@@ -11,47 +11,48 @@ import (
1111 "strconv"
1212 "time"
1313
14+ "github.com/go-viper/mapstructure/v2"
1415 "github.com/spf13/pflag"
1516 "github.com/spf13/viper"
1617
1718 "github.com/timescale/tiger-cli/internal/tiger/util"
1819)
1920
2021type Config struct {
21- APIURL string `mapstructure:"api_url" yaml:"api_url" `
22- Analytics bool `mapstructure:"analytics" yaml:"analytics" `
23- Color bool `mapstructure:"color" yaml:"color" `
24- ConfigDir string `mapstructure:"config_dir" yaml:"-" `
25- ConsoleURL string `mapstructure:"console_url" yaml:"console_url" `
26- Debug bool `mapstructure:"debug" yaml:"debug" `
27- DocsMCP bool `mapstructure:"docs_mcp" yaml:"docs_mcp" `
28- DocsMCPURL string `mapstructure:"docs_mcp_url" yaml:"docs_mcp_url" `
29- GatewayURL string `mapstructure:"gateway_url" yaml:"gateway_url" `
30- Output string `mapstructure:"output" yaml:"output" `
31- PasswordStorage string `mapstructure:"password_storage" yaml:"password_storage" `
32- ReleasesURL string `mapstructure:"releases_url" yaml:"releases_url" `
33- ServiceID string `mapstructure:"service_id" yaml:"service_id" `
34- VersionCheckInterval time.Duration `mapstructure:"version_check_interval" yaml:"version_check_interval" `
35- VersionCheckLastTime time.Time `mapstructure:"version_check_last_time" yaml:"version_check_last_time" `
36- viper * viper.Viper `mapstructure:"-" yaml:"-" `
22+ APIURL string `mapstructure:"api_url"`
23+ Analytics bool `mapstructure:"analytics"`
24+ Color bool `mapstructure:"color"`
25+ ConfigDir string `mapstructure:"config_dir"`
26+ ConsoleURL string `mapstructure:"console_url"`
27+ Debug bool `mapstructure:"debug"`
28+ DocsMCP bool `mapstructure:"docs_mcp"`
29+ DocsMCPURL string `mapstructure:"docs_mcp_url"`
30+ GatewayURL string `mapstructure:"gateway_url"`
31+ Output string `mapstructure:"output"`
32+ PasswordStorage string `mapstructure:"password_storage"`
33+ ReleasesURL string `mapstructure:"releases_url"`
34+ ServiceID string `mapstructure:"service_id"`
35+ VersionCheckInterval time.Duration `mapstructure:"version_check_interval"`
36+ VersionCheckLastTime time.Time `mapstructure:"version_check_last_time"`
37+ viper * viper.Viper `mapstructure:"-"`
3738}
3839
3940type ConfigOutput struct {
40- APIURL * string `mapstructure:"api_url" json:"api_url,omitempty" yaml:"api_url,omitempty" `
41- Analytics * bool `mapstructure:"analytics" json:"analytics,omitempty" yaml:"analytics,omitempty" `
42- Color * bool `mapstructure:"color" json:"color,omitempty" yaml:"color,omitempty" `
43- ConfigDir * string `mapstructure:"config_dir" json:"config_dir,omitempty" yaml:"config_dir,omitempty" `
44- ConsoleURL * string `mapstructure:"console_url" json:"console_url,omitempty" yaml:"console_url,omitempty" `
45- Debug * bool `mapstructure:"debug" json:"debug,omitempty" yaml:"debug,omitempty" `
46- DocsMCP * bool `mapstructure:"docs_mcp" json:"docs_mcp,omitempty" yaml:"docs_mcp,omitempty" `
47- DocsMCPURL * string `mapstructure:"docs_mcp_url" json:"docs_mcp_url,omitempty" yaml:"docs_mcp_url,omitempty" `
48- GatewayURL * string `mapstructure:"gateway_url" json:"gateway_url,omitempty" yaml:"gateway_url,omitempty" `
49- Output * string `mapstructure:"output" json:"output,omitempty" yaml:"output,omitempty" `
50- PasswordStorage * string `mapstructure:"password_storage" json:"password_storage,omitempty" yaml:"password_storage,omitempty" `
51- ReleasesURL * string `mapstructure:"releases_url" json:"releases_url,omitempty" yaml:"releases_url,omitempty" `
52- ServiceID * string `mapstructure:"service_id" json:"service_id,omitempty" yaml:"service_id,omitempty" `
53- VersionCheckInterval * time .Duration `mapstructure:"version_check_interval" json:"version_check_interval,omitempty" yaml:"version_check_interval,omitempty"`
54- VersionCheckLastTime * time.Time `mapstructure:"version_check_last_time" json:"version_check_last_time,omitempty" yaml:"version_check_last_time,omitempty" `
41+ APIURL * string `mapstructure:"api_url" json:"api_url,omitempty"`
42+ Analytics * bool `mapstructure:"analytics" json:"analytics,omitempty"`
43+ Color * bool `mapstructure:"color" json:"color,omitempty"`
44+ ConfigDir * string `mapstructure:"config_dir" json:"config_dir,omitempty"`
45+ ConsoleURL * string `mapstructure:"console_url" json:"console_url,omitempty"`
46+ Debug * bool `mapstructure:"debug" json:"debug,omitempty"`
47+ DocsMCP * bool `mapstructure:"docs_mcp" json:"docs_mcp,omitempty"`
48+ DocsMCPURL * string `mapstructure:"docs_mcp_url" json:"docs_mcp_url,omitempty"`
49+ GatewayURL * string `mapstructure:"gateway_url" json:"gateway_url,omitempty"`
50+ Output * string `mapstructure:"output" json:"output,omitempty"`
51+ PasswordStorage * string `mapstructure:"password_storage" json:"password_storage,omitempty"`
52+ ReleasesURL * string `mapstructure:"releases_url" json:"releases_url,omitempty"`
53+ ServiceID * string `mapstructure:"service_id" json:"service_id,omitempty"`
54+ VersionCheckInterval * util .Duration `mapstructure:"version_check_interval" json:"version_check_interval,omitempty"` // [util.Duration] ensures value is marshaled in [time.Duration.String] format when output
55+ VersionCheckLastTime * time.Time `mapstructure:"version_check_last_time" json:"version_check_last_time,omitempty"`
5556}
5657
5758const (
@@ -83,7 +84,7 @@ var defaultValues = map[string]any{
8384 "password_storage" : DefaultPasswordStorage ,
8485 "releases_url" : DefaultReleasesURL ,
8586 "service_id" : "" ,
86- "version_check_interval" : DefaultVersionCheckInterval ,
87+ "version_check_interval" : DefaultVersionCheckInterval . String (), // String can be interpreted as either [time.Duration] (for [Config]) or [util.Duration] (for [ConfigOutput])
8788 "version_check_last_time" : time.Time {},
8889}
8990
@@ -149,7 +150,10 @@ func ForOutputFromViper(v *viper.Viper) (*ConfigOutput, error) {
149150 ConfigDir : & configDir ,
150151 }
151152
152- if err := v .Unmarshal (cfg ); err != nil {
153+ if err := v .Unmarshal (cfg ,
154+ // Decode hook allows us to unmarshal a string into a [util.Duration] for the sake of VersionCheckInterval
155+ viper .DecodeHook (mapstructure .TextUnmarshallerHookFunc ()),
156+ ); err != nil {
153157 return nil , fmt .Errorf ("error unmarshaling config for output: %w" , err )
154158 }
155159
0 commit comments