diff --git a/cmd/enbas/add.go b/cmd/enbas/add.go new file mode 100644 index 0000000..096ee66 --- /dev/null +++ b/cmd/enbas/add.go @@ -0,0 +1,72 @@ +package main + +import ( + "errors" + "flag" + "fmt" + + "codeflow.dananglin.me.uk/apollo/enbas/internal/client" +) + +type addCommand struct { + *flag.FlagSet + + toResourceType string + listID string + accountIDs accountIDs +} + +func newAddCommand(name, summary string) *addCommand { + emptyArr := make([]string, 0, 3) + + command := addCommand{ + FlagSet: flag.NewFlagSet(name, flag.ExitOnError), + accountIDs: accountIDs(emptyArr), + } + + command.StringVar(&command.toResourceType, "add-to", "", "specify the type of resource to add to") + command.StringVar(&command.listID, listIDFlag, "", "the ID of the list to add to") + command.Var(&command.accountIDs, "account-id", "the ID of the account to add to the list") + + command.Usage = commandUsageFunc(name, summary, command.FlagSet) + + return &command +} + +func (c *addCommand) Execute() error { + if c.toResourceType == "" { + return flagNotSetError{flagText: "add-to"} + } + + funcMap := map[string]func(*client.Client) error{ + listResource: c.addAccountsToList, + } + + doFunc, ok := funcMap[c.toResourceType] + if !ok { + return unsupportedResourceTypeError{resourceType: c.toResourceType} + } + + gtsClient, err := client.NewClientFromConfig() + if err != nil { + return fmt.Errorf("unable to create the GoToSocial client; %w", err) + } + + return doFunc(gtsClient) +} + +func (c *addCommand) addAccountsToList(gtsClient *client.Client) error { + if c.listID == "" { + return flagNotSetError{flagText: listIDFlag} + } + + if len(c.accountIDs) == 0 { + return errors.New("no account IDs has been specified") + } + + if err := gtsClient.AddAccountsToList(c.listID, []string(c.accountIDs)); err != nil { + return fmt.Errorf("unable to add the accounts to the list; %w", err) + } + + return nil +} diff --git a/cmd/enbas/flags.go b/cmd/enbas/flags.go new file mode 100644 index 0000000..4856a45 --- /dev/null +++ b/cmd/enbas/flags.go @@ -0,0 +1,17 @@ +package main + +import "strings" + +type accountIDs []string + +func (a *accountIDs) String() string { + return strings.Join(*a, ", ") +} + +func (a *accountIDs) Set(value string) error { + if len(value) > 0 { + *a = append(*a, value) + } + + return nil +} diff --git a/cmd/enbas/main.go b/cmd/enbas/main.go index 5430a0d..b541d7b 100644 --- a/cmd/enbas/main.go +++ b/cmd/enbas/main.go @@ -52,6 +52,7 @@ func run() error { deleteResource string = "delete" updateResource string = "update" whoami string = "whoami" + add string = "add" ) summaries := map[string]string{ @@ -63,6 +64,7 @@ func run() error { deleteResource: "delete a specific resource", updateResource: "update a specific resource", whoami: "print the account that you are currently logged in to", + add: "add a resource to another resource", } flag.Usage = enbasUsageFunc(summaries) @@ -97,6 +99,8 @@ func run() error { executor = newUpdateCommand(updateResource, summaries[updateResource]) case whoami: executor = newWhoAmICommand(whoami, summaries[whoami]) + case add: + executor = newAddCommand(add, summaries[add]) default: flag.Usage() return fmt.Errorf("unknown subcommand %q", subcommand)