From e134f20fcaa686259927942263e13dd4e32661d3 Mon Sep 17 00:00:00 2001 From: mtgmonkey Date: Tue, 3 Jun 2025 17:36:18 -0400 Subject: [PATCH] initial cli library --- flake.nix | 9 +++++ src/Cli.elm | 103 +++++++++++++++++++++++++++++++++++++++++++++++ src/Commands.elm | 12 ++++++ src/Main.elm | 5 ++- 4 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 src/Cli.elm create mode 100644 src/Commands.elm diff --git a/flake.nix b/flake.nix index 37f3282..3fa9cd3 100644 --- a/flake.nix +++ b/flake.nix @@ -9,5 +9,14 @@ packages.${system} = { default = pkgs.callPackage ./package.nix {}; }; + devShells.${system} = { + default = pkgs.mkShell { + nativeBuildInputs = [ + pkgs.elmPackages.elm-format + pkgs.elm2nix + pkgs.elmPackages.elm-json + ]; + }; + }; }; } diff --git a/src/Cli.elm b/src/Cli.elm new file mode 100644 index 0000000..08b7880 --- /dev/null +++ b/src/Cli.elm @@ -0,0 +1,103 @@ +module Cli exposing (..) + + +type alias Parameter = + { name : String + } + + +type alias FilledParameter = + { name : String + , content : String + } + + +type alias DirtyCommand = + Command + + +type alias Command = + { name : String + , params : List Parameter + } + + +type alias FilledCommand = + { name : String + , params : List FilledParameter + } + + +type alias CommandErr = + { command : Maybe Command + , got : String + , argumentErr : Maybe ArgumentErr + } + +type ArgumentErr + = MissingArgs + | TooManyArgs + + +parseInput : List Command -> String -> Result CommandErr FilledCommand +parseInput commands input = + let + tokens = + List.map String.trim (String.split " " input) + in + case List.head tokens of + Just maybeCommand -> + case List.head (List.filter (isCommand maybeCommand) commands) of + Just command -> + case applyArguments command.params tokens of + Ok list -> + Ok + { name = command.name + , params = list + } + Err err -> + Err { command = Just command + , got = input + , argumentErr = Just err + } + + + Nothing -> + Err + { command = Nothing + , got = input + , argumentErr = Nothing + } + Nothing -> + Err + { command = Nothing + , got = input + , argumentErr = Nothing + } + + +applyArguments : List Parameter -> List String -> Result ArgumentErr (List FilledParameter) +applyArguments params inputs = + if List.length params > List.length inputs then + Err MissingArgs + else if List.length params < List.length inputs then + Err TooManyArgs + else + Ok (List.map2 applyParameter params inputs) + + + +applyParameter : Parameter -> String -> FilledParameter +applyParameter param input = + { name = param.name + , content = input + } + + +isCommand : String -> Command -> Bool +isCommand name command = + if name == command.name then + True + + else + False diff --git a/src/Commands.elm b/src/Commands.elm new file mode 100644 index 0000000..7ca7788 --- /dev/null +++ b/src/Commands.elm @@ -0,0 +1,12 @@ +module Commands exposing (..) + +import Cli exposing (Command) + + +greet : Command +greet = + { name = "greet" + , params = [ + { name = "name" + } ] + } diff --git a/src/Main.elm b/src/Main.elm index 1db13d0..517065f 100644 --- a/src/Main.elm +++ b/src/Main.elm @@ -16,6 +16,9 @@ import Json.Encode as E import Task import Url +import Cli +import Commands exposing (greet) + -- MAIN @@ -558,7 +561,7 @@ runHello : CommandRunner runHello model args = case List.head args of Nothing -> - ( { model | content = model.content ++ [ text "\nHello World!"] }, Cmd.none ) + ( { model | content = model.content ++ [ text "\nHello World!" ] }, Cmd.none ) _ -> ( { model | content = model.content ++ wrongArgs HelloCommand 0 args }, Cmd.none )