Implementing jq in Haskell
jq is a command-line JSON processor. It is also a domain-specific combinator language, which makes it easy to analyse and optimize. This project aims to reimplement jq in Haskell, mostly because it's fun.
There is currently no executable. To see the tests that pass you can:
$ git clone https://github.com/sshine/hs-jq.git
$ cd hs-jq
$ stack test
You can also experiment with the parser manually using GHCi:
$ stack ghci
> parseExpr "def map(f): [ .[] | f ]; map(.foo)"
Right (FuncDef "map" [FilterParam "f"]
(List [Pipe (ValueIterator Identity) (FilterCall "f" Nothing)])
(FilterCall "map" (Just [DotField "foo"])))
I think jq is a really cool domain-specific language, but I'm really bad at it.
Maybe if I write an interpreter for it, I will become better at it.
This implementation will
Writing property-based tests in Haskell is a lot more convenient than doing so in C. This will give me an opportunity to experiment with Hedgehog.
It would be really cool if you could transform Aeson Value
s using a
quasi-quoter. This would give me a chance to explore how quasi-quoters
work in Haskell.
slugs :: Value -> Either JqError Value
slugs = [jq| .exercises | map(.slug) |]
stedolan/jq
: "Command-line JSON processor"chrisdone/jl
: "Functional sed for JSON"haskell-works/hw-jq
: From 2017, appears very similar to this project.Parser: 72 out of 653 tests failed.
If you like this project, or if you're looking for an opportunity to practice writing open source Haskell, feel free to open an issue or a PR, or send me an email. A good starting point could be to look through issues labelled "help wanted".
In connection to Hacktoberfest 2019 I received 9 PRs. Thanks a bunch, guys!