summaryrefslogtreecommitdiff
path: root/README.md
blob: cd9d796b9d0b9fcd396b6f56c5cada31f07f23e8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# Coalpit

Coalpit is a library for building command-line interfaces: the goal is
to get interfaces quickly and easily, while keeping them
language-agnostic and more user- and shell scripting-friendly than
JSON and similar formats.

Given a type, it derives instances to print and parse it as
command-line arguments or DSVs, as well as to compose usage
instructions. The resulting deserialization wouldn't be as nice as
that of
e.g.
[optparse-generic](https://hackage.haskell.org/package/optparse-generic),
but the aim here is to handle more or less arbitrary types.


## Example

An example is available in `examples/Basic.hs`. Given the following
Haskell value:

```haskell
Input { something = Nothing
      , fooBar = Just (Foo (FooArgs { arg1 = 1
                                    , arg2 = "a string"}))
      , fooBar2 = Bar}
```

Its serialized version with the default options is:

```haskell
input nothing just foo fooargs 1 "a string" bar
```

And its usage string:

```
input [--something] (nothing | just STRING) [--foobar] (nothing | just (foo fooargs [--arg1] INT [--arg2] STRING | bar)) [--foobar2] (foo fooargs [--arg1] INT [--arg2] STRING | bar)
```

Other versions can be produced by varying selector name policy. Below
are triples of a policy, a corresponding example serialization, and an
example usage string (output of the `help` function from the example):

```
SNDisable
test : 1 : 2 : 3 [] just "a string"
test ([] | : INT ([] | :...)) (nothing | just STRING)
SNDisable
test : 1 : 2 : 3 [] nothing
test ([] | : INT ([] | :...)) (nothing | just STRING)
SNAvoid
test : 1 : 2 : 3 [] just "a string"
test [--foo] ([] | : INT ([] | :...)) [--bar] (nothing | just STRING)
SNAvoid
test : 1 : 2 : 3 [] nothing
test [--foo] ([] | : INT ([] | :...)) [--bar] (nothing | just STRING)
SNPrefer
test --foo : 1 : 2 : 3 [] --bar just "a string"
test [--foo] ([] | : INT ([] | :...)) [--bar] (nothing | just STRING)
SNPrefer
test --foo : 1 : 2 : 3 [] --bar nothing
test [--foo] ([] | : INT ([] | :...)) [--bar] (nothing | just STRING)
SNRequire
test --foo : 1 : 2 : 3 [] --bar just "a string"
test --foo ([] | : INT ([] | :...)) --bar (nothing | just STRING)
SNRequire
test --foo : 1 : 2 : 3 [] --bar nothing
test --foo ([] | : INT ([] | :...)) --bar (nothing | just STRING)
```