use std::{fmt::Display, path::PathBuf};
use crate::{commands::PutType, local_node::LocalNodeCliConfig};
use clap::ValueEnum;
use freenet::dev_tool::OperationMode;
use semver::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::Parser, Clone)]
pub struct BaseConfig {
#[arg(long)]
pub(crate) contract_data_dir: Option<PathBuf>,
#[arg(long)]
pub(crate) delegate_data_dir: Option<PathBuf>,
#[arg(long)]
pub(crate) secret_data_dir: Option<PathBuf>,
#[arg(value_enum, default_value_t=OperationMode::Local)]
pub mode: OperationMode,
}
#[derive(clap::Subcommand, Clone)]
pub enum SubCommand {
RunLocal(LocalNodeCliConfig),
Build(BuildToolCliConfig),
New(NewPackageCliConfig),
Publish(PutConfig),
Execute(RunCliConfig),
Inspect(crate::inspect::InspectCliConfig),
}
#[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 {
#[arg(long)]
pub(crate) code: PathBuf,
#[arg(long)]
pub(crate) parameters: Option<PathBuf>,
#[arg(long)]
pub(crate) release: bool,
#[clap(subcommand)]
pub(crate) package_type: PutType,
}
#[derive(clap::Parser, Clone, Debug)]
pub struct BuildToolCliConfig {
#[arg(long)]
pub(crate) features: Option<String>,
#[arg(long, value_parser = parse_version, default_value_t=Version::new(0, 0, 1))]
pub(crate) version: Version,
#[arg(long, value_enum, default_value_t=PackageType::default())]
pub(crate) package_type: PackageType,
#[arg(long)]
pub(crate) debug: bool,
}
#[derive(Default, Debug, Clone, Copy, ValueEnum)]
pub(crate) enum PackageType {
#[default]
Contract,
Delegate,
}
impl Display for PackageType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
PackageType::Contract => write!(f, "contract"),
PackageType::Delegate => write!(f, "delegate"),
}
}
}
impl Default for BuildToolCliConfig {
fn default() -> Self {
Self {
features: None,
version: Version::new(0, 0, 1),
package_type: PackageType::default(),
debug: false,
}
}
}
fn parse_version(src: &str) -> Result<Version, String> {
Version::parse(src).map_err(|e| e.to_string())
}
#[derive(clap::Parser, Clone)]
pub struct NewPackageCliConfig {
#[arg(id = "type", value_enum)]
pub(crate) kind: ContractKind,
}
#[derive(clap::ValueEnum, Clone)]
pub(crate) enum ContractKind {
WebApp,
Contract,
}