packages feed

autodocodec-0.4.1.0: src/Autodocodec/DerivingVia.hs

module Autodocodec.DerivingVia where

import Autodocodec.Aeson.Decode (parseJSONViaCodec)
import Autodocodec.Aeson.Encode (toEncodingViaCodec, toJSONViaCodec)
import Autodocodec.Class (HasCodec)
import qualified Data.Aeson as JSON

-- | 'Autodocodec' is a wrapper to provide codec-based deriving strategies.
--
-- === Example usage
--
-- > data Via = Via {viaOne :: !Text, viaTwo :: !Text}
-- >   deriving stock (Show, Eq, Generic)
-- >   deriving (FromJSON, ToJSON) via (Autodocodec Via)
-- >
-- > instance HasCodec Via where
-- >   codec =
-- >     object "Via" $
-- >       Via
-- >         <$> requiredField "one" "first field" .= viaOne
-- >         <*> requiredField "two" "second field" .= viaTwo
newtype Autodocodec a = Autodocodec {unAutodocodec :: a}

instance (HasCodec a) => JSON.ToJSON (Autodocodec a) where
  toJSON = toJSONViaCodec . unAutodocodec
  toEncoding = toEncodingViaCodec . unAutodocodec

instance (HasCodec a) => JSON.FromJSON (Autodocodec a) where
  parseJSON = fmap Autodocodec <$> parseJSONViaCodec