tyro: Type derived JSON parsing using Aeson

[ bsd3, json, library, text, web ] [ Propose Tags ]

A library for deriving JSON parsers (using Aeson) by indicating JSON structure at the type level.


[Skip to Readme]
Versions 0.1.1.0, 0.1.1.1, 0.2.0.0, 0.3.0.0
Dependencies aeson, base (>=4.9 && <5), bytestring, protolude (>=0.1.6 && <0.2), reflection, singletons, text, vector [details]
License BSD-3-Clause
Copyright 2017 Richard Lupton
Author Richard Lupton
Maintainer example@example.com
Category Text, Web, JSON
Home page https://github.com/rlupton20/tyro#readme
Source repo head: git clone https://github.com/rlupton20/tyro
Uploaded by rlupton20 at Sat Jul 8 13:52:56 UTC 2017
Distributions NixOS:0.3.0.0
Downloads 890 total (10 in the last 30 days)
Rating (no votes yet) [estimated by rule of succession]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2017-07-08 [all 1 reports]
Hackage Matrix CI

Modules

[Index]

Downloads

Maintainer's Corner

For package maintainers and hackage trustees


Readme for tyro-0.3.0.0

[back to package description]

tyro

tyro is a dependently typed JSON parsing library, that provides a quick way to create JSON parsers by deriving them from a type level description of the position of the value to be obtained. It provides some of the same functionality as Aeson lenses, but derives the parsers from types rather than doing a generic parse and applying prisms. This was mostly an experiment in dependent typing.

Examples

Type driven interface

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}

import Data.Tyro
import Data.Aeson (decode)
import qualified Data.ByteString.Lazy as B

json = "{\"key1\":[{\"key2\":41},{\"key2\":42}]}" :: B.ByteString

-- Extract [41, 42] inside the Tyro types
parsed = decode json :: Maybe ("key1" >%> List ("key2" >%> Extract Integer))

-- We can dispose of the types using unwrap
values :: Maybe [Integer]
values = fmap unwrap parsed

Value driven interface (experimental)

The value driven interface is still experimental, and in the process of being refined.

{-# LANGUAGE OverloadedStrings #-}
import Data.Tyro

json = "{\"key1\": {\"key2\" :  [41, 42]}}" :: B.ByteString

-- Extract [41, 42] inside the JSON
parsed = json %%> "key1" >%> "key2" >%> extract :: Maybe [Integer]