mod asset;
mod cosmwasm;
mod cw_ownable;
use strum::{EnumDiscriminants, EnumIter, EnumMessage};
use crate::{types::CliLockedChain, GlobalConfig};
#[derive(Debug, Clone, interactive_clap::InteractiveClap)]
#[interactive_clap(input_context = GlobalConfig)]
#[interactive_clap(output_context = CosmosContext)]
pub struct CosmosCommands {
#[interactive_clap(skip_default_input_arg)]
chain_id: CliLockedChain,
#[interactive_clap(subcommand)]
action: CosmosAction,
}
#[derive(Debug, EnumDiscriminants, Clone, interactive_clap::InteractiveClap)]
#[strum_discriminants(derive(EnumMessage, EnumIter))]
#[interactive_clap(context = CosmosContext)]
pub enum CosmosAction {
#[strum_discriminants(strum(message = "🔮 CosmWasm"))]
Cw(cosmwasm::CwCommands),
#[strum_discriminants(strum(message = "🏦 Asset"))]
Asset(asset::AssetCommands),
#[strum_discriminants(strum(message = "👑 CW-Ownable"))]
CwOwnable(cw_ownable::CwOwnableCommands),
}
impl CosmosCommands {
fn input_chain_id(_context: &GlobalConfig) -> color_eyre::eyre::Result<Option<CliLockedChain>> {
crate::common::select_chain()
}
}
impl From<CosmosContext> for () {
fn from(_value: CosmosContext) -> Self {}
}
#[derive(Clone)]
pub struct CosmosContext {
pub chain: CliLockedChain,
pub global_config: GlobalConfig,
}
impl CosmosContext {
fn from_previous_context(
previous_context: GlobalConfig,
scope:&<CosmosCommands as interactive_clap::ToInteractiveClapContextScope>::InteractiveClapContextScope,
) -> color_eyre::eyre::Result<Self> {
Ok(CosmosContext {
chain: scope.chain_id,
global_config: previous_context,
})
}
}