named-text-1.1.1.0: Data/Name/JSON.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
{-|
This module provides a 'JSONStyle' Named style that can be used for JSON
encoding/decoding. It also provides conversion to and from that style from the
regular 'UTF8' style, as well as an "aeson" 'ToJSON' and 'FromJSON' instance.
-}
module Data.Name.JSON where
import Data.Aeson
import Data.Aeson.Types
import Data.Functor.Contravariant ( (>$<) )
import Data.Name
import Data.String ( IsString(fromString) )
-- | The JSONStyle of Named objects can be directly transformed to and from JSON
-- (via Aeson's ToJSON and FromJSON classes). The Named nameOf is not
-- represented in the JSON form; field names are expected to be provided by the
-- Named field name itself. Bi-directional conversions between the JSON style
-- and the UTF8 style is automatic.
type JSONStyle = "JSON" :: NameStyle
instance NameText JSONStyle
instance ConvertNameStyle JSONStyle UTF8 nameOf
instance ConvertNameStyle UTF8 JSONStyle nameOf
instance ConvertNameStyle JSONStyle CaseInsensitive nameOf
instance ConvertNameStyle CaseInsensitive JSONStyle nameOf
-- -- The generic instance results in an object: { "name": "..." } This
-- -- instance declaration avoids that and causes the JSON form to be a simple
-- -- string. Currently there's no FromJSON, although it's likely the generic
-- -- instance would successfully work under OverloadedStrings
instance ToJSON (Named JSONStyle nameTy) where
toJSON = toJSON . nameText
instance ToJSONKey (Named JSONStyle nameTy) where
toJSONKey = toJSONKeyText nameText
instance FromJSON (Named JSONStyle nameTy) where
parseJSON j = fromString <$> parseJSON j
instance FromJSONKey (Named JSONStyle nameTy) where
fromJSONKey = FromJSONKeyText fromText
instance ToJSON (Name nameTy) where
toJSON = toJSON . convertStyle @UTF8 @JSONStyle
instance ToJSONKey (Name nameTy) where
toJSONKey = convertStyle @UTF8 @JSONStyle >$< toJSONKey
instance FromJSON (Name nameTy) where
parseJSON j = convertStyle @JSONStyle @UTF8 . fromString <$> parseJSON j
instance FromJSONKey (Name nameTy) where
fromJSONKey = convertStyle @JSONStyle @UTF8 <$> fromJSONKey
instance ToJSON (Named CaseInsensitive nameTy) where
toJSON = toJSON . convertStyle @CaseInsensitive @JSONStyle
instance ToJSONKey (Named CaseInsensitive nameTy) where
toJSONKey = convertStyle @CaseInsensitive @JSONStyle >$< toJSONKey
instance FromJSON (Named CaseInsensitive nameTy) where
parseJSON j = convertStyle @JSONStyle @CaseInsensitive . fromString <$> parseJSON j
instance FromJSONKey (Named CaseInsensitive nameTy) where
fromJSONKey = convertStyle @JSONStyle @CaseInsensitive <$> fromJSONKey