use std::path::{Path, PathBuf};
use clap::Args;
use crate::cli::{DEFAULT_ENVIRONMENT, ICP_ENVIRONMENT_ENV};
#[derive(Args, Debug)]
pub(crate) struct DiagnosticArgs {
#[arg(
value_name = "CODE",
required_unless_present = "error_json",
conflicts_with = "error_json"
)]
code: Option<String>,
#[arg(long, value_name = "PATH", conflicts_with_all = ["code", "facts"])]
error_json: Option<PathBuf>,
#[arg(long = "fact", value_name = "TAG=VALUE")]
facts: Vec<String>,
#[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, value_name = "ENV")]
environment: Option<String>,
}
impl DiagnosticArgs {
pub(crate) fn code(&self) -> Option<&str> {
self.code.as_deref()
}
pub(crate) fn error_json(&self) -> Option<&Path> {
self.error_json.as_deref()
}
pub(crate) const fn facts(&self) -> &[String] {
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) fn environment(&self) -> &str {
self.environment.as_deref().unwrap_or(DEFAULT_ENVIRONMENT)
}
}