module Eventful.Store.Sql.JSONString
( JSONString
, jsonStringSerializer
) where
import Data.Aeson
import Data.Text.Lazy (Text)
import qualified Data.Text.Lazy.Encoding as TLE
import Database.Persist
import Database.Persist.Sql
import Eventful.Serializer
newtype JSONString = JSONString { unJSONString :: Text }
deriving (Eq, PersistField)
instance PersistFieldSql JSONString where
sqlType _ = SqlOther "jsonb"
instance Show JSONString where
show = show . unJSONString
jsonStringSerializer :: (ToJSON a, FromJSON a) => Serializer a JSONString
jsonStringSerializer =
Serializer
encodeJSON
decodeJSON
decodeJSONEither
encodeJSON :: (ToJSON a) => a -> JSONString
encodeJSON = JSONString . TLE.decodeUtf8 . encode
decodeJSON :: (FromJSON a) => JSONString -> Maybe a
decodeJSON = decode . TLE.encodeUtf8 . unJSONString
decodeJSONEither :: (FromJSON a) => JSONString -> Either String a
decodeJSONEither = eitherDecode . TLE.encodeUtf8 . unJSONString