From 136a90db19af9c23252cc9c726b681d790501346 Mon Sep 17 00:00:00 2001 From: Melora Hugues Date: Sun, 13 Aug 2023 18:46:06 +0200 Subject: [PATCH] add basic command parser --- config/main.go | 91 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 74 insertions(+), 17 deletions(-) diff --git a/config/main.go b/config/main.go index 201913e..0fe9e05 100644 --- a/config/main.go +++ b/config/main.go @@ -4,29 +4,80 @@ import ( "errors" "flag" "io/fs" + "os" "git.faercol.me/faercol/http-boot-config/config/logger" "git.faercol.me/faercol/http-boot-config/config/prober" ) +type action int + +const ( + actionList action = iota + actionGetRemote + actionUnknown +) + type cliArgs struct { debug bool colour bool + action action } -func parseArgs() cliArgs { +var defaultArgs cliArgs = cliArgs{ + debug: false, + colour: true, + action: actionUnknown, +} + +func parseArgs() (cliArgs, error) { + args := defaultArgs + var firstArg int + + getRemoteFlagSet := flag.NewFlagSet("get-remote", flag.ExitOnError) + listFlagSet := flag.NewFlagSet("list", flag.ExitOnError) + debugFlag := flag.Bool("debug", false, "Display debug logs") noColourFlag := flag.Bool("no-colour", false, "Disable colour logs") - flag.Parse() - - return cliArgs{ - debug: *debugFlag, - colour: !*noColourFlag, + for i, v := range os.Args { + switch v { + case "list": + args.action = actionList + case "get-remote": + args.action = actionGetRemote + default: + continue + } + firstArg = i + 1 } + + switch args.action { + case actionList: + listFlagSet.Parse(os.Args[firstArg:]) + case actionGetRemote: + getRemoteFlagSet.Parse(os.Args[firstArg:]) + default: + flag.Parse() + return cliArgs{}, errors.New("missing an action") + } + + flag.Parse() + args.debug = *debugFlag + args.colour = !*noColourFlag + return args, nil } -func displayAppList(apps []prober.EfiApp, l *logger.SimpleLogger) { +func displayAppList(l *logger.SimpleLogger) { + l.Info("Checking EFI directory for available boot images...") + apps, err := prober.GetEFIApps(l) + if err != nil { + if errors.Is(err, fs.ErrPermission) { + l.Fatal("Permission error, try to run the command as sudo") + } + l.Fatalf("Failed to check EFI directory: %s", err.Error()) + } + l.Info("Found the following EFI applications:") for _, a := range apps { prefix := " " @@ -37,18 +88,24 @@ func displayAppList(apps []prober.EfiApp, l *logger.SimpleLogger) { } } +func getRemoteConfig(l *logger.SimpleLogger) { + l.Info("Getting config from remote server...") +} + func main() { - args := parseArgs() + args, err := parseArgs() + if err != nil { + l := logger.New(true, false) + l.Fatalf("Invalid command: %s", err.Error()) + } l := logger.New(args.colour, args.debug) - l.Info("Checking EFI directory for available boot images...") - images, err := prober.GetEFIApps(l) - if err != nil { - if errors.Is(err, fs.ErrPermission) { - l.Fatal("Permission error, try to run the command as sudo") - } - l.Fatalf("Failed to check EFI directory: %s", err.Error()) + switch args.action { + case actionList: + displayAppList(l) + case actionGetRemote: + getRemoteConfig(l) + default: + l.Fatal("Unknown action") } - - displayAppList(images, l) }