diff --git a/internal/cmd/config/helptext/generate.go b/internal/cmd/config/helptext/generate.go index 0f48c431..1bb759bf 100644 --- a/internal/cmd/config/helptext/generate.go +++ b/internal/cmd/config/helptext/generate.go @@ -16,11 +16,19 @@ import ( //go:generate go run $GOFILE func main() { - generateTable("preferences.txt", config.OptionFlagPreference, true) - generateTable("other.txt", config.OptionFlagPreference, false) + generateTable( + "preferences.txt", + config.OptionFlagPreference|config.OptionFlagHidden, + config.OptionFlagPreference, + table.Row{"sort.", "Default sorting for resource", "string list", "sort.", "HCLOUD_SORT_", ""}, + ) + generateTable("other.txt", + config.OptionFlagPreference|config.OptionFlagHidden, + 0, + ) } -func generateTable(outFile string, filterFlag config.OptionFlag, hasFlag bool) { +func generateTable(outFile string, mask, filter config.OptionFlag, extraRows ...table.Row) { f, err := os.OpenFile(outFile, os.O_TRUNC|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { panic(err) @@ -46,7 +54,7 @@ func generateTable(outFile string, filterFlag config.OptionFlag, hasFlag bool) { var opts []config.IOption for _, opt := range config.Options { - if opt.HasFlags(filterFlag) != hasFlag { + if opt.GetFlags()&mask != filter { continue } opts = append(opts, opt) @@ -61,6 +69,11 @@ func generateTable(outFile string, filterFlag config.OptionFlag, hasFlag bool) { t.AppendSeparator() } + for _, row := range extraRows { + t.AppendRow(row) + t.AppendSeparator() + } + t.Render() } diff --git a/internal/cmd/config/helptext/preferences.txt b/internal/cmd/config/helptext/preferences.txt index f82b07dd..7049798a 100644 --- a/internal/cmd/config/helptext/preferences.txt +++ b/internal/cmd/config/helptext/preferences.txt @@ -1,73 +1,25 @@ -┌───────────────────────┬──────────────────────┬─────────────┬───────────────────────┬──────────────────────────────┬─────────────────┐ -│ OPTION │ DESCRIPTION │ TYPE │ CONFIG KEY │ ENVIRONMENT VARIABLE │ FLAG │ -├───────────────────────┼──────────────────────┼─────────────┼───────────────────────┼──────────────────────────────┼─────────────────┤ -│ debug │ Enable debug output │ boolean │ debug │ HCLOUD_DEBUG │ --debug │ -├───────────────────────┼──────────────────────┼─────────────┼───────────────────────┼──────────────────────────────┼─────────────────┤ -│ debug-file │ File to write debug │ string │ debug_file │ HCLOUD_DEBUG_FILE │ --debug-file │ -│ │ output to │ │ │ │ │ -├───────────────────────┼──────────────────────┼─────────────┼───────────────────────┼──────────────────────────────┼─────────────────┤ -│ default-ssh-keys │ Default SSH keys for │ string list │ default_ssh_keys │ HCLOUD_DEFAULT_SSH_KEYS │ │ -│ │ new servers │ │ │ │ │ -├───────────────────────┼──────────────────────┼─────────────┼───────────────────────┼──────────────────────────────┼─────────────────┤ -│ endpoint │ Hetzner Cloud API │ string │ endpoint │ HCLOUD_ENDPOINT │ --endpoint │ -│ │ endpoint │ │ │ │ │ -├───────────────────────┼──────────────────────┼─────────────┼───────────────────────┼──────────────────────────────┼─────────────────┤ -│ poll-interval │ Interval at which to │ duration │ poll_interval │ HCLOUD_POLL_INTERVAL │ --poll-interval │ -│ │ poll information, │ │ │ │ │ -│ │ for example action │ │ │ │ │ -│ │ progress │ │ │ │ │ -├───────────────────────┼──────────────────────┼─────────────┼───────────────────────┼──────────────────────────────┼─────────────────┤ -│ quiet │ If true, only print │ boolean │ quiet │ HCLOUD_QUIET │ --quiet │ -│ │ error messages │ │ │ │ │ -├───────────────────────┼──────────────────────┼─────────────┼───────────────────────┼──────────────────────────────┼─────────────────┤ -│ sort.certificate │ Default sorting for │ string list │ sort.certificate │ HCLOUD_SORT.CERTIFICATE │ │ -│ │ Certificate resource │ │ │ │ │ -├───────────────────────┼──────────────────────┼─────────────┼───────────────────────┼──────────────────────────────┼─────────────────┤ -│ sort.datacenter │ Default sorting for │ string list │ sort.datacenter │ HCLOUD_SORT.DATACENTER │ │ -│ │ Datacenter resource │ │ │ │ │ -├───────────────────────┼──────────────────────┼─────────────┼───────────────────────┼──────────────────────────────┼─────────────────┤ -│ sort.firewall │ Default sorting for │ string list │ sort.firewall │ HCLOUD_SORT.FIREWALL │ │ -│ │ Firewall resource │ │ │ │ │ -├───────────────────────┼──────────────────────┼─────────────┼───────────────────────┼──────────────────────────────┼─────────────────┤ -│ sort.floatingip │ Default sorting for │ string list │ sort.floatingip │ HCLOUD_SORT.FLOATINGIP │ │ -│ │ Floating IP resource │ │ │ │ │ -├───────────────────────┼──────────────────────┼─────────────┼───────────────────────┼──────────────────────────────┼─────────────────┤ -│ sort.image │ Default sorting for │ string list │ sort.image │ HCLOUD_SORT.IMAGE │ │ -│ │ Image resource │ │ │ │ │ -├───────────────────────┼──────────────────────┼─────────────┼───────────────────────┼──────────────────────────────┼─────────────────┤ -│ sort.iso │ Default sorting for │ string list │ sort.iso │ HCLOUD_SORT.ISO │ │ -│ │ ISO resource │ │ │ │ │ -├───────────────────────┼──────────────────────┼─────────────┼───────────────────────┼──────────────────────────────┼─────────────────┤ -│ sort.loadbalancer │ Default sorting for │ string list │ sort.loadbalancer │ HCLOUD_SORT.LOADBALANCER │ │ -│ │ Load Balancer │ │ │ │ │ -│ │ resource │ │ │ │ │ -├───────────────────────┼──────────────────────┼─────────────┼───────────────────────┼──────────────────────────────┼─────────────────┤ -│ sort.loadbalancertype │ Default sorting for │ string list │ sort.loadbalancertype │ HCLOUD_SORT.LOADBALANCERTYPE │ │ -│ │ Load Balancer Type │ │ │ │ │ -│ │ resource │ │ │ │ │ -├───────────────────────┼──────────────────────┼─────────────┼───────────────────────┼──────────────────────────────┼─────────────────┤ -│ sort.location │ Default sorting for │ string list │ sort.location │ HCLOUD_SORT.LOCATION │ │ -│ │ Location resource │ │ │ │ │ -├───────────────────────┼──────────────────────┼─────────────┼───────────────────────┼──────────────────────────────┼─────────────────┤ -│ sort.network │ Default sorting for │ string list │ sort.network │ HCLOUD_SORT.NETWORK │ │ -│ │ Network resource │ │ │ │ │ -├───────────────────────┼──────────────────────┼─────────────┼───────────────────────┼──────────────────────────────┼─────────────────┤ -│ sort.placementgroup │ Default sorting for │ string list │ sort.placementgroup │ HCLOUD_SORT.PLACEMENTGROUP │ │ -│ │ Placement Group │ │ │ │ │ -│ │ resource │ │ │ │ │ -├───────────────────────┼──────────────────────┼─────────────┼───────────────────────┼──────────────────────────────┼─────────────────┤ -│ sort.primaryip │ Default sorting for │ string list │ sort.primaryip │ HCLOUD_SORT.PRIMARYIP │ │ -│ │ Primary IP resource │ │ │ │ │ -├───────────────────────┼──────────────────────┼─────────────┼───────────────────────┼──────────────────────────────┼─────────────────┤ -│ sort.server │ Default sorting for │ string list │ sort.server │ HCLOUD_SORT.SERVER │ │ -│ │ Server resource │ │ │ │ │ -├───────────────────────┼──────────────────────┼─────────────┼───────────────────────┼──────────────────────────────┼─────────────────┤ -│ sort.servertype │ Default sorting for │ string list │ sort.servertype │ HCLOUD_SORT.SERVERTYPE │ │ -│ │ Server Type resource │ │ │ │ │ -├───────────────────────┼──────────────────────┼─────────────┼───────────────────────┼──────────────────────────────┼─────────────────┤ -│ sort.sshkey │ Default sorting for │ string list │ sort.sshkey │ HCLOUD_SORT.SSHKEY │ │ -│ │ SSH Key resource │ │ │ │ │ -├───────────────────────┼──────────────────────┼─────────────┼───────────────────────┼──────────────────────────────┼─────────────────┤ -│ sort.volume │ Default sorting for │ string list │ sort.volume │ HCLOUD_SORT.VOLUME │ │ -│ │ Volume resource │ │ │ │ │ -└───────────────────────┴──────────────────────┴─────────────┴───────────────────────┴──────────────────────────────┴─────────────────┘ +┌──────────────────┬──────────────────────┬─────────────┬──────────────────┬─────────────────────────┬─────────────────┐ +│ OPTION │ DESCRIPTION │ TYPE │ CONFIG KEY │ ENVIRONMENT VARIABLE │ FLAG │ +├──────────────────┼──────────────────────┼─────────────┼──────────────────┼─────────────────────────┼─────────────────┤ +│ debug │ Enable debug output │ boolean │ debug │ HCLOUD_DEBUG │ --debug │ +├──────────────────┼──────────────────────┼─────────────┼──────────────────┼─────────────────────────┼─────────────────┤ +│ debug-file │ File to write debug │ string │ debug_file │ HCLOUD_DEBUG_FILE │ --debug-file │ +│ │ output to │ │ │ │ │ +├──────────────────┼──────────────────────┼─────────────┼──────────────────┼─────────────────────────┼─────────────────┤ +│ default-ssh-keys │ Default SSH keys for │ string list │ default_ssh_keys │ HCLOUD_DEFAULT_SSH_KEYS │ │ +│ │ new servers │ │ │ │ │ +├──────────────────┼──────────────────────┼─────────────┼──────────────────┼─────────────────────────┼─────────────────┤ +│ endpoint │ Hetzner Cloud API │ string │ endpoint │ HCLOUD_ENDPOINT │ --endpoint │ +│ │ endpoint │ │ │ │ │ +├──────────────────┼──────────────────────┼─────────────┼──────────────────┼─────────────────────────┼─────────────────┤ +│ poll-interval │ Interval at which to │ duration │ poll_interval │ HCLOUD_POLL_INTERVAL │ --poll-interval │ +│ │ poll information, │ │ │ │ │ +│ │ for example action │ │ │ │ │ +│ │ progress │ │ │ │ │ +├──────────────────┼──────────────────────┼─────────────┼──────────────────┼─────────────────────────┼─────────────────┤ +│ quiet │ If true, only print │ boolean │ quiet │ HCLOUD_QUIET │ --quiet │ +│ │ error messages │ │ │ │ │ +├──────────────────┼──────────────────────┼─────────────┼──────────────────┼─────────────────────────┼─────────────────┤ +│ sort. │ Default sorting for │ string list │ sort. │ HCLOUD_SORT_ │ │ +│ │ resource │ │ │ │ │ +└──────────────────┴──────────────────────┴─────────────┴──────────────────┴─────────────────────────┴─────────────────┘ diff --git a/internal/state/config/options.go b/internal/state/config/options.go index 2f8b17f8..5900e955 100644 --- a/internal/state/config/options.go +++ b/internal/state/config/options.go @@ -28,6 +28,8 @@ const ( OptionFlagSensitive // OptionFlagSlice indicates that the option value is a slice OptionFlagSlice + // OptionFlagHidden indicates that the option should not be shown in the help output + OptionFlagHidden DefaultPreferenceFlags = OptionFlagPreference | OptionFlagConfig | OptionFlagPFlag | OptionFlagEnv ) @@ -47,6 +49,8 @@ type IOption interface { FlagName() string // HasFlags returns true if the option has all the provided flags set HasFlags(src OptionFlag) bool + // GetFlags returns all flags set for the option + GetFlags() OptionFlag // GetAsAny reads the option value from the config and returns it as an any GetAsAny(c Config) any // OverrideAny sets the option value in the config to the provided any value @@ -147,7 +151,7 @@ var ( "sort.certificate", "Default sorting for Certificate resource", []string{"id:asc"}, - (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice, + (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice|OptionFlagHidden, nil, ) @@ -155,7 +159,7 @@ var ( "sort.datacenter", "Default sorting for Datacenter resource", []string{"id:asc"}, - (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice, + (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice|OptionFlagHidden, nil, ) @@ -163,7 +167,7 @@ var ( "sort.firewall", "Default sorting for Firewall resource", []string{"id:asc"}, - (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice, + (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice|OptionFlagHidden, nil, ) @@ -171,7 +175,7 @@ var ( "sort.floating-ip", "Default sorting for Floating IP resource", []string{"id:asc"}, - (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice, + (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice|OptionFlagHidden, nil, ) @@ -179,7 +183,7 @@ var ( "sort.image", "Default sorting for Image resource", []string{"id:asc"}, - (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice, + (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice|OptionFlagHidden, nil, ) @@ -187,7 +191,7 @@ var ( "sort.iso", "Default sorting for ISO resource", []string{"id:asc"}, - (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice, + (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice|OptionFlagHidden, nil, ) @@ -195,7 +199,7 @@ var ( "sort.load-balancer", "Default sorting for Load Balancer resource", []string{"id:asc"}, - (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice, + (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice|OptionFlagHidden, nil, ) @@ -203,7 +207,7 @@ var ( "sort.load-balancer-type", "Default sorting for Load Balancer Type resource", []string{"id:asc"}, - (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice, + (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice|OptionFlagHidden, nil, ) @@ -211,7 +215,7 @@ var ( "sort.location", "Default sorting for Location resource", []string{"id:asc"}, - (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice, + (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice|OptionFlagHidden, nil, ) @@ -219,7 +223,7 @@ var ( "sort.network", "Default sorting for Network resource", []string{"id:asc"}, - (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice, + (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice|OptionFlagHidden, nil, ) @@ -227,7 +231,7 @@ var ( "sort.placement-group", "Default sorting for Placement Group resource", []string{"id:asc"}, - (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice, + (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice|OptionFlagHidden, nil, ) @@ -235,7 +239,7 @@ var ( "sort.primary-ip", "Default sorting for Primary IP resource", []string{"id:asc"}, - (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice, + (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice|OptionFlagHidden, nil, ) @@ -243,7 +247,7 @@ var ( "sort.server", "Default sorting for Server resource", []string{"id:asc"}, - (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice, + (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice|OptionFlagHidden, nil, ) @@ -251,7 +255,7 @@ var ( "sort.server-type", "Default sorting for Server Type resource", []string{"id:asc"}, - (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice, + (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice|OptionFlagHidden, nil, ) @@ -259,7 +263,7 @@ var ( "sort.ssh-key", "Default sorting for SSH Key resource", []string{"id:asc"}, - (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice, + (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice|OptionFlagHidden, nil, ) @@ -267,7 +271,7 @@ var ( "sort.volume", "Default sorting for Volume resource", []string{"id:asc"}, - (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice, + (DefaultPreferenceFlags&^OptionFlagPFlag)|OptionFlagSlice|OptionFlagHidden, nil, ) ) @@ -334,6 +338,11 @@ func (o *Option[T]) HasFlags(src OptionFlag) bool { return (^o.Flags)&src == 0 } +func (o *Option[T]) GetFlags() OptionFlag { + return o.Flags + +} + func (o *Option[T]) GetName() string { return o.Name }