Compare commits

...

3 commits

12 changed files with 205 additions and 165 deletions

View file

@ -5,6 +5,7 @@ import (
"fmt"
"os"
"os/exec"
"strings"
"text/template"
"unicode"
)
@ -35,9 +36,10 @@ func main() {
func generateExecutors(schema enbasCLISchema, output string) error {
funcMap := template.FuncMap{
"capitalise": capitalise,
"getFlagType": schema.Flags.getType,
"getFlagDescription": schema.Flags.getDescription,
"capitalise": capitalise,
"convertFlagToMixedCaps": convertFlagToMixedCaps,
"getFlagType": schema.Flags.getType,
"getFlagDescription": schema.Flags.getDescription,
}
tmpl := template.Must(template.New("executor-template").Funcs(funcMap).Parse(executorsFileTemplate))
@ -72,3 +74,28 @@ func capitalise(str string) string {
return string(runes)
}
func convertFlagToMixedCaps(value string) string {
var builder strings.Builder
runes := []rune(value)
numRunes := len(runes)
cursor := 0
for cursor < numRunes {
if runes[cursor] != '-' {
builder.WriteRune(runes[cursor])
cursor++
} else {
if cursor != numRunes-1 && unicode.IsLower(runes[cursor+1]) {
builder.WriteRune(unicode.ToUpper(runes[cursor+1]))
cursor += 2
} else {
cursor++
}
}
}
return builder.String()
}

View file

@ -16,7 +16,7 @@ type {{ $struct_name }} struct {
{{- end }}
{{- range $flag := $command.Flags -}}
{{ print "" }}
{{ $flag.Flag }} {{ getFlagType $flag.Flag }}
{{ convertFlagToMixedCaps $flag.Flag }} {{ getFlagType $flag.Flag }}
{{- end -}}
{{- range $field := $command.AdditionalFields -}}
{{ print "" }}
@ -57,9 +57,11 @@ func {{ $new_executor_function_name }}(
{{ print "" }}
{{- range $flag := $command.Flags -}}
{{- if eq (getFlagType $flag.Flag) "string" -}}
exe.StringVar(&exe.{{ $flag.Flag }}, {{ printf "%q" $flag.Flag }}, {{ printf "%q" $flag.Default }}, {{ getFlagDescription $flag.Flag | printf "%q" }})
{{ print "" }}
exe.StringVar(&exe.{{ convertFlagToMixedCaps $flag.Flag }}, {{ printf "%q" $flag.Flag }}, {{ printf "%q" $flag.Default }}, {{ getFlagDescription $flag.Flag | printf "%q" }})
{{- else if eq (getFlagType $flag.Flag) "bool" -}}
exe.BoolVar(&exe.{{ $flag.Flag }}, {{ printf "%q" $flag.Flag }}, {{ $flag.Default }}, {{ getFlagDescription $flag.Flag | printf "%q" }})
{{ print "" }}
exe.BoolVar(&exe.{{ convertFlagToMixedCaps $flag.Flag }}, {{ printf "%q" $flag.Flag }}, {{ $flag.Default }}, {{ getFlagDescription $flag.Flag | printf "%q" }})
{{- end -}}
{{- end -}}
{{ print "" }}

View file

@ -140,8 +140,6 @@ func run() error {
executor.CommandLogin: executor.NewLoginExecutor(
enbasPrinter,
enbasConfig,
executor.CommandLogin,
executor.CommandSummaryLookup(executor.CommandLogin),
),
executor.CommandMute: executor.NewMuteOrUnmuteExecutor(
enbasPrinter,
@ -164,8 +162,6 @@ func run() error {
executor.CommandSwitch: executor.NewSwitchExecutor(
enbasPrinter,
enbasConfig,
executor.CommandSwitch,
executor.CommandSummaryLookup(executor.CommandSwitch),
),
executor.CommandUnfollow: executor.NewFollowOrUnfollowExecutor(
enbasPrinter,
@ -193,18 +189,14 @@ func run() error {
),
executor.CommandVersion: executor.NewVersionExecutor(
enbasPrinter,
executor.CommandVersion,
executor.CommandSummaryLookup(executor.CommandVersion),
binaryVersion,
buildTime,
goVersion,
gitCommit,
),
executor.CommandWhoami: executor.NewWhoAmIExecutor(
executor.CommandWhoami: executor.NewWhoamiExecutor(
enbasPrinter,
enbasConfig,
executor.CommandWhoami,
executor.CommandSummaryLookup(executor.CommandWhoami),
),
}

View file

@ -0,0 +1,135 @@
package executor
import (
"flag"
"codeflow.dananglin.me.uk/apollo/enbas/internal/config"
"codeflow.dananglin.me.uk/apollo/enbas/internal/printer"
)
// InitExecutor is the executor for the init command.
type InitExecutor struct {
*flag.FlagSet
printer *printer.Printer
configDir string
}
func NewInitExecutor(
printer *printer.Printer,
configDir string,
) *InitExecutor {
exe := InitExecutor{
FlagSet: flag.NewFlagSet("init", flag.ExitOnError),
printer: printer,
configDir: configDir,
}
exe.Usage = commandUsageFunc("init", "Creates a new configuration file in the specified configuration directory", exe.FlagSet)
return &exe
}
// LoginExecutor is the executor for the login command.
type LoginExecutor struct {
*flag.FlagSet
printer *printer.Printer
config *config.Config
instance string
}
func NewLoginExecutor(
printer *printer.Printer,
config *config.Config,
) *LoginExecutor {
exe := LoginExecutor{
FlagSet: flag.NewFlagSet("login", flag.ExitOnError),
printer: printer,
config: config,
}
exe.Usage = commandUsageFunc("login", "Logs into an account on GoToSocial", exe.FlagSet)
exe.StringVar(&exe.instance, "instance", "", "The instance that you want to log into")
return &exe
}
// SwitchExecutor is the executor for the switch command.
type SwitchExecutor struct {
*flag.FlagSet
printer *printer.Printer
config *config.Config
accountName string
to string
}
func NewSwitchExecutor(
printer *printer.Printer,
config *config.Config,
) *SwitchExecutor {
exe := SwitchExecutor{
FlagSet: flag.NewFlagSet("switch", flag.ExitOnError),
printer: printer,
config: config,
}
exe.Usage = commandUsageFunc("switch", "Performs a switch operation (e.g. switching between logged in accounts)", exe.FlagSet)
exe.StringVar(&exe.accountName, "account-name", "", "The name of the account")
exe.StringVar(&exe.to, "to", "", "TBC")
return &exe
}
// VersionExecutor is the executor for the version command.
type VersionExecutor struct {
*flag.FlagSet
printer *printer.Printer
full bool
binaryVersion string
buildTime string
goVersion string
gitCommit string
}
func NewVersionExecutor(
printer *printer.Printer,
binaryVersion string,
buildTime string,
goVersion string,
gitCommit string,
) *VersionExecutor {
exe := VersionExecutor{
FlagSet: flag.NewFlagSet("version", flag.ExitOnError),
printer: printer,
binaryVersion: binaryVersion,
buildTime: buildTime,
goVersion: goVersion,
gitCommit: gitCommit,
}
exe.Usage = commandUsageFunc("version", "Prints the application's version and build information", exe.FlagSet)
exe.BoolVar(&exe.full, "full", false, "Set to true to print the build information in full")
return &exe
}
// WhoamiExecutor is the executor for the whoami command.
type WhoamiExecutor struct {
*flag.FlagSet
printer *printer.Printer
config *config.Config
}
func NewWhoamiExecutor(
printer *printer.Printer,
config *config.Config,
) *WhoamiExecutor {
exe := WhoamiExecutor{
FlagSet: flag.NewFlagSet("whoami", flag.ExitOnError),
printer: printer,
config: config,
}
exe.Usage = commandUsageFunc("whoami", "Prints the account that you are currently logged into", exe.FlagSet)
return &exe
}

View file

@ -24,7 +24,6 @@ const (
flagExcludeReplies = "exclude-replies"
flagFrom = "from"
flagFromFile = "from-file"
flagFull = "full"
flagInReplyTo = "in-reply-to"
flagInstance = "instance"
flagLanguage = "language"

View file

@ -1,34 +1,12 @@
package executor
import (
"flag"
"fmt"
"codeflow.dananglin.me.uk/apollo/enbas/internal/config"
"codeflow.dananglin.me.uk/apollo/enbas/internal/printer"
"codeflow.dananglin.me.uk/apollo/enbas/internal/utilities"
)
type InitExecutor struct {
*flag.FlagSet
printer *printer.Printer
configDir string
}
func NewInitExecutor(printer *printer.Printer, configDir, name, summary string) *InitExecutor {
initExe := InitExecutor{
FlagSet: flag.NewFlagSet(name, flag.ExitOnError),
printer: printer,
configDir: configDir,
}
initExe.Usage = commandUsageFunc(name, summary, initExe.FlagSet)
return &initExe
}
func (i *InitExecutor) Execute() error {
if err := utilities.EnsureDirectory(i.configDir); err != nil {
return fmt.Errorf("unable to ensure that the configuration directory is present: %w", err)

View file

@ -1,40 +1,14 @@
package executor
import (
"flag"
"fmt"
"strings"
"codeflow.dananglin.me.uk/apollo/enbas/internal/client"
"codeflow.dananglin.me.uk/apollo/enbas/internal/config"
"codeflow.dananglin.me.uk/apollo/enbas/internal/printer"
"codeflow.dananglin.me.uk/apollo/enbas/internal/utilities"
)
type LoginExecutor struct {
*flag.FlagSet
printer *printer.Printer
config *config.Config
instance string
}
func NewLoginExecutor(printer *printer.Printer, config *config.Config, name, summary string) *LoginExecutor {
loginExe := LoginExecutor{
FlagSet: flag.NewFlagSet(name, flag.ExitOnError),
printer: printer,
config: config,
instance: "",
}
loginExe.StringVar(&loginExe.instance, flagInstance, "", "Specify the instance that you want to login to.")
loginExe.Usage = commandUsageFunc(name, summary, loginExe.FlagSet)
return &loginExe
}
func (l *LoginExecutor) Execute() error {
var err error

View file

@ -1,46 +1,19 @@
package executor
import (
"flag"
"fmt"
"codeflow.dananglin.me.uk/apollo/enbas/internal/config"
"codeflow.dananglin.me.uk/apollo/enbas/internal/printer"
)
type SwitchExecutor struct {
*flag.FlagSet
config *config.Config
printer *printer.Printer
toResourceType string
accountName string
}
func NewSwitchExecutor(printer *printer.Printer, config *config.Config, name, summary string) *SwitchExecutor {
switchExe := SwitchExecutor{
FlagSet: flag.NewFlagSet(name, flag.ExitOnError),
config: config,
printer: printer,
}
switchExe.StringVar(&switchExe.toResourceType, flagTo, "", "The account to switch to")
switchExe.StringVar(&switchExe.accountName, flagAccountName, "", "The name of the account to switch to")
switchExe.Usage = commandUsageFunc(name, summary, switchExe.FlagSet)
return &switchExe
}
func (s *SwitchExecutor) Execute() error {
funcMap := map[string]func() error{
resourceAccount: s.switchToAccount,
}
doFunc, ok := funcMap[s.toResourceType]
doFunc, ok := funcMap[s.to]
if !ok {
return UnsupportedTypeError{resourceType: s.toResourceType}
return UnsupportedTypeError{resourceType: s.to}
}
return doFunc()

View file

@ -1,51 +1,7 @@
package executor
import (
"flag"
"codeflow.dananglin.me.uk/apollo/enbas/internal/printer"
)
type VersionExecutor struct {
*flag.FlagSet
printer *printer.Printer
showFullVersion bool
binaryVersion string
buildTime string
goVersion string
gitCommit string
}
func NewVersionExecutor(
printer *printer.Printer,
name,
summary,
binaryVersion,
buildTime,
goVersion,
gitCommit string,
) *VersionExecutor {
command := VersionExecutor{
FlagSet: flag.NewFlagSet(name, flag.ExitOnError),
printer: printer,
binaryVersion: binaryVersion,
buildTime: buildTime,
goVersion: goVersion,
gitCommit: gitCommit,
showFullVersion: false,
}
command.BoolVar(&command.showFullVersion, flagFull, false, "prints the full build information")
command.Usage = commandUsageFunc(name, summary, command.FlagSet)
return &command
}
func (v *VersionExecutor) Execute() error {
v.printer.PrintVersion(v.showFullVersion, v.binaryVersion, v.buildTime, v.goVersion, v.gitCommit)
v.printer.PrintVersion(v.full, v.binaryVersion, v.buildTime, v.goVersion, v.gitCommit)
return nil
}

View file

@ -1,40 +1,18 @@
package executor
import (
"flag"
"fmt"
"codeflow.dananglin.me.uk/apollo/enbas/internal/config"
"codeflow.dananglin.me.uk/apollo/enbas/internal/printer"
)
type WhoAmIExecutor struct {
*flag.FlagSet
printer *printer.Printer
config *config.Config
}
func NewWhoAmIExecutor(printer *printer.Printer, config *config.Config, name, summary string) *WhoAmIExecutor {
whoExe := WhoAmIExecutor{
FlagSet: flag.NewFlagSet(name, flag.ExitOnError),
printer: printer,
config: config,
}
whoExe.Usage = commandUsageFunc(name, summary, whoExe.FlagSet)
return &whoExe
}
func (c *WhoAmIExecutor) Execute() error {
config, err := config.NewCredentialsConfigFromFile(c.config.CredentialsFile)
func (e *WhoamiExecutor) Execute() error {
config, err := config.NewCredentialsConfigFromFile(e.config.CredentialsFile)
if err != nil {
return fmt.Errorf("unable to load the credential config: %w", err)
}
c.printer.PrintInfo("You are logged in as '" + config.CurrentAccount + "'.\n")
e.printer.PrintInfo("You are logged in as '" + config.CurrentAccount + "'.\n")
return nil
}

View file

@ -1,6 +1,6 @@
package internal
//go:generate go run ../cmd/enbas-cli-generators --path-to-enbas-cli-schema ../schema/enbas_cli_schema.json --path-to-enbas-executors ../executors-wip.go
//go:generate go run ../cmd/enbas-cli-generators --path-to-enbas-cli-schema ../schema/enbas_cli_schema.json --path-to-enbas-executors ./executor/executors.go
const (
ApplicationName = "enbas"

View file

@ -1,5 +1,9 @@
{
"flags": {
"account-name": {
"type": "string",
"description": "The name of the account"
},
"full": {
"type": "bool",
"description": "Set to true to print the build information in full"
@ -7,15 +11,37 @@
"instance": {
"type": "string",
"description": "The instance that you want to log into"
},
"to": {
"type": "string",
"description": "TBC"
}
},
"commands": {
"init": {
"additionalFields": [
{ "name": "configDir", "type": "string"}
],
"flags": [],
"summary": "Creates a new configuration file in the specified configuration directory",
"useConfig": false,
"usePrinter": true
},
"login": {
"flags": [
{ "flag": "instance", "default": "" }
],
"summary": "Log into an account on GoToSocial",
"summary": "Logs into an account on GoToSocial",
"useConfig": true,
"usePrinter": true
},
"switch": {
"flags": [
{ "flag": "account-name", "default": "" },
{ "flag": "to", "default": "" }
],
"summary": "Performs a switch operation (e.g. switching between logged in accounts)",
"useConfig": true,
"usePrinter": true
},