{-# 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.EraBased.Transaction.SubTransaction.Run (runSubTransactionCmds)
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
  SubTransactionCmds SubTransactionCmds
cmd ->
    SubTransactionCmds -> CIO e ()
forall e. SubTransactionCmds -> CIO e ()
runSubTransactionCmds SubTransactionCmds
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