{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE UndecidableSuperClasses #-}

module Cardano.Ledger.Genesis (
  EraGenesis (..),
  NoGenesis (..),
) where

import Cardano.Ledger.BaseTypes (KeyValuePairs (..), ToKeyValuePairs (..))
import Cardano.Ledger.Binary (
  DecCBOR (..),
  EncCBOR (..),
  FromCBOR (..),
  ToCBOR (..),
 )
import Cardano.Ledger.Core.Era (Era)
import Control.Monad (unless)
import Data.Aeson (
  FromJSON (..),
  ToJSON,
  Value (..),
 )
import qualified Data.Aeson.KeyMap as KV
import Data.Kind (Type)

class Era era => EraGenesis era where
  type Genesis era :: Type
  type Genesis era = NoGenesis era

data NoGenesis era = NoGenesis
  deriving (NoGenesis era -> NoGenesis era -> Bool
(NoGenesis era -> NoGenesis era -> Bool)
-> (NoGenesis era -> NoGenesis era -> Bool) -> Eq (NoGenesis era)
forall era. NoGenesis era -> NoGenesis era -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall era. NoGenesis era -> NoGenesis era -> Bool
== :: NoGenesis era -> NoGenesis era -> Bool
$c/= :: forall era. NoGenesis era -> NoGenesis era -> Bool
/= :: NoGenesis era -> NoGenesis era -> Bool
Eq, Int -> NoGenesis era -> ShowS
[NoGenesis era] -> ShowS
NoGenesis era -> String
(Int -> NoGenesis era -> ShowS)
-> (NoGenesis era -> String)
-> ([NoGenesis era] -> ShowS)
-> Show (NoGenesis era)
forall era. Int -> NoGenesis era -> ShowS
forall era. [NoGenesis era] -> ShowS
forall era. NoGenesis era -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall era. Int -> NoGenesis era -> ShowS
showsPrec :: Int -> NoGenesis era -> ShowS
$cshow :: forall era. NoGenesis era -> String
show :: NoGenesis era -> String
$cshowList :: forall era. [NoGenesis era] -> ShowS
showList :: [NoGenesis era] -> ShowS
Show)
  deriving ([NoGenesis era] -> Value
[NoGenesis era] -> Encoding
NoGenesis era -> Bool
NoGenesis era -> Value
NoGenesis era -> Encoding
(NoGenesis era -> Value)
-> (NoGenesis era -> Encoding)
-> ([NoGenesis era] -> Value)
-> ([NoGenesis era] -> Encoding)
-> (NoGenesis era -> Bool)
-> ToJSON (NoGenesis era)
forall era. [NoGenesis era] -> Value
forall era. [NoGenesis era] -> Encoding
forall era. NoGenesis era -> Bool
forall era. NoGenesis era -> Value
forall era. NoGenesis era -> Encoding
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
$ctoJSON :: forall era. NoGenesis era -> Value
toJSON :: NoGenesis era -> Value
$ctoEncoding :: forall era. NoGenesis era -> Encoding
toEncoding :: NoGenesis era -> Encoding
$ctoJSONList :: forall era. [NoGenesis era] -> Value
toJSONList :: [NoGenesis era] -> Value
$ctoEncodingList :: forall era. [NoGenesis era] -> Encoding
toEncodingList :: [NoGenesis era] -> Encoding
$comitField :: forall era. NoGenesis era -> Bool
omitField :: NoGenesis era -> Bool
ToJSON) via KeyValuePairs (NoGenesis era)

instance Era era => ToCBOR (NoGenesis era) where
  toCBOR :: NoGenesis era -> Encoding
toCBOR NoGenesis era
_ = () -> Encoding
forall a. ToCBOR a => a -> Encoding
toCBOR ()

instance Era era => FromCBOR (NoGenesis era) where
  fromCBOR :: forall s. Decoder s (NoGenesis era)
fromCBOR = NoGenesis era
forall era. NoGenesis era
NoGenesis NoGenesis era -> Decoder s () -> Decoder s (NoGenesis era)
forall a b. a -> Decoder s b -> Decoder s a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ forall a s. FromCBOR a => Decoder s a
fromCBOR @()

instance Era era => EncCBOR (NoGenesis era)

instance Era era => DecCBOR (NoGenesis era)

instance ToKeyValuePairs (NoGenesis era) where
  toKeyValuePairs :: forall e kv. KeyValue e kv => NoGenesis era -> [kv]
toKeyValuePairs NoGenesis era
_ = []

instance FromJSON (NoGenesis era) where
  parseJSON :: Value -> Parser (NoGenesis era)
parseJSON = \case
    Value
Null -> NoGenesis era -> Parser (NoGenesis era)
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure NoGenesis era
forall era. NoGenesis era
NoGenesis
    Object Object
o -> do
      Bool -> Parser () -> Parser ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (Object -> Bool
forall v. KeyMap v -> Bool
KV.null Object
o) (Parser () -> Parser ()) -> Parser () -> Parser ()
forall a b. (a -> b) -> a -> b
$ String -> Parser ()
forall a. String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"NoGenesis cannot have any fields"
      NoGenesis era -> Parser (NoGenesis era)
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure NoGenesis era
forall era. NoGenesis era
NoGenesis
    Value
_ -> String -> Parser (NoGenesis era)
forall a. String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"Unexpected value type for NoGenesis"