From 4518fe3ce66364a0dc86d989ab749bce6aa876c0 Mon Sep 17 00:00:00 2001 From: Profpatsch Date: Mon, 9 Sep 2019 01:42:29 +0200 Subject: First working fish subcommand completion. --- pkgs/profpatsch/dhallsh/Command/toList.dhall | 12 +++ pkgs/profpatsch/dhallsh/imports/Prelude.dhall | 1 + pkgs/profpatsch/dhallsh/main.dhall | 123 +++++++++++++++++--------- 3 files changed, 94 insertions(+), 42 deletions(-) create mode 100644 pkgs/profpatsch/dhallsh/Command/toList.dhall create mode 100644 pkgs/profpatsch/dhallsh/imports/Prelude.dhall (limited to 'pkgs/profpatsch/dhallsh') diff --git a/pkgs/profpatsch/dhallsh/Command/toList.dhall b/pkgs/profpatsch/dhallsh/Command/toList.dhall new file mode 100644 index 00000000..23605a3f --- /dev/null +++ b/pkgs/profpatsch/dhallsh/Command/toList.dhall @@ -0,0 +1,12 @@ +let Prelude = ../imports/Prelude.dhall + +let Command = ./type.dhall + +let toList + : ∀(a : Type) → (a → List Text) → Command a → List Text + = λ(a : Type) + → λ(f : a → List Text) + → λ(c : Command a) + → [ c.cmd ] # Prelude.List.concatMap a Text f c.args + +in toList diff --git a/pkgs/profpatsch/dhallsh/imports/Prelude.dhall b/pkgs/profpatsch/dhallsh/imports/Prelude.dhall new file mode 100644 index 00000000..8b2a62a0 --- /dev/null +++ b/pkgs/profpatsch/dhallsh/imports/Prelude.dhall @@ -0,0 +1 @@ +https://prelude.dhall-lang.org/package.dhall sha256:2acd9f8eae045eae46d8288d76b01678c4ac4883a58eadb6be0da00b3ba590cf diff --git a/pkgs/profpatsch/dhallsh/main.dhall b/pkgs/profpatsch/dhallsh/main.dhall index aea25bb1..36be6142 100644 --- a/pkgs/profpatsch/dhallsh/main.dhall +++ b/pkgs/profpatsch/dhallsh/main.dhall @@ -1,5 +1,4 @@ -let Prelude = - https://prelude.dhall-lang.org/package.dhall sha256:2acd9f8eae045eae46d8288d76b01678c4ac4883a58eadb6be0da00b3ba590cf +let Prelude = ./imports/Prelude.dhall let List/filterOptional = ./List/filterOptional.dhall @@ -15,14 +14,14 @@ let Complete = , description : Text , condition : - Optional Text + Optional (Command Argument) , short-option : Optional Text , long-option : Optional Text , long-option-old-style : Optional Text - , arguments : + , argument : Optional Text , keep-order : Bool @@ -34,6 +33,12 @@ let Complete = Optional Text } +let argCommandToList + : Command Argument → List Text + = ./Command/toList.dhall + Argument + (./Argument/toArgList.dhall ./OptionPrinter/newStyle.dhall) + let complete = λ(a : { cmd : Text, description : Text }) → { cmd = @@ -41,19 +46,19 @@ let complete = , description = a.description , condition = - None Text + None (Command Argument) , short-option = None Text , long-option = None Text , long-option-old-style = None Text - , arguments = + , argument = None Text , keep-order = False , no-files = - False + True , require-parameter = False , wraps = @@ -62,40 +67,74 @@ let complete = let completeToCommand : Complete → Command Argument - = let l = λ(o : Text) → Option.Long o - - in λ(c : Complete) - → let long = - λ(name : Text) - → λ(content : Text) + = λ(c : Complete) + → let long = + λ(name : Text) + → Prelude.Optional.map + Text + Argument + ( λ(content : Text) → Argument.Option { opt = Option.Long name, arg = content } + ) + + let flag = + λ(name : Text) + → λ(flag : Bool) + → if flag + + then Some (Argument.Flag (Option.Long name)) + + else None Argument + + let conditionToText = + λ(c : Command Argument) + → Prelude.Text.concatSep " " (argCommandToList c) + + let args = + [ long "command" (Some c.cmd) + , long "description" (Some c.description) + , Prelude.Optional.map + (Command Argument) + Argument + ( λ(c : Command Argument) + → Argument.Option + { opt = Option.Long "condition", arg = conditionToText c } + ) + c.condition + , long "short-option" c.short-option + , long "long-option" c.long-option + , long "old-option" c.long-option-old-style + , long "arguments" c.argument + , long "wraps" c.wraps + , flag "keep-order" c.keep-order + , flag "no-files" c.no-files + , flag "require-parameter" c.require-parameter + ] + : List (Optional Argument) + + let id = λ(a : Optional Argument) → a + + in { cmd = + "complete" + , args = + List/filterOptional (Optional Argument) Argument id args + : List Argument + } + +in let fishSeenSubcommandFn = "__fish_seen_subcommand_from" + + let fishUseSubcommandFn = "__fish_use_subcommand" + + let foo + : Command Argument + = completeToCommand + ( complete { cmd = "abc", description = "this is foo option" } + ⫽ { condition = + Some { cmd = fishUseSubcommandFn, args = [] : List Argument } + , argument = + Some "foo" + } + ) - let args = - [ Some (long "description" c.description) - , Prelude.Optional.map - Text - Argument - (long "condition") - c.condition - ] - : List (Optional Argument) - - let id = λ(a : Optional Argument) → a - - in { cmd = - c.cmd - , args = - List/filterOptional (Optional Argument) Argument id args - : List Argument - } - -in let foo = - completeToCommand (complete { cmd = "complete", description = "foo" }) - - in [ [ foo.cmd ] - # Prelude.List.concatMap - Argument - Text - (./Argument/toArgList.dhall ./OptionPrinter/newStyle.dhall) - foo.args - ] + in [ argCommandToList foo, [ "complete", "--do-complete=abc " ] ] + : List (List Text) -- cgit 1.4.1