use std::path::PathBuf;
use crate::local_node::LocalNodeCliConfig;
use locutus_stdlib::prelude::Version;
#[derive(clap::Parser, Clone)]
#[clap(name = "Locutus Development Tool")]
#[clap(author = "The Freenet Project Inc.")]
#[clap(version = "0.0.3")]
pub struct Config {
#[clap(subcommand)]
pub sub_command: SubCommand,
#[clap(flatten)]
pub additional: BaseConfig,
}
#[derive(clap::ValueEnum, Clone, Copy, Debug)]
pub enum OperationMode {
Local,
Network,
}
#[derive(clap::Parser, Clone)]
pub struct BaseConfig {
pub(crate) contract_data_dir: Option<PathBuf>,
#[clap(value_enum, default_value_t=OperationMode::Local)]
pub(crate) mode: OperationMode,
}
#[derive(clap::Subcommand, Clone)]
pub enum SubCommand {
RunLocal(LocalNodeCliConfig),
Build(BuildToolCliConfig),
New(NewPackageCliConfig),
Publish(PutConfig),
Execute(RunCliConfig),
}
#[derive(clap::Parser, Clone)]
pub struct RunCliConfig {
#[clap(subcommand)]
pub command: NodeCommand,
}
#[derive(clap::Subcommand, Clone)]
pub enum NodeCommand {
Put(PutConfig),
Update(UpdateConfig),
}
#[derive(clap::Parser, Clone)]
pub struct UpdateConfig {
pub(crate) key: String,
pub(crate) delta: PathBuf,
pub(crate) release: bool,
}
#[derive(clap::Parser, Clone)]
pub struct PutConfig {
#[clap(long)]
pub(crate) code: PathBuf,
#[clap(long)]
pub(crate) parameters: Option<PathBuf>,
#[clap(long)]
pub(crate) state: PathBuf,
#[clap(long)]
pub(crate) release: bool,
#[clap(long)]
pub(crate) related_contracts: Option<PathBuf>,
}
#[derive(clap::Parser, Clone)]
pub struct BuildToolCliConfig {
#[clap(long)]
pub(crate) wasi: bool,
#[clap(long, value_parser = parse_version, default_value_t=Version::new(0, 0, 1))]
pub(crate) version: Version,
}
impl Default for BuildToolCliConfig {
fn default() -> Self {
Self {
wasi: false,
version: Version::new(0, 0, 1),
}
}
}
fn parse_version(src: &str) -> Result<Version, String> {
Version::parse(src).map_err(|e| e.to_string())
}
#[derive(clap::Parser, Clone)]
pub struct NewPackageCliConfig {
#[clap(id = "type", value_enum)]
pub(crate) kind: ContractKind,
}
#[derive(clap::ValueEnum, Clone)]
pub(crate) enum ContractKind {
WebApp,
Contract,
}