module Restyler.Config.Statuses
    ( Statuses(..)
    )
where

import Restyler.Prelude

import Data.Aeson
import Data.Aeson.Casing
import Data.Aeson.Types (typeMismatch)
import qualified Data.Aeson.Types as Aeson
import Restyler.Config.ExpectedKeys

data Statuses = Statuses
    { Statuses -> Bool
sDifferences :: Bool
    , Statuses -> Bool
sNoDifferences :: Bool
    , Statuses -> Bool
sError :: Bool
    }
    deriving (Statuses -> Statuses -> Bool
(Statuses -> Statuses -> Bool)
-> (Statuses -> Statuses -> Bool) -> Eq Statuses
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Statuses -> Statuses -> Bool
$c/= :: Statuses -> Statuses -> Bool
== :: Statuses -> Statuses -> Bool
$c== :: Statuses -> Statuses -> Bool
Eq, Int -> Statuses -> ShowS
[Statuses] -> ShowS
Statuses -> String
(Int -> Statuses -> ShowS)
-> (Statuses -> String) -> ([Statuses] -> ShowS) -> Show Statuses
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Statuses] -> ShowS
$cshowList :: [Statuses] -> ShowS
show :: Statuses -> String
$cshow :: Statuses -> String
showsPrec :: Int -> Statuses -> ShowS
$cshowsPrec :: Int -> Statuses -> ShowS
Show, (forall x. Statuses -> Rep Statuses x)
-> (forall x. Rep Statuses x -> Statuses) -> Generic Statuses
forall x. Rep Statuses x -> Statuses
forall x. Statuses -> Rep Statuses x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Statuses x -> Statuses
$cfrom :: forall x. Statuses -> Rep Statuses x
Generic)

-- brittany-disable-next-binding

instance FromJSON Statuses where
    parseJSON :: Value -> Parser Statuses
parseJSON (Object o :: Object
o) = do
        [String] -> Object -> Parser ()
forall v. [String] -> HashMap Text v -> Parser ()
validateObjectKeys ["differences", "no_differences", "error"] Object
o
        Bool -> Bool -> Bool -> Statuses
Statuses
            (Bool -> Bool -> Bool -> Statuses)
-> Parser Bool -> Parser (Bool -> Bool -> Statuses)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Text -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? "differences" Parser (Maybe Bool) -> Bool -> Parser Bool
forall a. Parser (Maybe a) -> a -> Parser a
.!= Bool
True
            Parser (Bool -> Bool -> Statuses)
-> Parser Bool -> Parser (Bool -> Statuses)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? "no_differences" Parser (Maybe Bool) -> Bool -> Parser Bool
forall a. Parser (Maybe a) -> a -> Parser a
.!= Bool
True
            Parser (Bool -> Statuses) -> Parser Bool -> Parser Statuses
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Text -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? "error" Parser (Maybe Bool) -> Bool -> Parser Bool
forall a. Parser (Maybe a) -> a -> Parser a
.!= Bool
True
    parseJSON (Aeson.Bool b :: Bool
b) = Statuses -> Parser Statuses
forall (f :: * -> *) a. Applicative f => a -> f a
pure Statuses :: Bool -> Bool -> Bool -> Statuses
Statuses
        { sDifferences :: Bool
sDifferences = Bool
b
        , sNoDifferences :: Bool
sNoDifferences = Bool
b
        , sError :: Bool
sError = Bool
b
        }
    parseJSON x :: Value
x = String -> Value -> Parser Statuses
forall a. String -> Value -> Parser a
typeMismatch "Boolean or Statuses Configuration" Value
x

instance ToJSON Statuses where
    toJSON :: Statuses -> Value
toJSON = Options -> Statuses -> Value
forall a.
(Generic a, GToJSON Value Zero (Rep a)) =>
Options -> a -> Value
genericToJSON (Options -> Statuses -> Value) -> Options -> Statuses -> Value
forall a b. (a -> b) -> a -> b
$ ShowS -> Options
aesonPrefix ShowS
snakeCase
    toEncoding :: Statuses -> Encoding
toEncoding = Options -> Statuses -> Encoding
forall a.
(Generic a, GToJSON Encoding Zero (Rep a)) =>
Options -> a -> Encoding
genericToEncoding (Options -> Statuses -> Encoding)
-> Options -> Statuses -> Encoding
forall a b. (a -> b) -> a -> b
$ ShowS -> Options
aesonPrefix ShowS
snakeCase