{-# LANGUAGE GADTs #-}

{-
This module is concerned with providing backwards compatible cli commands for our internal
testing needs. The intention is to restrict as much as possible which functionality we maintain backwards
compatibility for.
-}

module Cardano.CLI.Compatible.Option
  ( pAnyCompatibleCommand
  )
where

import Cardano.Api

import Cardano.CLI.Compatible.Command
import Cardano.CLI.Compatible.Governance.Option
import Cardano.CLI.Compatible.StakeAddress.Option
import Cardano.CLI.Compatible.StakePool.Option
import Cardano.CLI.Compatible.Transaction.Option
import Cardano.CLI.Environment
import Cardano.CLI.Parser

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

pAnyCompatibleCommand :: EnvCli -> Parser AnyCompatibleCommand
pAnyCompatibleCommand :: EnvCli -> Parser AnyCompatibleCommand
pAnyCompatibleCommand EnvCli
envCli =
  [Parser AnyCompatibleCommand] -> Parser AnyCompatibleCommand
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ -- Note, byron is ommitted because there is already a legacy command group for it.
      Mod CommandFields AnyCompatibleCommand
-> Parser AnyCompatibleCommand
forall a. Mod CommandFields a -> Parser a
Opt.hsubparser (Mod CommandFields AnyCompatibleCommand
 -> Parser AnyCompatibleCommand)
-> Mod CommandFields AnyCompatibleCommand
-> Parser AnyCompatibleCommand
forall a b. (a -> b) -> a -> b
$
        String
-> ParserInfo AnyCompatibleCommand
-> Mod CommandFields AnyCompatibleCommand
forall a. String -> ParserInfo a -> Mod CommandFields a
commandWithMetavar String
"shelley" (ParserInfo AnyCompatibleCommand
 -> Mod CommandFields AnyCompatibleCommand)
-> ParserInfo AnyCompatibleCommand
-> Mod CommandFields AnyCompatibleCommand
forall a b. (a -> b) -> a -> b
$
          Parser AnyCompatibleCommand
-> InfoMod AnyCompatibleCommand -> ParserInfo AnyCompatibleCommand
forall a. Parser a -> InfoMod a -> ParserInfo a
Opt.info (CompatibleCommand ShelleyEra -> AnyCompatibleCommand
forall era.
Typeable era =>
CompatibleCommand era -> AnyCompatibleCommand
AnyCompatibleCommand (CompatibleCommand ShelleyEra -> AnyCompatibleCommand)
-> Parser (CompatibleCommand ShelleyEra)
-> Parser AnyCompatibleCommand
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ShelleyBasedEra ShelleyEra
-> EnvCli -> Parser (CompatibleCommand ShelleyEra)
forall era.
ShelleyBasedEra era -> EnvCli -> Parser (CompatibleCommand era)
pCompatibleCommand ShelleyBasedEra ShelleyEra
ShelleyBasedEraShelley EnvCli
envCli) (InfoMod AnyCompatibleCommand -> ParserInfo AnyCompatibleCommand)
-> InfoMod AnyCompatibleCommand -> ParserInfo AnyCompatibleCommand
forall a b. (a -> b) -> a -> b
$
            String -> InfoMod AnyCompatibleCommand
forall a. String -> InfoMod a
Opt.progDesc String
"Shelley era commands"
    , Mod CommandFields AnyCompatibleCommand
-> Parser AnyCompatibleCommand
forall a. Mod CommandFields a -> Parser a
Opt.hsubparser (Mod CommandFields AnyCompatibleCommand
 -> Parser AnyCompatibleCommand)
-> Mod CommandFields AnyCompatibleCommand
-> Parser AnyCompatibleCommand
forall a b. (a -> b) -> a -> b
$
        String
-> ParserInfo AnyCompatibleCommand
-> Mod CommandFields AnyCompatibleCommand
forall a. String -> ParserInfo a -> Mod CommandFields a
commandWithMetavar String
"allegra" (ParserInfo AnyCompatibleCommand
 -> Mod CommandFields AnyCompatibleCommand)
-> ParserInfo AnyCompatibleCommand
-> Mod CommandFields AnyCompatibleCommand
forall a b. (a -> b) -> a -> b
$
          Parser AnyCompatibleCommand
-> InfoMod AnyCompatibleCommand -> ParserInfo AnyCompatibleCommand
forall a. Parser a -> InfoMod a -> ParserInfo a
Opt.info (CompatibleCommand AllegraEra -> AnyCompatibleCommand
forall era.
Typeable era =>
CompatibleCommand era -> AnyCompatibleCommand
AnyCompatibleCommand (CompatibleCommand AllegraEra -> AnyCompatibleCommand)
-> Parser (CompatibleCommand AllegraEra)
-> Parser AnyCompatibleCommand
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ShelleyBasedEra AllegraEra
-> EnvCli -> Parser (CompatibleCommand AllegraEra)
forall era.
ShelleyBasedEra era -> EnvCli -> Parser (CompatibleCommand era)
pCompatibleCommand ShelleyBasedEra AllegraEra
ShelleyBasedEraAllegra EnvCli
envCli) (InfoMod AnyCompatibleCommand -> ParserInfo AnyCompatibleCommand)
-> InfoMod AnyCompatibleCommand -> ParserInfo AnyCompatibleCommand
forall a b. (a -> b) -> a -> b
$
            String -> InfoMod AnyCompatibleCommand
forall a. String -> InfoMod a
Opt.progDesc String
"Allegra era commands"
    , Mod CommandFields AnyCompatibleCommand
-> Parser AnyCompatibleCommand
forall a. Mod CommandFields a -> Parser a
Opt.hsubparser (Mod CommandFields AnyCompatibleCommand
 -> Parser AnyCompatibleCommand)
-> Mod CommandFields AnyCompatibleCommand
-> Parser AnyCompatibleCommand
forall a b. (a -> b) -> a -> b
$
        String
-> ParserInfo AnyCompatibleCommand
-> Mod CommandFields AnyCompatibleCommand
forall a. String -> ParserInfo a -> Mod CommandFields a
commandWithMetavar String
"mary" (ParserInfo AnyCompatibleCommand
 -> Mod CommandFields AnyCompatibleCommand)
-> ParserInfo AnyCompatibleCommand
-> Mod CommandFields AnyCompatibleCommand
forall a b. (a -> b) -> a -> b
$
          Parser AnyCompatibleCommand
-> InfoMod AnyCompatibleCommand -> ParserInfo AnyCompatibleCommand
forall a. Parser a -> InfoMod a -> ParserInfo a
Opt.info (CompatibleCommand MaryEra -> AnyCompatibleCommand
forall era.
Typeable era =>
CompatibleCommand era -> AnyCompatibleCommand
AnyCompatibleCommand (CompatibleCommand MaryEra -> AnyCompatibleCommand)
-> Parser (CompatibleCommand MaryEra)
-> Parser AnyCompatibleCommand
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ShelleyBasedEra MaryEra
-> EnvCli -> Parser (CompatibleCommand MaryEra)
forall era.
ShelleyBasedEra era -> EnvCli -> Parser (CompatibleCommand era)
pCompatibleCommand ShelleyBasedEra MaryEra
ShelleyBasedEraMary EnvCli
envCli) (InfoMod AnyCompatibleCommand -> ParserInfo AnyCompatibleCommand)
-> InfoMod AnyCompatibleCommand -> ParserInfo AnyCompatibleCommand
forall a b. (a -> b) -> a -> b
$
            String -> InfoMod AnyCompatibleCommand
forall a. String -> InfoMod a
Opt.progDesc String
"Mary era commands"
    , Mod CommandFields AnyCompatibleCommand
-> Parser AnyCompatibleCommand
forall a. Mod CommandFields a -> Parser a
Opt.hsubparser (Mod CommandFields AnyCompatibleCommand
 -> Parser AnyCompatibleCommand)
-> Mod CommandFields AnyCompatibleCommand
-> Parser AnyCompatibleCommand
forall a b. (a -> b) -> a -> b
$
        String
-> ParserInfo AnyCompatibleCommand
-> Mod CommandFields AnyCompatibleCommand
forall a. String -> ParserInfo a -> Mod CommandFields a
commandWithMetavar String
"alonzo" (ParserInfo AnyCompatibleCommand
 -> Mod CommandFields AnyCompatibleCommand)
-> ParserInfo AnyCompatibleCommand
-> Mod CommandFields AnyCompatibleCommand
forall a b. (a -> b) -> a -> b
$
          Parser AnyCompatibleCommand
-> InfoMod AnyCompatibleCommand -> ParserInfo AnyCompatibleCommand
forall a. Parser a -> InfoMod a -> ParserInfo a
Opt.info (CompatibleCommand AlonzoEra -> AnyCompatibleCommand
forall era.
Typeable era =>
CompatibleCommand era -> AnyCompatibleCommand
AnyCompatibleCommand (CompatibleCommand AlonzoEra -> AnyCompatibleCommand)
-> Parser (CompatibleCommand AlonzoEra)
-> Parser AnyCompatibleCommand
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ShelleyBasedEra AlonzoEra
-> EnvCli -> Parser (CompatibleCommand AlonzoEra)
forall era.
ShelleyBasedEra era -> EnvCli -> Parser (CompatibleCommand era)
pCompatibleCommand ShelleyBasedEra AlonzoEra
ShelleyBasedEraAlonzo EnvCli
envCli) (InfoMod AnyCompatibleCommand -> ParserInfo AnyCompatibleCommand)
-> InfoMod AnyCompatibleCommand -> ParserInfo AnyCompatibleCommand
forall a b. (a -> b) -> a -> b
$
            String -> InfoMod AnyCompatibleCommand
forall a. String -> InfoMod a
Opt.progDesc String
"Alonzo era commands"
    , Mod CommandFields AnyCompatibleCommand
-> Parser AnyCompatibleCommand
forall a. Mod CommandFields a -> Parser a
Opt.hsubparser (Mod CommandFields AnyCompatibleCommand
 -> Parser AnyCompatibleCommand)
-> Mod CommandFields AnyCompatibleCommand
-> Parser AnyCompatibleCommand
forall a b. (a -> b) -> a -> b
$
        String
-> ParserInfo AnyCompatibleCommand
-> Mod CommandFields AnyCompatibleCommand
forall a. String -> ParserInfo a -> Mod CommandFields a
commandWithMetavar String
"babbage" (ParserInfo AnyCompatibleCommand
 -> Mod CommandFields AnyCompatibleCommand)
-> ParserInfo AnyCompatibleCommand
-> Mod CommandFields AnyCompatibleCommand
forall a b. (a -> b) -> a -> b
$
          Parser AnyCompatibleCommand
-> InfoMod AnyCompatibleCommand -> ParserInfo AnyCompatibleCommand
forall a. Parser a -> InfoMod a -> ParserInfo a
Opt.info (CompatibleCommand BabbageEra -> AnyCompatibleCommand
forall era.
Typeable era =>
CompatibleCommand era -> AnyCompatibleCommand
AnyCompatibleCommand (CompatibleCommand BabbageEra -> AnyCompatibleCommand)
-> Parser (CompatibleCommand BabbageEra)
-> Parser AnyCompatibleCommand
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ShelleyBasedEra BabbageEra
-> EnvCli -> Parser (CompatibleCommand BabbageEra)
forall era.
ShelleyBasedEra era -> EnvCli -> Parser (CompatibleCommand era)
pCompatibleCommand ShelleyBasedEra BabbageEra
ShelleyBasedEraBabbage EnvCli
envCli) (InfoMod AnyCompatibleCommand -> ParserInfo AnyCompatibleCommand)
-> InfoMod AnyCompatibleCommand -> ParserInfo AnyCompatibleCommand
forall a b. (a -> b) -> a -> b
$
            String -> InfoMod AnyCompatibleCommand
forall a. String -> InfoMod a
Opt.progDesc String
"Babbage era commands"
    , Mod CommandFields AnyCompatibleCommand
-> Parser AnyCompatibleCommand
forall a. Mod CommandFields a -> Parser a
Opt.hsubparser (Mod CommandFields AnyCompatibleCommand
 -> Parser AnyCompatibleCommand)
-> Mod CommandFields AnyCompatibleCommand
-> Parser AnyCompatibleCommand
forall a b. (a -> b) -> a -> b
$
        String
-> ParserInfo AnyCompatibleCommand
-> Mod CommandFields AnyCompatibleCommand
forall a. String -> ParserInfo a -> Mod CommandFields a
commandWithMetavar String
"conway" (ParserInfo AnyCompatibleCommand
 -> Mod CommandFields AnyCompatibleCommand)
-> ParserInfo AnyCompatibleCommand
-> Mod CommandFields AnyCompatibleCommand
forall a b. (a -> b) -> a -> b
$
          Parser AnyCompatibleCommand
-> InfoMod AnyCompatibleCommand -> ParserInfo AnyCompatibleCommand
forall a. Parser a -> InfoMod a -> ParserInfo a
Opt.info (CompatibleCommand ConwayEra -> AnyCompatibleCommand
forall era.
Typeable era =>
CompatibleCommand era -> AnyCompatibleCommand
AnyCompatibleCommand (CompatibleCommand ConwayEra -> AnyCompatibleCommand)
-> Parser (CompatibleCommand ConwayEra)
-> Parser AnyCompatibleCommand
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ShelleyBasedEra ConwayEra
-> EnvCli -> Parser (CompatibleCommand ConwayEra)
forall era.
ShelleyBasedEra era -> EnvCli -> Parser (CompatibleCommand era)
pCompatibleCommand ShelleyBasedEra ConwayEra
ShelleyBasedEraConway EnvCli
envCli) (InfoMod AnyCompatibleCommand -> ParserInfo AnyCompatibleCommand)
-> InfoMod AnyCompatibleCommand -> ParserInfo AnyCompatibleCommand
forall a b. (a -> b) -> a -> b
$
            String -> InfoMod AnyCompatibleCommand
forall a. String -> InfoMod a
Opt.progDesc String
"Conway era commands"
    ]

pCompatibleCommand :: ShelleyBasedEra era -> EnvCli -> Parser (CompatibleCommand era)
pCompatibleCommand :: forall era.
ShelleyBasedEra era -> EnvCli -> Parser (CompatibleCommand era)
pCompatibleCommand ShelleyBasedEra era
era EnvCli
env =
  [Parser (CompatibleCommand era)] -> Parser (CompatibleCommand era)
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum ([Parser (CompatibleCommand era)]
 -> Parser (CompatibleCommand era))
-> [Parser (CompatibleCommand era)]
-> Parser (CompatibleCommand era)
forall a b. (a -> b) -> a -> b
$
    [Maybe (Parser (CompatibleCommand era))]
-> [Parser (CompatibleCommand era)]
forall a. [Maybe a] -> [a]
catMaybes
      [ Parser (CompatibleCommand era)
-> Maybe (Parser (CompatibleCommand era))
forall a. a -> Maybe a
Just (Parser (CompatibleCommand era)
 -> Maybe (Parser (CompatibleCommand era)))
-> Parser (CompatibleCommand era)
-> Maybe (Parser (CompatibleCommand era))
forall a b. (a -> b) -> a -> b
$ CompatibleTransactionCmds era -> CompatibleCommand era
forall era. CompatibleTransactionCmds era -> CompatibleCommand era
CompatibleTransactionCmds (CompatibleTransactionCmds era -> CompatibleCommand era)
-> Parser (CompatibleTransactionCmds era)
-> Parser (CompatibleCommand era)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> EnvCli
-> ShelleyBasedEra era -> Parser (CompatibleTransactionCmds era)
forall era.
EnvCli
-> ShelleyBasedEra era -> Parser (CompatibleTransactionCmds era)
pAllCompatibleTransactionCommands EnvCli
env ShelleyBasedEra era
era
      , Parser (CompatibleCommand era)
-> Maybe (Parser (CompatibleCommand era))
forall a. a -> Maybe a
Just (Parser (CompatibleCommand era)
 -> Maybe (Parser (CompatibleCommand era)))
-> Parser (CompatibleCommand era)
-> Maybe (Parser (CompatibleCommand era))
forall a b. (a -> b) -> a -> b
$ CompatibleGovernanceCmds era -> CompatibleCommand era
forall era. CompatibleGovernanceCmds era -> CompatibleCommand era
CompatibleGovernanceCmds (CompatibleGovernanceCmds era -> CompatibleCommand era)
-> Parser (CompatibleGovernanceCmds era)
-> Parser (CompatibleCommand era)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ShelleyBasedEra era -> Parser (CompatibleGovernanceCmds era)
forall era.
ShelleyBasedEra era -> Parser (CompatibleGovernanceCmds era)
pCompatibleGovernanceCmds ShelleyBasedEra era
era
      , (CompatibleStakeAddressCmds era -> CompatibleCommand era)
-> Parser (CompatibleStakeAddressCmds era)
-> Parser (CompatibleCommand era)
forall a b. (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap CompatibleStakeAddressCmds era -> CompatibleCommand era
forall era. CompatibleStakeAddressCmds era -> CompatibleCommand era
CompatibleStakeAddressCmds (Parser (CompatibleStakeAddressCmds era)
 -> Parser (CompatibleCommand era))
-> Maybe (Parser (CompatibleStakeAddressCmds era))
-> Maybe (Parser (CompatibleCommand era))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ShelleyBasedEra era
-> Maybe (Parser (CompatibleStakeAddressCmds era))
forall era.
ShelleyBasedEra era
-> Maybe (Parser (CompatibleStakeAddressCmds era))
pCompatibleStakeAddressCmds ShelleyBasedEra era
era
      , (CompatibleStakePoolCmds era -> CompatibleCommand era)
-> Parser (CompatibleStakePoolCmds era)
-> Parser (CompatibleCommand era)
forall a b. (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap CompatibleStakePoolCmds era -> CompatibleCommand era
forall era. CompatibleStakePoolCmds era -> CompatibleCommand era
CompatibleStakePoolCmds (Parser (CompatibleStakePoolCmds era)
 -> Parser (CompatibleCommand era))
-> Maybe (Parser (CompatibleStakePoolCmds era))
-> Maybe (Parser (CompatibleCommand era))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ShelleyBasedEra era
-> EnvCli -> Maybe (Parser (CompatibleStakePoolCmds era))
forall era.
ShelleyBasedEra era
-> EnvCli -> Maybe (Parser (CompatibleStakePoolCmds era))
pCompatibleStakePoolCmds ShelleyBasedEra era
era EnvCli
env
      ]