{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE RankNTypes #-}

module Cardano.CLI.EraBased.Run
  ( runAnyEraCommand
  , runCmds
  , runGovernanceCmds
  )
where

import Cardano.Api.Experimental (IsEra, obtainCommonConstraints)

import Cardano.CLI.Compatible.Exception
import Cardano.CLI.EraBased.Command
import Cardano.CLI.EraBased.Genesis.Run
import Cardano.CLI.EraBased.Governance.Run
import Cardano.CLI.EraBased.Query.Run
import Cardano.CLI.EraBased.StakeAddress.Run
import Cardano.CLI.EraBased.StakePool.Run
import Cardano.CLI.EraBased.TextView.Run
import Cardano.CLI.EraBased.Transaction.Run (runTransactionCmds)
import Cardano.CLI.EraIndependent.Address.Run
import Cardano.CLI.EraIndependent.Key.Run
import Cardano.CLI.EraIndependent.Node.Run
import Cardano.CLI.Helper (printEraDeprecationWarning)

runAnyEraCommand
  :: ()
  => AnyEraCommand
  -> CIO e ()
runAnyEraCommand :: forall e. AnyEraCommand -> CIO e ()
runAnyEraCommand = \case
  AnyEraCommandOf Era era
era Cmds era
cmd -> do
    Era era -> RIO e ()
forall era (m :: * -> *) (eon :: * -> *).
(Typeable era, MonadIO m, ToCardanoEra eon) =>
eon era -> m ()
printEraDeprecationWarning Era era
era
    Era era -> (EraCommonConstraints era => RIO e ()) -> RIO e ()
forall era a. Era era -> (EraCommonConstraints era => a) -> a
obtainCommonConstraints Era era
era ((EraCommonConstraints era => RIO e ()) -> RIO e ())
-> (EraCommonConstraints era => RIO e ()) -> RIO e ()
forall a b. (a -> b) -> a -> b
$ Cmds era -> CIO e ()
forall era e. IsEra era => Cmds era -> CIO e ()
runCmds Cmds era
cmd

runCmds
  :: IsEra era
  => Cmds era
  -> CIO e ()
runCmds :: forall era e. IsEra era => Cmds era -> CIO e ()
runCmds = \case
  AddressCmds AddressCmds
cmd ->
    AddressCmds -> CIO e ()
forall e. AddressCmds -> CIO e ()
runAddressCmds AddressCmds
cmd
  KeyCmds KeyCmds
cmd ->
    KeyCmds -> CIO e ()
forall e. KeyCmds -> CIO e ()
runKeyCmds KeyCmds
cmd
  GovernanceCmds GovernanceCmds era
cmd ->
    GovernanceCmds era -> CIO e ()
forall era e. GovernanceCmds era -> CIO e ()
runGovernanceCmds GovernanceCmds era
cmd
  GenesisCmds GenesisCmds era
cmd ->
    GenesisCmds era -> CIO e ()
forall era e. GenesisCmds era -> CIO e ()
runGenesisCmds GenesisCmds era
cmd
  NodeCmds NodeCmds
cmd ->
    NodeCmds -> CIO e ()
forall e. NodeCmds -> CIO e ()
runNodeCmds NodeCmds
cmd
  QueryCmds QueryCmds era
cmd ->
    QueryCmds era -> CIO e ()
forall era e. QueryCmds era -> CIO e ()
runQueryCmds QueryCmds era
cmd
  StakeAddressCmds StakeAddressCmds era
cmd ->
    StakeAddressCmds era -> CIO e ()
forall era e. StakeAddressCmds era -> CIO e ()
runStakeAddressCmds StakeAddressCmds era
cmd
  StakePoolCmds StakePoolCmds era
cmd ->
    StakePoolCmds era -> CIO e ()
forall era e. IsEra era => StakePoolCmds era -> CIO e ()
runStakePoolCmds StakePoolCmds era
cmd
  TextViewCmds TextViewCmds era
cmd ->
    TextViewCmds era -> CIO e ()
forall era e. TextViewCmds era -> CIO e ()
runTextViewCmds TextViewCmds era
cmd
  TransactionCmds TransactionCmds era
cmd ->
    TransactionCmds era -> CIO e ()
forall era e. IsEra era => TransactionCmds era -> CIO e ()
runTransactionCmds TransactionCmds era
cmd