From 700ca23a718adeb9b8cc6671a065ebe2f347cb3d Mon Sep 17 00:00:00 2001 From: albertony <12441419+albertony@users.noreply.github.com> Date: Tue, 18 Jan 2022 22:38:24 +0100 Subject: [PATCH] config: add utility function for backend config with list and custom input --- backend/jottacloud/jottacloud.go | 6 +-- backend/onedrive/onedrive.go | 2 +- fs/backend_config.go | 75 +++++++++++++++++++++++++++++--- 3 files changed, 74 insertions(+), 9 deletions(-) diff --git a/backend/jottacloud/jottacloud.go b/backend/jottacloud/jottacloud.go index c75774d93..3322d8d8c 100644 --- a/backend/jottacloud/jottacloud.go +++ b/backend/jottacloud/jottacloud.go @@ -127,7 +127,7 @@ func init() { func Config(ctx context.Context, name string, m configmap.Mapper, config fs.ConfigIn) (*fs.ConfigOut, error) { switch config.State { case "": - return fs.ConfigChooseFixed("auth_type_done", "config_type", `Authentication type.`, []fs.OptionExample{{ + return fs.ConfigChooseExclusiveFixed("auth_type_done", "config_type", `Authentication type.`, []fs.OptionExample{{ Value: "standard", Help: "Standard authentication.\nUse this if you're a normal Jottacloud user.", }, { @@ -286,7 +286,7 @@ machines.`) if err != nil { return nil, err } - return fs.ConfigChoose("choose_device_result", "config_device", `Please select the device to use. Normally this will be Jotta`, len(acc.Devices), func(i int) (string, string) { + return fs.ConfigChooseExclusive("choose_device_result", "config_device", `Please select the device to use. Normally this will be Jotta`, len(acc.Devices), func(i int) (string, string) { return acc.Devices[i].Name, "" }) case "choose_device_result": @@ -304,7 +304,7 @@ machines.`) if err != nil { return nil, err } - return fs.ConfigChoose("choose_device_mountpoint", "config_mountpoint", `Please select the mountpoint to use. Normally this will be Archive.`, len(dev.MountPoints), func(i int) (string, string) { + return fs.ConfigChooseExclusive("choose_device_mountpoint", "config_mountpoint", `Please select the mountpoint to use. Normally this will be Archive.`, len(dev.MountPoints), func(i int) (string, string) { return dev.MountPoints[i].Name, "" }) case "choose_device_mountpoint": diff --git a/backend/onedrive/onedrive.go b/backend/onedrive/onedrive.go index 80bf340c6..132ed77e6 100644 --- a/backend/onedrive/onedrive.go +++ b/backend/onedrive/onedrive.go @@ -424,7 +424,7 @@ func Config(ctx context.Context, name string, m configmap.Mapper, config fs.Conf switch config.State { case "choose_type": - return fs.ConfigChooseFixed("choose_type_done", "config_type", "Type of connection", []fs.OptionExample{{ + return fs.ConfigChooseExclusiveFixed("choose_type_done", "config_type", "Type of connection", []fs.OptionExample{{ Value: "onedrive", Help: "OneDrive Personal or Business", }, { diff --git a/fs/backend_config.go b/fs/backend_config.go index cef15bf56..1e188a0ac 100644 --- a/fs/backend_config.go +++ b/fs/backend_config.go @@ -176,7 +176,13 @@ func ConfigConfirm(state string, Default bool, name string, help string) (*Confi }, nil } -// ConfigChooseFixed returns a ConfigOut structure which has a list of items to choose from. +// ConfigChooseExclusiveFixed returns a ConfigOut structure which has a list of +// items to choose from. +// +// Possible items must be supplied as a fixed list. +// +// User is required to supply a value, and is restricted to the specified list, +// i.e. free text input is not allowed. // // state should be the next state required // name is the config name for this item @@ -185,8 +191,8 @@ func ConfigConfirm(state string, Default bool, name string, help string) (*Confi // // It chooses the first item to be the default. // If there are no items then it will return an error. -// If there is only one item it will short cut to the next state -func ConfigChooseFixed(state string, name string, help string, items []OptionExample) (*ConfigOut, error) { +// If there is only one item it will short cut to the next state. +func ConfigChooseExclusiveFixed(state string, name string, help string, items []OptionExample) (*ConfigOut, error) { if len(items) == 0 { return nil, fmt.Errorf("no items found in: %s", help) } @@ -208,7 +214,13 @@ func ConfigChooseFixed(state string, name string, help string, items []OptionExa return choose, nil } -// ConfigChoose returns a ConfigOut structure which has a list of items to choose from. +// ConfigChooseExclusive returns a ConfigOut structure which has a list of +// items to choose from. +// +// Possible items are retrieved from a supplied function. +// +// User is required to supply a value, and is restricted to the specified list, +// i.e. free text input is not allowed. // // state should be the next state required // name is the config name for this item @@ -218,7 +230,60 @@ func ConfigChooseFixed(state string, name string, help string, items []OptionExa // // It chooses the first item to be the default. // If there are no items then it will return an error. -// If there is only one item it will short cut to the next state +// If there is only one item it will short cut to the next state. +func ConfigChooseExclusive(state string, name string, help string, n int, getItem func(i int) (itemValue string, itemHelp string)) (*ConfigOut, error) { + items := make(OptionExamples, n) + for i := range items { + items[i].Value, items[i].Help = getItem(i) + } + return ConfigChooseExclusiveFixed(state, name, help, items) +} + +// ConfigChooseFixed returns a ConfigOut structure which has a list of +// suggested items. +// +// Suggested items must be supplied as a fixed list. +// +// User is required to supply a value, but is not restricted to the specified +// list, i.e. free text input is accepted. +// +// state should be the next state required +// name is the config name for this item +// help should be the help shown to the user +// items should be the items in the list +// +// It chooses the first item to be the default. +func ConfigChooseFixed(state string, name string, help string, items []OptionExample) (*ConfigOut, error) { + choose := &ConfigOut{ + State: state, + Option: &Option{ + Name: name, + Help: help, + Examples: items, + Required: true, + }, + } + if len(choose.Option.Examples) > 0 { + choose.Option.Default = choose.Option.Examples[0].Value + } + return choose, nil +} + +// ConfigChoose returns a ConfigOut structure which has a list of suggested +// items. +// +// Suggested items are retrieved from a supplied function. +// +// User is required to supply a value, but is not restricted to the specified +// list, i.e. free text input is accepted. +// +// state should be the next state required +// name is the config name for this item +// help should be the help shown to the user +// n should be the number of items in the list +// getItem should return the items (value, help) +// +// It chooses the first item to be the default. func ConfigChoose(state string, name string, help string, n int, getItem func(i int) (itemValue string, itemHelp string)) (*ConfigOut, error) { items := make(OptionExamples, n) for i := range items {