packages feed

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)