Compare commits
6 Commits
Author | SHA1 | Date | |
---|---|---|---|
5b3b72e127 | |||
99ce77695c | |||
e55dc7556d | |||
14d25abc35 | |||
10ba753ee3 | |||
0b185aa3b9 |
@@ -3,7 +3,7 @@
|
||||
A simple CLI library for Carp.
|
||||
|
||||
```clojure
|
||||
(load "https://veitheller.de/git/carpentry/cli@0.0.2")
|
||||
(load "https://veitheller.de/git/carpentry/cli@0.0.6")
|
||||
|
||||
(defn main []
|
||||
(let [p (=> (CLI.new @"My super cool tool!")
|
||||
@@ -18,7 +18,7 @@ A simple CLI library for Carp.
|
||||
## Installation
|
||||
|
||||
```clojure
|
||||
(load "https://veitheller.de/git/carpentry/cli@0.0.2")
|
||||
(load "https://veitheller.de/git/carpentry/cli@0.0.6")
|
||||
```
|
||||
|
||||
## Usage
|
||||
@@ -43,8 +43,8 @@ manually.
|
||||
Once you’re done building your flag structure, you can run `CLI.parse`. It
|
||||
will not abort the program on error, instead it will tell you what went wrong
|
||||
in a `Result.Error`. If it succeeds, the `Result.Success` contains a `Map` from
|
||||
the long flag name to the value (the values are `Maybe`s, since they might be
|
||||
optional arguments.
|
||||
the long flag name to the value. The values are not in the map if they are
|
||||
unset.
|
||||
|
||||
<hr/>
|
||||
|
||||
|
69
cli.carp
69
cli.carp
@@ -6,7 +6,7 @@
|
||||
(doc CLI "is a simple CLI library for Carp.
|
||||
|
||||
```clojure
|
||||
(load \"https://veitheller.de/git/carpentry/cli@0.0.2\")
|
||||
(load \"https://veitheller.de/git/carpentry/cli@0.0.6\")
|
||||
|
||||
(defn main []
|
||||
(let [p (=> (CLI.new @\"My super cool tool!\")
|
||||
@@ -21,7 +21,7 @@
|
||||
## Installation
|
||||
|
||||
```clojure
|
||||
(load \"https://veitheller.de/git/carpentry/cli@0.0.2\")
|
||||
(load \"https://veitheller.de/git/carpentry/cli@0.0.6\")
|
||||
```
|
||||
|
||||
## Usage
|
||||
@@ -46,8 +46,8 @@ manually.
|
||||
Once you’re done building your flag structure, you can run `CLI.parse`. It
|
||||
will not abort the program on error, instead it will tell you what went wrong
|
||||
in a `Result.Error`. If it succeeds, the `Result.Success` contains a `Map` from
|
||||
the long flag name to the value (the values are `Maybe`s, since they might be
|
||||
optional arguments.")
|
||||
the long flag name to the value. The values are not in the map if they are
|
||||
unset.")
|
||||
(defmodule CLI
|
||||
(hidden Type)
|
||||
(private Type)
|
||||
@@ -55,11 +55,16 @@ optional arguments.")
|
||||
(Integer [Long])
|
||||
(Floating [Double])
|
||||
(Str [String])
|
||||
(None [])
|
||||
)
|
||||
|
||||
(defmodule Type
|
||||
(defn = [a b]
|
||||
(match @a
|
||||
(None)
|
||||
(match @b
|
||||
(None) true
|
||||
_ false)
|
||||
(Integer i)
|
||||
(match @b
|
||||
(Integer j) (= i j)
|
||||
@@ -83,7 +88,35 @@ optional arguments.")
|
||||
(match @t
|
||||
(Integer i) (str i)
|
||||
(Floating f) (str f)
|
||||
(Str s) (str s)))
|
||||
(Str s) (str s)
|
||||
(None) @"none"))
|
||||
|
||||
(defn to-int [x]
|
||||
(match x
|
||||
(Integer l) (Long.to-int l)
|
||||
_ 0))
|
||||
|
||||
(defn to-long [x]
|
||||
(match x
|
||||
(Integer l) l
|
||||
_ 0l))
|
||||
|
||||
(defn to-str [x]
|
||||
(match x
|
||||
(Str s) s
|
||||
_ @""))
|
||||
|
||||
(defn to-float [x]
|
||||
(match x
|
||||
(Floating d) (Double.to-float d)
|
||||
_ 0.0f))
|
||||
|
||||
(defn to-double [x]
|
||||
(match x
|
||||
(Floating d) d
|
||||
_ 0.0))
|
||||
|
||||
(defn zero [] (None))
|
||||
)
|
||||
|
||||
(hidden Tag)
|
||||
@@ -203,7 +236,10 @@ optional arguments.")
|
||||
|
||||
(defn to-map [m]
|
||||
(Array.reduce
|
||||
&(fn [a v] (Map.put a (Pair.a (Pair.a v)) (Pair.b (Pair.b v))))
|
||||
&(fn [a v]
|
||||
(match @(Pair.b (Pair.b v))
|
||||
(Maybe.Just e) (Map.put a (Pair.a (Pair.a v)) &e)
|
||||
(Maybe.Nothing) a))
|
||||
{}
|
||||
(values m)))
|
||||
)
|
||||
@@ -295,17 +331,22 @@ mesage is empty, `--help` was requested. If you don’t want to provide a
|
||||
(for [i 1 (System.get-args-len)]
|
||||
(let [x (System.get-arg i)]
|
||||
(if (or (String.starts-with? x "--") (String.starts-with? x "-"))
|
||||
(let [flag (Pattern.substitute #"^\-\-?" x "" 1)]
|
||||
(let [flag (Pattern.substitute #"^\-\-?" x "" 1)
|
||||
splt (String.split-by &flag &[\=])
|
||||
k (if (> (Array.length &splt) 1) (Array.unsafe-nth &splt 0) &flag)
|
||||
v (cond (> (Array.length &splt) 1) (Array.nth &splt 1)
|
||||
(< i (System.get-args-len))
|
||||
(do (set! i (Int.inc i)) (Maybe.Just @(System.get-arg i)))
|
||||
(Maybe.Nothing))]
|
||||
(cond
|
||||
(CmdMap.contains? &values &flag)
|
||||
(do
|
||||
(set! i (Int.inc i))
|
||||
(if (< i (System.get-args-len))
|
||||
(CmdMap.put! &values &flag (System.get-arg i))
|
||||
(CmdMap.contains? &values k)
|
||||
(match v
|
||||
(Maybe.Just val) (CmdMap.put! &values k &val)
|
||||
(Maybe.Nothing)
|
||||
(do
|
||||
(set! res (Result.Error (fmt "No value for: %s" &flag)))
|
||||
(break))))
|
||||
(or (= &flag "help") (= &flag "h"))
|
||||
(break)))
|
||||
(or (= k "help") (= k "h"))
|
||||
(do
|
||||
(set! res (Result.Error @""))
|
||||
(break))
|
||||
|
@@ -30,7 +30,7 @@
|
||||
</h1>
|
||||
<div class="module-description">
|
||||
<p>is a simple CLI library for Carp.</p>
|
||||
<pre><code class="language-clojure">(load "https://veitheller.de/git/carpentry/cli@0.0.2")
|
||||
<pre><code class="language-clojure">(load "https://veitheller.de/git/carpentry/cli@0.0.6")
|
||||
|
||||
(defn main []
|
||||
(let [p (=> (CLI.new @"My super cool tool!")
|
||||
@@ -42,7 +42,7 @@
|
||||
(Result.Error msg) (do (IO.errorln &msg) (CLI.usage &p)))))
|
||||
</code></pre>
|
||||
<h2>Installation</h2>
|
||||
<pre><code class="language-clojure">(load "https://veitheller.de/git/carpentry/cli@0.0.2")
|
||||
<pre><code class="language-clojure">(load "https://veitheller.de/git/carpentry/cli@0.0.6")
|
||||
</code></pre>
|
||||
<h2>Usage</h2>
|
||||
<p><code>CLI</code> should be built using combinators, as in the example above. It has, as of
|
||||
@@ -61,8 +61,8 @@ manually.</p>
|
||||
<p>Once you’re done building your flag structure, you can run <code>CLI.parse</code>. It
|
||||
will not abort the program on error, instead it will tell you what went wrong
|
||||
in a <code>Result.Error</code>. If it succeeds, the <code>Result.Success</code> contains a <code>Map</code> from
|
||||
the long flag name to the value (the values are <code>Maybe</code>s, since they might be
|
||||
optional arguments.</p>
|
||||
the long flag name to the value. The values are not in the map if they are
|
||||
unset.</p>
|
||||
|
||||
</div>
|
||||
<div class="binder">
|
||||
@@ -197,7 +197,7 @@ optional arguments.</p>
|
||||
defn
|
||||
</div>
|
||||
<p class="sig">
|
||||
(λ [(Ref Parser)] (Result (Map String (Maybe Type)) String))
|
||||
(λ [(Ref Parser)] (Result (Map String Type) String))
|
||||
</p>
|
||||
<pre class="args">
|
||||
(parse p)
|
||||
|
@@ -3,8 +3,11 @@
|
||||
(defn main []
|
||||
(let [p (=> (CLI.new @"My super cool tool!")
|
||||
(CLI.add &(CLI.int "flag" "f" "my flag" true))
|
||||
(CLI.add &(CLI.str "thing" "t" "my thing" false @"hi" &[@"a" @"b" @"hi"])))]
|
||||
(CLI.add &(CLI.str "thing" "t" "my thing" false @"hi" &[@"a" @"b" @"hi"]))
|
||||
(CLI.add &(CLI.str "other" "o" "my thing" false)))]
|
||||
(match (CLI.parse &p)
|
||||
(Result.Success flags)
|
||||
(println* &(str &(Map.get &flags "flag")) " " &(str &(Map.get &flags "thing")))
|
||||
(println*
|
||||
&(str &(Map.get &flags "flag")) " " &(str &(Map.get &flags "thing"))
|
||||
" " &(str &(Map.get &flags "other")))
|
||||
(Result.Error msg) (do (IO.errorln &msg) (CLI.usage &p)))))
|
||||
|
Reference in New Issue
Block a user