use anyhow::Result;
use contract_build::{
BuildArtifacts,
BuildMode,
BuildResult,
ExecuteArgs,
Features,
ManifestPath,
Network,
OptimizationPasses,
OutputType,
UnstableFlags,
UnstableOptions,
Verbosity,
VerbosityFlags,
};
use std::{
convert::TryFrom,
path::PathBuf,
};
#[derive(Debug, clap::Args)]
#[clap(name = "build")]
pub struct BuildCommand {
#[clap(long, value_parser)]
manifest_path: Option<PathBuf>,
#[clap(long = "release")]
build_release: bool,
#[clap(long = "offline")]
build_offline: bool,
#[clap(long)]
lint: bool,
#[clap(long = "generate", value_enum, default_value = "all")]
build_artifact: BuildArtifacts,
#[clap(flatten)]
features: Features,
#[clap(flatten)]
verbosity: VerbosityFlags,
#[clap(flatten)]
unstable_options: UnstableOptions,
#[clap(long)]
optimization_passes: Option<OptimizationPasses>,
#[clap(long)]
keep_debug_symbols: bool,
#[clap(long, conflicts_with = "verbose")]
output_json: bool,
#[clap(long)]
skip_wasm_validation: bool,
}
impl BuildCommand {
pub fn exec(&self) -> Result<BuildResult> {
let manifest_path = ManifestPath::try_from(self.manifest_path.as_ref())?;
let unstable_flags: UnstableFlags =
TryFrom::<&UnstableOptions>::try_from(&self.unstable_options)?;
let mut verbosity = TryFrom::<&VerbosityFlags>::try_from(&self.verbosity)?;
let build_mode = match self.build_release {
true => BuildMode::Release,
false => BuildMode::Debug,
};
let network = match self.build_offline {
true => Network::Offline,
false => Network::Online,
};
let output_type = match self.output_json {
true => OutputType::Json,
false => OutputType::HumanReadable,
};
if matches!(output_type, OutputType::Json) {
verbosity = Verbosity::Quiet;
}
let args = ExecuteArgs {
manifest_path,
verbosity,
build_mode,
features: self.features.clone(),
network,
build_artifact: self.build_artifact,
unstable_flags,
optimization_passes: self.optimization_passes,
keep_debug_symbols: self.keep_debug_symbols,
lint: self.lint,
output_type,
skip_wasm_validation: self.skip_wasm_validation,
};
contract_build::execute(args)
}
}
#[derive(Debug, clap::Args)]
#[clap(name = "check")]
pub struct CheckCommand {
#[clap(long, value_parser)]
manifest_path: Option<PathBuf>,
#[clap(flatten)]
verbosity: VerbosityFlags,
#[clap(flatten)]
features: Features,
#[clap(flatten)]
unstable_options: UnstableOptions,
}
impl CheckCommand {
pub fn exec(&self) -> Result<BuildResult> {
let manifest_path = ManifestPath::try_from(self.manifest_path.as_ref())?;
let unstable_flags: UnstableFlags =
TryFrom::<&UnstableOptions>::try_from(&self.unstable_options)?;
let verbosity: Verbosity = TryFrom::<&VerbosityFlags>::try_from(&self.verbosity)?;
let args = ExecuteArgs {
manifest_path,
verbosity,
build_mode: BuildMode::Debug,
features: self.features.clone(),
network: Network::default(),
build_artifact: BuildArtifacts::CheckOnly,
unstable_flags,
optimization_passes: Some(OptimizationPasses::Zero),
keep_debug_symbols: false,
lint: false,
output_type: OutputType::default(),
skip_wasm_validation: false,
};
contract_build::execute(args)
}
}