{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE NoMonoPatBinds #-}
import Types
import Data.Iso
import Language.JsonGrammar
import Prelude hiding (id, (.), head, either)
import Control.Category
import Data.Aeson (Object)
import Test.Framework (Test, defaultMain)
import Test.Framework.Providers.HUnit (testCase)
import Test.HUnit (assertEqual)
person = $(deriveIsos ''Person)
(male, female) = $(deriveIsos ''Gender)
coords = $(deriveIsos ''Coords)
instance Json Person where
grammar = person . object
( prop "naam"
. prop "geslacht"
. prop "leeftijd"
. coordsProps
)
instance Json Gender where
grammar = male . litJson "man"
<> female . litJson "vrouw"
coordsProps :: Iso (Object :- t) (Object :- Coords :- t)
coordsProps = duck coords . prop "lat" . prop "lng"
anna :: Person
anna = Person "Anna" Female 36 (Coords 53.0163038 5.1993053)
main :: IO ()
main = defaultMain [personTest]
personTest :: Test
personTest = testCase "Person" (assertEqual "" anna anna')
where
Just anna' = fromJson annaJson
Just annaJson = toJson anna