From 4beea4536a36322e15665de74c96926f0cf5fe7b Mon Sep 17 00:00:00 2001 From: defanor Date: Fri, 25 Nov 2016 06:35:55 +0300 Subject: Initial commit --- README.md | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 README.md (limited to 'README.md') diff --git a/README.md b/README.md new file mode 100644 index 0000000..63db06d --- /dev/null +++ b/README.md @@ -0,0 +1,51 @@ +# Coalpit + +Coalpit is a library for building command-line program +interfaces. They are like command-line user interfaces, but for +programs. + +Given a type, it derives instances to print and parse it as +command-line arguments. + +The goal is to +faciliate +[the KISS principle](https://en.wikipedia.org/wiki/KISS_principle) +preservation for interfaces between system components in certain +(rather [unixy](https://en.wikipedia.org/wiki/Unix_philosophy)) +architectures. Described in more detail in +the +[command-line program interface](https://defanor.uberspace.net/notes/command-line-program-interface.html) note. + +Not production-ready yet, merely a prototype. + + +## Example + +There is an example in `Example.hs`, but here are some bits: + +```haskell +data Y = Foo Bool Int + | Bar Int + | Baz +data X = X String (Maybe Int) (Maybe [Int]) Y Y String +$(deriveArgs ''Y) +$(deriveArgs ''X) +``` + +`toArgs` serializes data into arguments, and `fromArgs` deserializes +it: `X "test" Nothing (Just [1,2,3]) (Foo True 1) Baz "end"` ↔ `x +"test" n j 1,2,3 foo t 1 baz "end"`. + + +## TODO + +What it currently lacks, but what should be done, roughly in that +order: + +* Proper parsing: use optparse-applicative, Parsec, or a custom + parser, but something with error handling and more flexible. +* Named arguments (via records), not just positional ones. +* Optional arguments: once the named ones will be there, `Maybe a` + could be handled nicer. +* Help messages. +* Documentation. -- cgit v1.2.3