13 | parseCommand : (cmd : Command nm) -> List String ->
14 | ParsedCommandT Maybe Maybe nm cmd -> Error (ParsedCommandT Maybe Maybe nm cmd)
17 | parseModifier : (cmd : Command nm) -> {modName : String} ->
18 | (pos : modName `IsField` cmd.modifiers) -> (rest : List String) ->
19 | ParsedCommandT Maybe Maybe nm cmd ->
20 | (factory : ParsedModifierT Prelude.id Prelude.id (snd $
field pos) ->
21 | Error (ParsedModifiersT Maybe Maybe cmd.modifiers)) ->
22 | Error (ParsedCommandT Maybe Maybe nm cmd)
24 | parseCommand cmd [] old = pure old
25 | parseCommand cmd ("--" :: xs) old = do
26 | u <- cmd.arguments.parse old.arguments xs
27 | pure $
{ arguments := u } old
29 | parseCommand cmd (x :: xs) old
30 | = case x `isField` cmd.modifiers of
31 | No _ => do u <- old.arguments.update x
32 | parseCommand cmd xs $
{ arguments := u} old
33 | Yes pos => parseModifier cmd pos xs old (old.modifiers.update pos)
35 | parseModifier cmd pos rest old factory with (snd $
field pos)
36 | parseModifier cmd pos rest old factory | MkFlag flg = do
37 | mods <- factory True
38 | parseCommand cmd rest $
{ modifiers := mods } old
39 | parseModifier cmd pos rest old factory | MkOption opt
41 | [] => throwE (MissingOptArg modName)
42 | x :: xs => do args <- (opt.project "arguments").parser x
43 | mods <- factory args
44 | parseCommand cmd xs $
{ modifiers := mods} old
47 | parse : (cmd : Command nm) -> List String -> Error $
ParseTreeT Maybe Maybe cmd
48 | parse cmd [] = pure (Here initParsedCommand)
49 | parse cmd xs@("--" :: _) = Here <$> parseCommand cmd xs initParsedCommand
50 | parse cmd ys@(x :: xs) = case x `isField` cmd.subcommands of
51 | Yes pos => There pos <$> parse (snd $
field pos) xs
52 | No _ => Here <$> parseCommand cmd ys initParsedCommand