{-# LANGUAGE TypeApplications #-}

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

import Cardano.Api.Experimental

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.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

pCmds :: 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
<$> Parser NodeCmds
pNodeCmds)
      , (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
      , (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
"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 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
"Latest era commands (Conway)"
    ]