{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}

module Cardano.CLI.EraBased.Option
  ( pCmds
  , pAnyEraCommand
  , MainnetEra
  )
where

import Cardano.Api.Experimental
import Cardano.Api.Pretty (prettyShow)

import Cardano.CLI.Environment
import Cardano.CLI.EraBased.Command
import Cardano.CLI.EraBased.Genesis.Option
import Cardano.CLI.EraBased.Governance.Option (pGovernanceCmds)
import Cardano.CLI.EraBased.Query.Option
import Cardano.CLI.EraBased.StakeAddress.Option
import Cardano.CLI.EraBased.StakePool.Option
import Cardano.CLI.EraBased.TextView.Option
import Cardano.CLI.EraBased.Transaction.Option
import Cardano.CLI.EraBased.Transaction.SubTransaction.Option (pSubTransactionCmds)
import Cardano.CLI.EraIndependent.Address.Option
import Cardano.CLI.EraIndependent.Key.Option
import Cardano.CLI.EraIndependent.Node.Option
import Cardano.CLI.Parser

import Data.Foldable
import Data.Maybe
import Options.Applicative (Parser)
import Options.Applicative qualified as Opt

-- | The era running on mainnet, used by the latest, top-level node and top-level query commands.
type MainnetEra = ConwayEra

pCmds :: forall era. IsEra era => EnvCli -> Parser (Cmds era)
pCmds :: forall era. IsEra era => EnvCli -> Parser (Cmds era)
pCmds EnvCli
envCli = do
  [Parser (Cmds era)] -> Parser (Cmds era)
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum ([Parser (Cmds era)] -> Parser (Cmds era))
-> [Parser (Cmds era)] -> Parser (Cmds era)
forall a b. (a -> b) -> a -> b
$
    [Maybe (Parser (Cmds era))] -> [Parser (Cmds era)]
forall a. [Maybe a] -> [a]
catMaybes
      [ Parser (Cmds era) -> Maybe (Parser (Cmds era))
forall a. a -> Maybe a
Just (AddressCmds -> Cmds era
forall era. AddressCmds -> Cmds era
AddressCmds (AddressCmds -> Cmds era)
-> Parser AddressCmds -> Parser (Cmds era)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> EnvCli -> Parser AddressCmds
pAddressCmds EnvCli
envCli)
      , Parser (Cmds era) -> Maybe (Parser (Cmds era))
forall a. a -> Maybe a
Just (KeyCmds -> Cmds era
forall era. KeyCmds -> Cmds era
KeyCmds (KeyCmds -> Cmds era) -> Parser KeyCmds -> Parser (Cmds era)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser KeyCmds
pKeyCmds)
      , (GenesisCmds era -> Cmds era)
-> Parser (GenesisCmds era) -> Parser (Cmds era)
forall a b. (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap GenesisCmds era -> Cmds era
forall era. GenesisCmds era -> Cmds era
GenesisCmds (Parser (GenesisCmds era) -> Parser (Cmds era))
-> Maybe (Parser (GenesisCmds era)) -> Maybe (Parser (Cmds era))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> EnvCli -> Maybe (Parser (GenesisCmds era))
forall era. IsEra era => EnvCli -> Maybe (Parser (GenesisCmds era))
pGenesisCmds EnvCli
envCli
      , (GovernanceCmds era -> Cmds era)
-> Parser (GovernanceCmds era) -> Parser (Cmds era)
forall a b. (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap GovernanceCmds era -> Cmds era
forall era. GovernanceCmds era -> Cmds era
GovernanceCmds (Parser (GovernanceCmds era) -> Parser (Cmds era))
-> Maybe (Parser (GovernanceCmds era)) -> Maybe (Parser (Cmds era))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe (Parser (GovernanceCmds era))
forall era. IsEra era => Maybe (Parser (GovernanceCmds era))
pGovernanceCmds
      , Parser (Cmds era) -> Maybe (Parser (Cmds era))
forall a. a -> Maybe a
Just (NodeCmds -> Cmds era
forall era. NodeCmds -> Cmds era
NodeCmds (NodeCmds -> Cmds era) -> Parser NodeCmds -> Parser (Cmds era)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall era. IsEra era => Parser NodeCmds
pNodeCmds @era)
      , (QueryCmds era -> Cmds era)
-> Parser (QueryCmds era) -> Parser (Cmds era)
forall a b. (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap QueryCmds era -> Cmds era
forall era. QueryCmds era -> Cmds era
QueryCmds (Parser (QueryCmds era) -> Parser (Cmds era))
-> Maybe (Parser (QueryCmds era)) -> Maybe (Parser (Cmds era))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> EnvCli -> Maybe (Parser (QueryCmds era))
forall era. IsEra era => EnvCli -> Maybe (Parser (QueryCmds era))
pQueryCmds EnvCli
envCli
      , (StakeAddressCmds era -> Cmds era)
-> Parser (StakeAddressCmds era) -> Parser (Cmds era)
forall a b. (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap StakeAddressCmds era -> Cmds era
forall era. StakeAddressCmds era -> Cmds era
StakeAddressCmds (Parser (StakeAddressCmds era) -> Parser (Cmds era))
-> Maybe (Parser (StakeAddressCmds era))
-> Maybe (Parser (Cmds era))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> EnvCli -> Maybe (Parser (StakeAddressCmds era))
forall era.
IsEra era =>
EnvCli -> Maybe (Parser (StakeAddressCmds era))
pStakeAddressCmds EnvCli
envCli
      , (StakePoolCmds era -> Cmds era)
-> Parser (StakePoolCmds era) -> Parser (Cmds era)
forall a b. (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap StakePoolCmds era -> Cmds era
forall era. StakePoolCmds era -> Cmds era
StakePoolCmds (Parser (StakePoolCmds era) -> Parser (Cmds era))
-> Maybe (Parser (StakePoolCmds era)) -> Maybe (Parser (Cmds era))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> EnvCli -> Maybe (Parser (StakePoolCmds era))
forall era.
IsEra era =>
EnvCli -> Maybe (Parser (StakePoolCmds era))
pStakePoolCmds EnvCli
envCli
      , (SubTransactionCmds -> Cmds era)
-> Parser SubTransactionCmds -> Parser (Cmds era)
forall a b. (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap SubTransactionCmds -> Cmds era
forall era. SubTransactionCmds -> Cmds era
SubTransactionCmds (Parser SubTransactionCmds -> Parser (Cmds era))
-> Maybe (Parser SubTransactionCmds) -> Maybe (Parser (Cmds era))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall era. IsEra era => Maybe (Parser SubTransactionCmds)
pSubTransactionCmds @era
      , (TextViewCmds era -> Cmds era)
-> Parser (TextViewCmds era) -> Parser (Cmds era)
forall a b. (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap TextViewCmds era -> Cmds era
forall era. TextViewCmds era -> Cmds era
TextViewCmds (Parser (TextViewCmds era) -> Parser (Cmds era))
-> Maybe (Parser (TextViewCmds era)) -> Maybe (Parser (Cmds era))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe (Parser (TextViewCmds era))
forall era. Maybe (Parser (TextViewCmds era))
pTextViewCmds
      , (TransactionCmds era -> Cmds era)
-> Parser (TransactionCmds era) -> Parser (Cmds era)
forall a b. (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap TransactionCmds era -> Cmds era
forall era. TransactionCmds era -> Cmds era
TransactionCmds (Parser (TransactionCmds era) -> Parser (Cmds era))
-> Maybe (Parser (TransactionCmds era))
-> Maybe (Parser (Cmds era))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> EnvCli -> Maybe (Parser (TransactionCmds era))
forall era.
IsEra era =>
EnvCli -> Maybe (Parser (TransactionCmds era))
pTransactionCmds EnvCli
envCli
      ]

pAnyEraCommand :: EnvCli -> Parser AnyEraCommand
pAnyEraCommand :: EnvCli -> Parser AnyEraCommand
pAnyEraCommand EnvCli
envCli =
  [Parser AnyEraCommand] -> Parser AnyEraCommand
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ Mod CommandFields AnyEraCommand -> Parser AnyEraCommand
forall a. Mod CommandFields a -> Parser a
Opt.hsubparser (Mod CommandFields AnyEraCommand -> Parser AnyEraCommand)
-> Mod CommandFields AnyEraCommand -> Parser AnyEraCommand
forall a b. (a -> b) -> a -> b
$
        String
-> ParserInfo AnyEraCommand -> Mod CommandFields AnyEraCommand
forall a. String -> ParserInfo a -> Mod CommandFields a
commandWithMetavar String
"conway" (ParserInfo AnyEraCommand -> Mod CommandFields AnyEraCommand)
-> ParserInfo AnyEraCommand -> Mod CommandFields AnyEraCommand
forall a b. (a -> b) -> a -> b
$
          Parser AnyEraCommand
-> InfoMod AnyEraCommand -> ParserInfo AnyEraCommand
forall a. Parser a -> InfoMod a -> ParserInfo a
Opt.info (Era ConwayEra -> Cmds ConwayEra -> AnyEraCommand
forall era. Typeable era => Era era -> Cmds era -> AnyEraCommand
AnyEraCommandOf Era ConwayEra
ConwayEra (Cmds ConwayEra -> AnyEraCommand)
-> Parser (Cmds ConwayEra) -> Parser AnyEraCommand
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall era. IsEra era => EnvCli -> Parser (Cmds era)
pCmds @ConwayEra EnvCli
envCli) (InfoMod AnyEraCommand -> ParserInfo AnyEraCommand)
-> InfoMod AnyEraCommand -> ParserInfo AnyEraCommand
forall a b. (a -> b) -> a -> b
$
            String -> InfoMod AnyEraCommand
forall a. String -> InfoMod a
Opt.progDesc String
"Conway era commands"
    , Mod CommandFields AnyEraCommand -> Parser AnyEraCommand
forall a. Mod CommandFields a -> Parser a
Opt.hsubparser (Mod CommandFields AnyEraCommand -> Parser AnyEraCommand)
-> Mod CommandFields AnyEraCommand -> Parser AnyEraCommand
forall a b. (a -> b) -> a -> b
$
        String
-> ParserInfo AnyEraCommand -> Mod CommandFields AnyEraCommand
forall a. String -> ParserInfo a -> Mod CommandFields a
commandWithMetavar String
"dijkstra" (ParserInfo AnyEraCommand -> Mod CommandFields AnyEraCommand)
-> ParserInfo AnyEraCommand -> Mod CommandFields AnyEraCommand
forall a b. (a -> b) -> a -> b
$
          Parser AnyEraCommand
-> InfoMod AnyEraCommand -> ParserInfo AnyEraCommand
forall a. Parser a -> InfoMod a -> ParserInfo a
Opt.info (Era DijkstraEra -> Cmds DijkstraEra -> AnyEraCommand
forall era. Typeable era => Era era -> Cmds era -> AnyEraCommand
AnyEraCommandOf Era DijkstraEra
DijkstraEra (Cmds DijkstraEra -> AnyEraCommand)
-> Parser (Cmds DijkstraEra) -> Parser AnyEraCommand
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall era. IsEra era => EnvCli -> Parser (Cmds era)
pCmds @DijkstraEra EnvCli
envCli) (InfoMod AnyEraCommand -> ParserInfo AnyEraCommand)
-> InfoMod AnyEraCommand -> ParserInfo AnyEraCommand
forall a b. (a -> b) -> a -> b
$
            String -> InfoMod AnyEraCommand
forall a. String -> InfoMod a
Opt.progDesc String
"Dijkstra era commands"
    , Mod CommandFields AnyEraCommand -> Parser AnyEraCommand
forall a. Mod CommandFields a -> Parser a
Opt.hsubparser (Mod CommandFields AnyEraCommand -> Parser AnyEraCommand)
-> Mod CommandFields AnyEraCommand -> Parser AnyEraCommand
forall a b. (a -> b) -> a -> b
$
        String
-> ParserInfo AnyEraCommand -> Mod CommandFields AnyEraCommand
forall a. String -> ParserInfo a -> Mod CommandFields a
commandWithMetavar String
"latest" (ParserInfo AnyEraCommand -> Mod CommandFields AnyEraCommand)
-> ParserInfo AnyEraCommand -> Mod CommandFields AnyEraCommand
forall a b. (a -> b) -> a -> b
$
          Parser AnyEraCommand
-> InfoMod AnyEraCommand -> ParserInfo AnyEraCommand
forall a. Parser a -> InfoMod a -> ParserInfo a
Opt.info (Era ConwayEra -> Cmds ConwayEra -> AnyEraCommand
forall era. Typeable era => Era era -> Cmds era -> AnyEraCommand
AnyEraCommandOf (forall era. IsEra era => Era era
useEra @MainnetEra) (Cmds ConwayEra -> AnyEraCommand)
-> Parser (Cmds ConwayEra) -> Parser AnyEraCommand
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall era. IsEra era => EnvCli -> Parser (Cmds era)
pCmds @MainnetEra EnvCli
envCli) (InfoMod AnyEraCommand -> ParserInfo AnyEraCommand)
-> InfoMod AnyEraCommand -> ParserInfo AnyEraCommand
forall a b. (a -> b) -> a -> b
$
            String -> InfoMod AnyEraCommand
forall a. String -> InfoMod a
Opt.progDesc (String -> InfoMod AnyEraCommand)
-> String -> InfoMod AnyEraCommand
forall a b. (a -> b) -> a -> b
$
              String
"Latest era commands (" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Era ConwayEra -> String
forall a. Pretty a => a -> String
prettyShow (forall era. IsEra era => Era era
useEra @MainnetEra) String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
")"
    ]