{-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE TemplateHaskell #-} {-| Module: Data.Aeson.TextValue Description: Type for things that can be embedded in a JSON string Provides @FromJSON@ and @ToJSON@ instances for anything that has @FromText@ and @ToText@ instances, e.g. @TextValue Text@, @(FromJSON a, ToJSON a) => TextValue (Embedded a)@, @TextValue Base64@ -} module Data.Aeson.TextValue where import Control.Lens.TH import Data.Aeson import Data.String import Network.AWS.Data.Text (FromText (..), ToText (..), fromText) newtype TextValue a = TextValue { _unTextValue :: a } deriving (Eq, Show, IsString) instance FromText a => FromJSON (TextValue a) where parseJSON = withText "TextValue" $ fmap TextValue . either fail pure . fromText instance ToText a => ToJSON (TextValue a) where toJSON = toJSON . toText . _unTextValue toEncoding = toEncoding . toText . _unTextValue $(makeLenses ''TextValue)