nri-redis-0.4.1.1: src/Redis/Codec.hs
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Redis.Codec where
import qualified Data.Aeson as Aeson
import Data.ByteString (ByteString)
import qualified Data.ByteString.Lazy
import qualified Data.Text.Encoding
import qualified Redis.Internal as Internal
import qualified Prelude
data Codec a = Codec
{ codecEncoder :: Encoder a,
codecDecoder :: Decoder a
}
type Encoder a = a -> ByteString
type Decoder a = ByteString -> Result Internal.Error a
jsonCodec :: (Aeson.FromJSON a, Aeson.ToJSON a) => Codec a
jsonCodec = Codec jsonEncoder jsonDecoder
jsonEncoder :: (Aeson.ToJSON a) => Encoder a
jsonEncoder = Aeson.encode >> Data.ByteString.Lazy.toStrict
jsonDecoder :: (Aeson.FromJSON a) => Decoder a
jsonDecoder byteString =
case Aeson.eitherDecodeStrict' byteString of
Prelude.Right decoded -> Ok decoded
Prelude.Left err ->
Internal.DecodingError (Text.fromList err)
|> Err
byteStringCodec :: Codec ByteString
byteStringCodec = Codec identity Ok
textCodec :: Codec Text
textCodec = Codec Data.Text.Encoding.encodeUtf8 (Data.Text.Encoding.decodeUtf8 >> Ok)