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

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

import           Cardano.Api

import           Cardano.CLI.EraBased.Commands
import           Cardano.CLI.EraBased.Run.Genesis
import           Cardano.CLI.EraBased.Run.Governance
import           Cardano.CLI.EraBased.Run.Query
import           Cardano.CLI.EraBased.Run.StakeAddress
import           Cardano.CLI.EraBased.Run.StakePool
import           Cardano.CLI.EraBased.Run.TextView
import           Cardano.CLI.EraBased.Run.Transaction
import           Cardano.CLI.Helpers (printEraDeprecationWarning)
import           Cardano.CLI.Run.Address
import           Cardano.CLI.Run.Key
import           Cardano.CLI.Run.Node
import           Cardano.CLI.Types.Errors.CmdError

import           Data.Function ((&))

runAnyEraCommand
  :: ()
  => AnyEraCommand
  -> ExceptT CmdError IO ()
runAnyEraCommand :: AnyEraCommand -> ExceptT CmdError IO ()
runAnyEraCommand = \case
  AnyEraCommandOf ShelleyBasedEra era
sbe Cmds era
cmd -> do
    ShelleyBasedEra era -> ExceptT CmdError IO ()
forall era (m :: * -> *) (eon :: * -> *).
(Typeable era, MonadIO m, ToCardanoEra eon) =>
eon era -> m ()
printEraDeprecationWarning ShelleyBasedEra era
sbe
    ShelleyBasedEra era
-> (ShelleyBasedEraConstraints era => ExceptT CmdError IO ())
-> ExceptT CmdError IO ()
forall era a.
ShelleyBasedEra era -> (ShelleyBasedEraConstraints era => a) -> a
shelleyBasedEraConstraints ShelleyBasedEra era
sbe ((ShelleyBasedEraConstraints era => ExceptT CmdError IO ())
 -> ExceptT CmdError IO ())
-> (ShelleyBasedEraConstraints era => ExceptT CmdError IO ())
-> ExceptT CmdError IO ()
forall a b. (a -> b) -> a -> b
$ Cmds era -> ExceptT CmdError IO ()
forall era. Cmds era -> ExceptT CmdError IO ()
runCmds Cmds era
cmd

runCmds
  :: ()
  => Cmds era
  -> ExceptT CmdError IO ()
runCmds :: forall era. Cmds era -> ExceptT CmdError IO ()
runCmds = \case
  AddressCmds AddressCmds
cmd ->
    AddressCmds -> ExceptT AddressCmdError IO ()
runAddressCmds AddressCmds
cmd ExceptT AddressCmdError IO ()
-> (ExceptT AddressCmdError IO () -> ExceptT CmdError IO ())
-> ExceptT CmdError IO ()
forall a b. a -> (a -> b) -> b
& (AddressCmdError -> CmdError)
-> ExceptT AddressCmdError IO () -> ExceptT CmdError IO ()
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT AddressCmdError -> CmdError
CmdAddressError
  KeyCmds KeyCmds
cmd ->
    KeyCmds -> ExceptT KeyCmdError IO ()
runKeyCmds KeyCmds
cmd
      ExceptT KeyCmdError IO ()
-> (ExceptT KeyCmdError IO () -> ExceptT CmdError IO ())
-> ExceptT CmdError IO ()
forall a b. a -> (a -> b) -> b
& (KeyCmdError -> CmdError)
-> ExceptT KeyCmdError IO () -> ExceptT CmdError IO ()
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT KeyCmdError -> CmdError
CmdKeyError
  GovernanceCmds GovernanceCmds era
cmd ->
    GovernanceCmds era -> ExceptT CmdError IO ()
forall era. GovernanceCmds era -> ExceptT CmdError IO ()
runGovernanceCmds GovernanceCmds era
cmd
  GenesisCmds GenesisCmds era
cmd ->
    GenesisCmds era -> ExceptT GenesisCmdError IO ()
forall era. GenesisCmds era -> ExceptT GenesisCmdError IO ()
runGenesisCmds GenesisCmds era
cmd
      ExceptT GenesisCmdError IO ()
-> (ExceptT GenesisCmdError IO () -> ExceptT CmdError IO ())
-> ExceptT CmdError IO ()
forall a b. a -> (a -> b) -> b
& (GenesisCmdError -> CmdError)
-> ExceptT GenesisCmdError IO () -> ExceptT CmdError IO ()
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT GenesisCmdError -> CmdError
CmdGenesisError
  NodeCmds NodeCmds
cmd ->
    NodeCmds -> ExceptT NodeCmdError IO ()
runNodeCmds NodeCmds
cmd
      ExceptT NodeCmdError IO ()
-> (ExceptT NodeCmdError IO () -> ExceptT CmdError IO ())
-> ExceptT CmdError IO ()
forall a b. a -> (a -> b) -> b
& (NodeCmdError -> CmdError)
-> ExceptT NodeCmdError IO () -> ExceptT CmdError IO ()
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT NodeCmdError -> CmdError
CmdNodeError
  QueryCmds QueryCmds era
cmd ->
    QueryCmds era -> ExceptT QueryCmdError IO ()
forall era. QueryCmds era -> ExceptT QueryCmdError IO ()
runQueryCmds QueryCmds era
cmd
      ExceptT QueryCmdError IO ()
-> (ExceptT QueryCmdError IO () -> ExceptT CmdError IO ())
-> ExceptT CmdError IO ()
forall a b. a -> (a -> b) -> b
& (QueryCmdError -> CmdError)
-> ExceptT QueryCmdError IO () -> ExceptT CmdError IO ()
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT QueryCmdError -> CmdError
CmdQueryError
  StakeAddressCmds StakeAddressCmds era
cmd ->
    StakeAddressCmds era -> ExceptT StakeAddressCmdError IO ()
forall era.
StakeAddressCmds era -> ExceptT StakeAddressCmdError IO ()
runStakeAddressCmds StakeAddressCmds era
cmd
      ExceptT StakeAddressCmdError IO ()
-> (ExceptT StakeAddressCmdError IO () -> ExceptT CmdError IO ())
-> ExceptT CmdError IO ()
forall a b. a -> (a -> b) -> b
& (StakeAddressCmdError -> CmdError)
-> ExceptT StakeAddressCmdError IO () -> ExceptT CmdError IO ()
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT StakeAddressCmdError -> CmdError
CmdStakeAddressError
  StakePoolCmds StakePoolCmds era
cmd ->
    StakePoolCmds era -> ExceptT StakePoolCmdError IO ()
forall era. StakePoolCmds era -> ExceptT StakePoolCmdError IO ()
runStakePoolCmds StakePoolCmds era
cmd
      ExceptT StakePoolCmdError IO ()
-> (ExceptT StakePoolCmdError IO () -> ExceptT CmdError IO ())
-> ExceptT CmdError IO ()
forall a b. a -> (a -> b) -> b
& (StakePoolCmdError -> CmdError)
-> ExceptT StakePoolCmdError IO () -> ExceptT CmdError IO ()
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT StakePoolCmdError -> CmdError
CmdStakePoolError
  TextViewCmds TextViewCmds era
cmd ->
    TextViewCmds era -> ExceptT TextViewFileError IO ()
forall era. TextViewCmds era -> ExceptT TextViewFileError IO ()
runTextViewCmds TextViewCmds era
cmd
      ExceptT TextViewFileError IO ()
-> (ExceptT TextViewFileError IO () -> ExceptT CmdError IO ())
-> ExceptT CmdError IO ()
forall a b. a -> (a -> b) -> b
& (TextViewFileError -> CmdError)
-> ExceptT TextViewFileError IO () -> ExceptT CmdError IO ()
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT TextViewFileError -> CmdError
CmdTextViewError
  TransactionCmds TransactionCmds era
cmd ->
    TransactionCmds era -> ExceptT TxCmdError IO ()
forall era. TransactionCmds era -> ExceptT TxCmdError IO ()
runTransactionCmds TransactionCmds era
cmd
      ExceptT TxCmdError IO ()
-> (ExceptT TxCmdError IO () -> ExceptT CmdError IO ())
-> ExceptT CmdError IO ()
forall a b. a -> (a -> b) -> b
& (TxCmdError -> CmdError)
-> ExceptT TxCmdError IO () -> ExceptT CmdError IO ()
forall (m :: * -> *) x y a.
Functor m =>
(x -> y) -> ExceptT x m a -> ExceptT y m a
firstExceptT TxCmdError -> CmdError
CmdTransactionError