use std::path::{Path, PathBuf};
use clap::Args;
use crate::{
cli::{DEFAULT_ENVIRONMENT, ICP_ENVIRONMENT_ENV},
diagnostic::{RawDiagnosticFact, parse_error_code, parse_fact},
};
#[derive(Args, Debug)]
pub(crate) struct DiagnosticArgs {
#[arg(
value_name = "CODE",
required_unless_present = "error_json",
conflicts_with = "error_json",
value_parser = parse_error_code
)]
code: Option<u16>,
#[arg(long, value_name = "PATH", conflicts_with_all = ["code", "facts"])]
error_json: Option<PathBuf>,
#[arg(long = "fact", value_name = "TAG=VALUE", value_parser = parse_fact)]
facts: Vec<RawDiagnosticFact>,
#[arg(long, value_name = "PATH")]
artifact: Option<PathBuf>,
#[arg(long, value_name = "PATH")]
source_metadata: Option<PathBuf>,
#[arg(long, value_name = "CANISTER")]
canister: Option<String>,
#[arg(
short,
long,
env = ICP_ENVIRONMENT_ENV,
default_value = DEFAULT_ENVIRONMENT,
value_name = "ENV"
)]
environment: String,
}
impl DiagnosticArgs {
pub(crate) const fn code(&self) -> Option<u16> {
self.code
}
pub(crate) fn error_json(&self) -> Option<&Path> {
self.error_json.as_deref()
}
pub(crate) const fn facts(&self) -> &[RawDiagnosticFact] {
self.facts.as_slice()
}
pub(crate) fn artifact(&self) -> Option<&Path> {
self.artifact.as_deref()
}
pub(crate) fn source_metadata(&self) -> Option<&Path> {
self.source_metadata.as_deref()
}
pub(crate) fn canister_name(&self) -> Option<&str> {
self.canister.as_deref()
}
pub(crate) const fn environment(&self) -> &str {
self.environment.as_str()
}
}