packages feed

hyperbole-0.5.0: src/Web/Hyperbole/Data/JSON.hs

module Web.Hyperbole.Data.JSON (JSON (..), ToJSON, FromJSON) where

import Data.Aeson as A
import Data.String.Conversions (cs)
import Web.Hyperbole.Data.Encoded
import Web.Hyperbole.Data.Param


-- JSON Encoded Data ------------------------------------

-- | This type always encodes data via JSON
newtype JSON a = JSON a


instance (ToJSON a) => ToEncoded (JSON a) where
  toEncoded (JSON a) = Encoded "" [jsonParam a]
instance (FromJSON a) => FromEncoded (JSON a) where
  parseEncoded (Encoded _ [ParamValue t]) = do
    JSON <$> A.eitherDecode (cs t)
  parseEncoded (Encoded _ prms) = do
    Left $ "Could not parse JSON Encoded, expected one param: " <> show prms