use super::*;
use clap::Parser;
#[derive(Parser, Debug)]
pub struct LeoProgram {
#[clap(name = "NAME", help = "The name of the program to fetch")]
pub(crate) name: String,
#[arg(
long,
help = "An optional edition to use when fetching the program source. If not specified, the latest edition will be used."
)]
pub(crate) edition: Option<u16>,
#[arg(
long,
help = "Get all mappings defined in the latest edition of the program",
default_value = "false",
conflicts_with = "mapping_value"
)]
pub(crate) mappings: bool,
#[arg(
long,
help = "Get the value corresponding to the specified mapping and key.",
number_of_values = 2,
value_names = &["MAPPING", "KEY"],
conflicts_with = "mappings"
)]
pub(crate) mapping_value: Option<Vec<String>>,
}
impl Command for LeoProgram {
type Input = ();
type Output = String;
fn log_span(&self) -> Span {
tracing::span!(tracing::Level::INFO, "Leo")
}
fn prelude(&self, _context: Context) -> Result<Self::Input> {
Ok(())
}
fn apply(self, _context: Context, _: Self::Input) -> Result<Self::Output> {
let program = if self.name.ends_with(".aleo") { self.name.clone() } else { format!("{}.aleo", self.name) };
if !leo_package::is_valid_program_name(&program) {
return Err(crate::errors::invalid_package_name("program", program).into());
}
let url = if let Some(mapping_info) = self.mapping_value {
format!("program/{program}/mapping/{}/{}", mapping_info[0], mapping_info[1])
} else if self.mappings {
format!("program/{program}/mappings")
} else {
match self.edition {
Some(edition) => format!("program/{program}/{edition}"),
None => format!("program/{program}"),
}
};
Ok(url)
}
}