initial cli library

This commit is contained in:
mtgmonkey 2025-06-03 17:36:18 -04:00
parent 1732aae58b
commit e134f20fca
4 changed files with 128 additions and 1 deletions

View file

@ -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
];
};
};
};
}

103
src/Cli.elm Normal file
View file

@ -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

12
src/Commands.elm Normal file
View file

@ -0,0 +1,12 @@
module Commands exposing (..)
import Cli exposing (Command)
greet : Command
greet =
{ name = "greet"
, params = [
{ name = "name"
} ]
}

View file

@ -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 )