use std::path::{Path, PathBuf};
use clap::{Args, Subcommand};
use crate::cli::CanisterTarget;
#[derive(Debug, Subcommand)]
pub(crate) enum SchemaCommand {
Show(CanisterTarget),
DiagnosticArtifact(DiagnosticArtifactArgs),
DiagnosticSourceMetadata(DiagnosticSourceMetadataArgs),
#[command(subcommand)]
Migration(SchemaMigrationCommand),
}
#[derive(Args, Debug)]
pub(crate) struct DiagnosticArtifactArgs {
#[command(flatten)]
target: CanisterTarget,
#[arg(short, long, value_name = "PATH")]
output: PathBuf,
}
impl DiagnosticArtifactArgs {
pub(crate) const fn target(&self) -> &CanisterTarget {
&self.target
}
pub(crate) fn output(&self) -> &Path {
self.output.as_path()
}
}
#[derive(Args, Debug)]
pub(crate) struct DiagnosticSourceMetadataArgs {
#[arg(long, value_name = "PATH")]
artifact: PathBuf,
#[arg(long, value_name = "SOURCE")]
source: String,
#[arg(short, long, value_name = "PATH")]
output: PathBuf,
}
impl DiagnosticSourceMetadataArgs {
pub(crate) fn artifact(&self) -> &Path {
self.artifact.as_path()
}
pub(crate) const fn source(&self) -> &str {
self.source.as_str()
}
pub(crate) fn output(&self) -> &Path {
self.output.as_path()
}
}
#[derive(Debug, Subcommand)]
pub(crate) enum SchemaMigrationCommand {
Status(CanisterTarget),
Advance(CanisterTarget),
Run(CanisterTarget),
Abort(ConfirmedMigrationTarget),
Adopt(ConfirmedMigrationTarget),
}
#[derive(Args, Debug)]
pub(crate) struct ConfirmedMigrationTarget {
#[command(flatten)]
target: CanisterTarget,
#[arg(long)]
yes: bool,
}
impl ConfirmedMigrationTarget {
pub(crate) const fn target(&self) -> &CanisterTarget {
&self.target
}
pub(crate) const fn confirmed(&self) -> bool {
self.yes
}
}