{-# LANGUAGE DeriveGeneric         #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE TypeSynonymInstances  #-}

module HaskellWorks.Error.Types.RenderedError (
    RenderedError (..),

    ToRenderedError (..),
) where

import           Data.Aeson

import           HaskellWorks.Prelude

data RenderedError = RenderedError
    { RenderedError -> Text
error   :: Text
    , RenderedError -> Value
payload :: Value
    }
    deriving (RenderedError -> RenderedError -> Bool
(RenderedError -> RenderedError -> Bool)
-> (RenderedError -> RenderedError -> Bool) -> Eq RenderedError
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: RenderedError -> RenderedError -> Bool
== :: RenderedError -> RenderedError -> Bool
$c/= :: RenderedError -> RenderedError -> Bool
/= :: RenderedError -> RenderedError -> Bool
Eq, (forall x. RenderedError -> Rep RenderedError x)
-> (forall x. Rep RenderedError x -> RenderedError)
-> Generic RenderedError
forall x. Rep RenderedError x -> RenderedError
forall x. RenderedError -> Rep RenderedError x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. RenderedError -> Rep RenderedError x
from :: forall x. RenderedError -> Rep RenderedError x
$cto :: forall x. Rep RenderedError x -> RenderedError
to :: forall x. Rep RenderedError x -> RenderedError
Generic, Int -> RenderedError -> ShowS
[RenderedError] -> ShowS
RenderedError -> String
(Int -> RenderedError -> ShowS)
-> (RenderedError -> String)
-> ([RenderedError] -> ShowS)
-> Show RenderedError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> RenderedError -> ShowS
showsPrec :: Int -> RenderedError -> ShowS
$cshow :: RenderedError -> String
show :: RenderedError -> String
$cshowList :: [RenderedError] -> ShowS
showList :: [RenderedError] -> ShowS
Show)

instance ToJSON RenderedError where
    toJSON :: RenderedError -> Value
toJSON RenderedError
e =
        [Pair] -> Value
object
            [ Key
"error" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= RenderedError -> Text
error RenderedError
e
            , Key
"payload" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= RenderedError -> Value
payload RenderedError
e
            ]

class ToRenderedError a where
    toRenderedError :: a -> RenderedError

instance ToRenderedError RenderedError where
    toRenderedError :: RenderedError -> RenderedError
toRenderedError = RenderedError -> RenderedError
forall a. a -> a
id