{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

module Cardano.Ledger.CanonicalState.Namespace.CDDL (
  namespaceSymbolFromText,
  knownNamespaceKeySizes,
  knownNamespaces,
) where

import Cardano.Ledger.CanonicalState.Namespace.Blocks.V0 ()
import qualified Cardano.Ledger.CanonicalState.Namespace.Blocks.V0.CDDL as Blocks
import Cardano.Ledger.CanonicalState.Namespace.EntitiesAccounts.V0 ()
import qualified Cardano.Ledger.CanonicalState.Namespace.EntitiesAccounts.V0.CDDL as EntitiesAccounts
import Cardano.Ledger.CanonicalState.Namespace.EntitiesCommittee.V0 ()
import qualified Cardano.Ledger.CanonicalState.Namespace.EntitiesCommittee.V0.CDDL as EntitiesCommittee
import Cardano.Ledger.CanonicalState.Namespace.EntitiesDReps.V0 ()
import qualified Cardano.Ledger.CanonicalState.Namespace.EntitiesDReps.V0.CDDL as EntitiesDReps
import Cardano.Ledger.CanonicalState.Namespace.EntitiesStakePools.V0 ()
import qualified Cardano.Ledger.CanonicalState.Namespace.EntitiesStakePools.V0.CDDL as EntitiesStakePools
import Cardano.Ledger.CanonicalState.Namespace.EntitiesStakePools.VRFKeyHashes.V0 ()
import qualified Cardano.Ledger.CanonicalState.Namespace.EntitiesStakePools.VRFKeyHashes.V0.CDDL as EntitiesStakePoolsVRFKeyHashes
import Cardano.Ledger.CanonicalState.Namespace.GovCommittee.V0 ()
import qualified Cardano.Ledger.CanonicalState.Namespace.GovCommittee.V0.CDDL as GovCommittee
import Cardano.Ledger.CanonicalState.Namespace.GovConstitution.V0 ()
import qualified Cardano.Ledger.CanonicalState.Namespace.GovConstitution.V0.CDDL as GovConstitution
import Cardano.Ledger.CanonicalState.Namespace.GovPParams.V0 ()
import qualified Cardano.Ledger.CanonicalState.Namespace.GovPParams.V0.CDDL as GovPParams
import Cardano.Ledger.CanonicalState.Namespace.GovProposals.Roots.V0 ()
import qualified Cardano.Ledger.CanonicalState.Namespace.GovProposals.Roots.V0.CDDL as GovProposalsRoots
import Cardano.Ledger.CanonicalState.Namespace.GovProposals.V0 ()
import qualified Cardano.Ledger.CanonicalState.Namespace.GovProposals.V0.CDDL as GovProposals
import Cardano.Ledger.CanonicalState.Namespace.UTxO.V0 ()
import qualified Cardano.Ledger.CanonicalState.Namespace.UTxO.V0.CDDL as UTxO
import Cardano.SCLS.NamespaceKey as Spec
import Cardano.SCLS.NamespaceSymbol (
  KnownSpec (..),
  SomeNamespaceSymbol (..),
  mkNamespaceSymbol,
  toString,
 )
import Codec.CBOR.Cuddle.Huddle (Huddle, HuddleItem (HIRule), Rule, collectFromInit)
import Data.List (find)
import Data.Map (Map)
import qualified Data.Map as Map
import Data.Text (Text)
import qualified Data.Text as T
import GHC.TypeLits (symbolVal)

-- | Lookup a namespace symbol from its text representation.
-- | Returns 'Nothing' if the namespace is not known.
namespaceSymbolFromText :: Text -> Maybe SomeNamespaceSymbol
namespaceSymbolFromText :: Text -> Maybe SomeNamespaceSymbol
namespaceSymbolFromText Text
t =
  (SomeNamespaceSymbol -> Bool)
-> [SomeNamespaceSymbol] -> Maybe SomeNamespaceSymbol
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find (\SomeNamespaceSymbol
ns -> String -> Text
T.pack (SomeNamespaceSymbol -> String
toString SomeNamespaceSymbol
ns) Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
t) [SomeNamespaceSymbol]
knownNamespaces

instance KnownSpec "utxo/v0" where
  namespaceSpec :: forall (proxy :: Symbol -> *). proxy "utxo/v0" -> Huddle
namespaceSpec proxy "utxo/v0"
_ = Rule -> Huddle
mkDefinition Rule
UTxO.record_entry

instance KnownSpec "blocks/v0" where
  namespaceSpec :: forall (proxy :: Symbol -> *). proxy "blocks/v0" -> Huddle
namespaceSpec proxy "blocks/v0"
_ = Rule -> Huddle
mkDefinition Rule
Blocks.record_entry

instance KnownSpec "entities/accounts/v0" where
  namespaceSpec :: forall (proxy :: Symbol -> *).
proxy "entities/accounts/v0" -> Huddle
namespaceSpec proxy "entities/accounts/v0"
_ = Rule -> Huddle
mkDefinition Rule
EntitiesAccounts.record_entry

instance KnownSpec "entities/committee/v0" where
  namespaceSpec :: forall (proxy :: Symbol -> *).
proxy "entities/committee/v0" -> Huddle
namespaceSpec proxy "entities/committee/v0"
_ = Rule -> Huddle
mkDefinition Rule
EntitiesCommittee.record_entry

instance KnownSpec "entities/dreps/v0" where
  namespaceSpec :: forall (proxy :: Symbol -> *). proxy "entities/dreps/v0" -> Huddle
namespaceSpec proxy "entities/dreps/v0"
_ = Rule -> Huddle
mkDefinition Rule
EntitiesDReps.record_entry

instance KnownSpec "entities/stake_pools/v0" where
  namespaceSpec :: forall (proxy :: Symbol -> *).
proxy "entities/stake_pools/v0" -> Huddle
namespaceSpec proxy "entities/stake_pools/v0"
_ = Rule -> Huddle
mkDefinition Rule
EntitiesStakePools.record_entry

instance KnownSpec "entities/stake_pools/vrf_key_hashes/v0" where
  namespaceSpec :: forall (proxy :: Symbol -> *).
proxy "entities/stake_pools/vrf_key_hashes/v0" -> Huddle
namespaceSpec proxy "entities/stake_pools/vrf_key_hashes/v0"
_ = Rule -> Huddle
mkDefinition Rule
EntitiesStakePoolsVRFKeyHashes.record_entry

instance KnownSpec "gov/committee/v0" where
  namespaceSpec :: forall (proxy :: Symbol -> *). proxy "gov/committee/v0" -> Huddle
namespaceSpec proxy "gov/committee/v0"
_ = Rule -> Huddle
mkDefinition Rule
GovCommittee.record_entry

instance KnownSpec "gov/constitution/v0" where
  namespaceSpec :: forall (proxy :: Symbol -> *).
proxy "gov/constitution/v0" -> Huddle
namespaceSpec proxy "gov/constitution/v0"
_ = Rule -> Huddle
mkDefinition Rule
GovConstitution.record_entry

instance KnownSpec "gov/pparams/v0" where
  namespaceSpec :: forall (proxy :: Symbol -> *). proxy "gov/pparams/v0" -> Huddle
namespaceSpec proxy "gov/pparams/v0"
_ = Rule -> Huddle
mkDefinition Rule
GovPParams.record_entry

instance KnownSpec "gov/proposals/v0" where
  namespaceSpec :: forall (proxy :: Symbol -> *). proxy "gov/proposals/v0" -> Huddle
namespaceSpec proxy "gov/proposals/v0"
_ = Rule -> Huddle
mkDefinition Rule
GovProposals.record_entry

instance KnownSpec "gov/proposals/roots/v0" where
  namespaceSpec :: forall (proxy :: Symbol -> *).
proxy "gov/proposals/roots/v0" -> Huddle
namespaceSpec proxy "gov/proposals/roots/v0"
_ = Rule -> Huddle
mkDefinition Rule
GovProposalsRoots.record_entry

mkDefinition :: Rule -> Huddle
mkDefinition :: Rule -> Huddle
mkDefinition Rule
r = [HuddleItem] -> Huddle
collectFromInit [Rule -> HuddleItem
HIRule Rule
r]

knownNamespaceKeySizes :: Map String Int
knownNamespaceKeySizes :: Map String Int
knownNamespaceKeySizes =
  [(String, Int)] -> Map String Int
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList ([(String, Int)] -> Map String Int)
-> [(String, Int)] -> Map String Int
forall a b. (a -> b) -> a -> b
$
    (SomeNamespaceSymbol -> (String, Int))
-> [SomeNamespaceSymbol] -> [(String, Int)]
forall a b. (a -> b) -> [a] -> [b]
map
      (\(SomeNamespaceSymbol (Proxy ns
p :: proxy ns)) -> (Proxy ns -> String
forall (n :: Symbol) (proxy :: Symbol -> *).
KnownSymbol n =>
proxy n -> String
symbolVal Proxy ns
p, forall (ns :: Symbol). KnownNat (NamespaceKeySize ns) => Int
Spec.namespaceKeySize @ns))
      [SomeNamespaceSymbol]
knownNamespaces

knownNamespaces :: [SomeNamespaceSymbol]
knownNamespaces :: [SomeNamespaceSymbol]
knownNamespaces =
  [ forall (ns :: Symbol).
(KnownSpec ns, KnownNat (NamespaceKeySize ns)) =>
SomeNamespaceSymbol
mkNamespaceSymbol @"utxo/v0"
  , forall (ns :: Symbol).
(KnownSpec ns, KnownNat (NamespaceKeySize ns)) =>
SomeNamespaceSymbol
mkNamespaceSymbol @"blocks/v0"
  , forall (ns :: Symbol).
(KnownSpec ns, KnownNat (NamespaceKeySize ns)) =>
SomeNamespaceSymbol
mkNamespaceSymbol @"entities/accounts/v0"
  , forall (ns :: Symbol).
(KnownSpec ns, KnownNat (NamespaceKeySize ns)) =>
SomeNamespaceSymbol
mkNamespaceSymbol @"entities/committee/v0"
  , forall (ns :: Symbol).
(KnownSpec ns, KnownNat (NamespaceKeySize ns)) =>
SomeNamespaceSymbol
mkNamespaceSymbol @"entities/dreps/v0"
  , forall (ns :: Symbol).
(KnownSpec ns, KnownNat (NamespaceKeySize ns)) =>
SomeNamespaceSymbol
mkNamespaceSymbol @"entities/stake_pools/v0"
  , forall (ns :: Symbol).
(KnownSpec ns, KnownNat (NamespaceKeySize ns)) =>
SomeNamespaceSymbol
mkNamespaceSymbol @"entities/stake_pools/vrf_key_hashes/v0"
  , forall (ns :: Symbol).
(KnownSpec ns, KnownNat (NamespaceKeySize ns)) =>
SomeNamespaceSymbol
mkNamespaceSymbol @"gov/committee/v0"
  , forall (ns :: Symbol).
(KnownSpec ns, KnownNat (NamespaceKeySize ns)) =>
SomeNamespaceSymbol
mkNamespaceSymbol @"gov/constitution/v0"
  , forall (ns :: Symbol).
(KnownSpec ns, KnownNat (NamespaceKeySize ns)) =>
SomeNamespaceSymbol
mkNamespaceSymbol @"gov/pparams/v0"
  , forall (ns :: Symbol).
(KnownSpec ns, KnownNat (NamespaceKeySize ns)) =>
SomeNamespaceSymbol
mkNamespaceSymbol @"gov/proposals/v0"
  , forall (ns :: Symbol).
(KnownSpec ns, KnownNat (NamespaceKeySize ns)) =>
SomeNamespaceSymbol
mkNamespaceSymbol @"gov/proposals/roots/v0"
  ]