{-# OPTIONS_GHC -fno-warn-dodgy-exports -fno-warn-duplicate-exports #-}

module Autodocodec.Aeson
  ( -- * Encoding and decoding JSON
    encodeJSONViaCodec,
    eitherDecodeJSONViaCodec,

    -- * Instantiating @ToJSON@
    toJSONViaCodec,
    toJSONVia,
    toEncodingViaCodec,
    toEncodingVia,

    -- * Instantiating @FromJSON@
    parseJSONViaCodec,
    parseJSONVia,

    -- * To makes sure we definitely export everything.
    module Autodocodec.Aeson.Decode,
    module Autodocodec.Aeson.Encode,
  )
where

import Autodocodec.Aeson.Decode
import Autodocodec.Aeson.Encode
import Autodocodec.Class
import Autodocodec.DerivingVia
import qualified Data.Aeson as Aeson
import qualified Data.ByteString.Lazy as LB

-- | Encode a value as a JSON 'LB.ByteString' via its type's 'codec'.
encodeJSONViaCodec :: HasCodec a => a -> LB.ByteString
encodeJSONViaCodec :: a -> ByteString
encodeJSONViaCodec = Autodocodec a -> ByteString
forall a. ToJSON a => a -> ByteString
Aeson.encode (Autodocodec a -> ByteString)
-> (a -> Autodocodec a) -> a -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Autodocodec a
forall a. a -> Autodocodec a
Autodocodec

-- | Parse a JSON 'LB.ByteString' using a type's 'codec'.
eitherDecodeJSONViaCodec :: HasCodec a => LB.ByteString -> Either String a
eitherDecodeJSONViaCodec :: ByteString -> Either String a
eitherDecodeJSONViaCodec = (Autodocodec a -> a)
-> Either String (Autodocodec a) -> Either String a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Autodocodec a -> a
forall a. Autodocodec a -> a
unAutodocodec (Either String (Autodocodec a) -> Either String a)
-> (ByteString -> Either String (Autodocodec a))
-> ByteString
-> Either String a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Either String (Autodocodec a)
forall a. FromJSON a => ByteString -> Either String a
Aeson.eitherDecode