{-# LANGUAGE LambdaCase #-}

module Restyler.Config.ChangedPaths
    ( ChangedPathsConfig(..)
    , MaximumChangedPathsOutcome(..)
    )
where

import Restyler.Prelude

import Data.Aeson
import Data.Aeson.Casing
import Restyler.Config.ExpectedKeys

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

instance FromJSON ChangedPathsConfig where
    parseJSON :: Value -> Parser ChangedPathsConfig
parseJSON = Options -> Value -> Parser ChangedPathsConfig
forall a.
(Generic a, GFromJSON Zero (Rep a), Selectors (Rep a)) =>
Options -> Value -> Parser a
genericParseJSONValidated (Options -> Value -> Parser ChangedPathsConfig)
-> Options -> Value -> Parser ChangedPathsConfig
forall a b. (a -> b) -> a -> b
$ ShowS -> Options
aesonPrefix ShowS
snakeCase

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

data MaximumChangedPathsOutcome
    = MaximumChangedPathsOutcomeSkip
    | MaximumChangedPathsOutcomeError
    deriving (MaximumChangedPathsOutcome -> MaximumChangedPathsOutcome -> Bool
(MaximumChangedPathsOutcome -> MaximumChangedPathsOutcome -> Bool)
-> (MaximumChangedPathsOutcome
    -> MaximumChangedPathsOutcome -> Bool)
-> Eq MaximumChangedPathsOutcome
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MaximumChangedPathsOutcome -> MaximumChangedPathsOutcome -> Bool
$c/= :: MaximumChangedPathsOutcome -> MaximumChangedPathsOutcome -> Bool
== :: MaximumChangedPathsOutcome -> MaximumChangedPathsOutcome -> Bool
$c== :: MaximumChangedPathsOutcome -> MaximumChangedPathsOutcome -> Bool
Eq, Int -> MaximumChangedPathsOutcome -> ShowS
[MaximumChangedPathsOutcome] -> ShowS
MaximumChangedPathsOutcome -> String
(Int -> MaximumChangedPathsOutcome -> ShowS)
-> (MaximumChangedPathsOutcome -> String)
-> ([MaximumChangedPathsOutcome] -> ShowS)
-> Show MaximumChangedPathsOutcome
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MaximumChangedPathsOutcome] -> ShowS
$cshowList :: [MaximumChangedPathsOutcome] -> ShowS
show :: MaximumChangedPathsOutcome -> String
$cshow :: MaximumChangedPathsOutcome -> String
showsPrec :: Int -> MaximumChangedPathsOutcome -> ShowS
$cshowsPrec :: Int -> MaximumChangedPathsOutcome -> ShowS
Show)

instance FromJSON MaximumChangedPathsOutcome where
    parseJSON :: Value -> Parser MaximumChangedPathsOutcome
parseJSON = String
-> (Text -> Parser MaximumChangedPathsOutcome)
-> Value
-> Parser MaximumChangedPathsOutcome
forall a. String -> (Text -> Parser a) -> Value -> Parser a
withText "MaximumChangedPathsOutcome" ((Text -> Parser MaximumChangedPathsOutcome)
 -> Value -> Parser MaximumChangedPathsOutcome)
-> (Text -> Parser MaximumChangedPathsOutcome)
-> Value
-> Parser MaximumChangedPathsOutcome
forall a b. (a -> b) -> a -> b
$ \case
        "skip" -> MaximumChangedPathsOutcome -> Parser MaximumChangedPathsOutcome
forall (f :: * -> *) a. Applicative f => a -> f a
pure MaximumChangedPathsOutcome
MaximumChangedPathsOutcomeSkip
        "error" -> MaximumChangedPathsOutcome -> Parser MaximumChangedPathsOutcome
forall (f :: * -> *) a. Applicative f => a -> f a
pure MaximumChangedPathsOutcome
MaximumChangedPathsOutcomeError
        x :: Text
x -> String -> Parser MaximumChangedPathsOutcome
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser MaximumChangedPathsOutcome)
-> String -> Parser MaximumChangedPathsOutcome
forall a b. (a -> b) -> a -> b
$ "Invalid outcome " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Text -> String
unpack Text
x String -> ShowS
forall a. Semigroup a => a -> a -> a
<> ", must be skip or error"

instance ToJSON MaximumChangedPathsOutcome where
    toJSON :: MaximumChangedPathsOutcome -> Value
toJSON = \case
        MaximumChangedPathsOutcomeSkip -> Text -> Value
String "skip"
        MaximumChangedPathsOutcomeError -> Text -> Value
String "error"