coalpit: DSV (de)serialization

[ bsd3, console, library ] [ Propose Tags ]

The library generates parsers and printers for given data types, in the form of command-line arguments or DSVs – so that they can be used to quickly get CLIs via a shared library, while being suitable for scripting and as user interfaces.


[Skip to Readme]

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

Candidates

  • No Candidates
Versions [RSS] 0.1.1.0, 0.1.1.1, 0.2.0.0
Change log ChangeLog.md
Dependencies base (>=4.9 && <5), network-uri (>=2.6 && <3), parsec (>=3 && <4), scientific (>=0.3 && <1), time (>=1.6 && <2) [details]
License BSD-3-Clause
Author defanor
Maintainer defanor@uberspace.net
Category Console
Bug tracker https://github.com/defanor/coalpit/issues
Source repo head: git clone https://github.com/defanor/coalpit
Uploaded by defanor at 2024-02-03T15:10:39Z
Distributions
Reverse Dependencies 1 direct, 0 indirect [details]
Downloads 1383 total (9 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2024-02-03 [all 1 reports]

Readme for coalpit-0.2.0.0

[back to package description]

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, 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:

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

Its serialized version with the default options is:

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)