use clap::{Parser, Subcommand};
use std::fmt::Debug;
use strum::IntoEnumIterator;
use crate::contract::Deploy;
#[derive(Parser, Clone, Debug)]
#[command(author, version, about, long_about = None)]
pub struct Cli<C, S = EmptySubcommand>
where
C: Deploy + Clone,
S: Subcommand + Clone + Debug,
{
#[command(subcommand)]
pub command: Commands<C, S>,
#[arg(long, required = false)]
pub cargo_args: Vec<String>,
}
#[derive(Parser, Clone, Debug)]
#[clap(rename_all = "snake_case", infer_subcommands = true)]
pub enum Commands<C, S>
where
C: Deploy + Clone,
S: Subcommand + Clone + Debug,
{
#[command(visible_alias = "u")]
Update,
Init,
#[command(visible_alias = "b")]
Build {
#[arg(short, long, use_value_delimiter=true, value_delimiter=',', default_values=get_all::<C>())]
contracts: Vec<C>,
},
#[command(arg_required_else_help = true)]
Chain {
#[arg(short, long, exclusive = true)]
add: bool,
#[arg(short, long, exclusive = true)]
delete: bool,
},
#[command(arg_required_else_help = true)]
Key {
#[arg(short, long, exclusive = true)]
add: bool,
#[arg(short, long, exclusive = true)]
delete: bool,
},
#[command(arg_required_else_help = true)]
Contract {
#[arg(short, long, exclusive = true)]
add: bool,
#[arg(short, long, exclusive = true)]
delete: bool,
},
#[command(visible_alias = "d")]
Deploy {
#[arg(short, long, use_value_delimiter=true, value_delimiter=',', default_values=get_all::<C>(), value_parser=C::from_str)]
contracts: Vec<C>,
#[arg(short, long, required = false)]
no_build: bool,
},
Env {
#[arg(short, long, exclusive = true)]
add: bool,
#[arg(short, long, exclusive = true)]
delete: bool,
#[arg(short, long, exclusive = true)]
select: bool,
#[arg(short, long, exclusive = true)]
id: bool,
},
Schema {
#[arg(short, long, use_value_delimiter=true, value_delimiter=',', default_values=get_all::<C>())]
contracts: Vec<C>,
},
StoreCode {
#[arg(short, long, use_value_delimiter=true, value_delimiter=',', default_values=get_all::<C>())]
contracts: Vec<C>,
},
#[command(visible_alias = "i")]
Instantiate {
#[arg(short, long, use_value_delimiter=true, value_delimiter=',', default_values=get_all::<C>())]
contracts: Vec<C>,
#[arg(short, long, required = false)]
interactive: bool,
},
#[command(visible_alias = "m")]
Migrate {
#[arg(short, long, use_value_delimiter=true, value_delimiter=',', default_values=get_all::<C>())]
contracts: Vec<C>,
#[arg(short, long, required = false)]
interactive: bool,
},
SetConfig {
#[arg(short, long, use_value_delimiter=true, value_delimiter=',', default_values=get_all::<C>())]
contracts: Vec<C>,
},
#[command(visible_alias = "x")]
Execute { contract: C },
Cw20Send { contract: C },
Cw20Execute {},
Cw20Query {},
Cw20Instantiate {},
ExecutePayload {
#[arg(short, long)]
contract: C,
#[arg(short, long)]
payload: String,
},
#[command(flatten)]
Custom(S),
#[command(visible_alias = "q")]
Query { contract: C },
SetUp {
#[arg(short, long, use_value_delimiter=true, value_delimiter=',', default_values=get_all::<C>())]
contracts: Vec<C>,
},
}
fn get_all<C: Deploy + IntoEnumIterator>() -> Vec<String> {
C::iter().map(|x| x.to_string()).collect()
}
#[derive(Subcommand, Clone, Debug)]
pub enum EmptySubcommand {}