initial cli library
This commit is contained in:
parent
1732aae58b
commit
e134f20fca
4 changed files with 128 additions and 1 deletions
|
@ -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
103
src/Cli.elm
Normal 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
12
src/Commands.elm
Normal file
|
@ -0,0 +1,12 @@
|
|||
module Commands exposing (..)
|
||||
|
||||
import Cli exposing (Command)
|
||||
|
||||
|
||||
greet : Command
|
||||
greet =
|
||||
{ name = "greet"
|
||||
, params = [
|
||||
{ name = "name"
|
||||
} ]
|
||||
}
|
|
@ -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 )
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue