pub mod errors;
pub mod handlers;
pub mod validators;
use clap::{Args, Subcommand};
use errors::Result;
use std::path::PathBuf;
#[derive(Debug, Args)]
pub struct PaasCommand {
#[arg(short, long, global = true)]
pub verbose: bool,
#[arg(long, global = true, env = "GGEN_SPEC_DIR")]
pub spec_dir: Option<PathBuf>,
#[arg(long, global = true, env = "GGEN_OUTPUT_DIR")]
pub output_dir: Option<PathBuf>,
#[command(subcommand)]
pub action: PaasAction,
}
#[derive(Debug, Subcommand)]
pub enum PaasAction {
Init {
#[arg(value_name = "NAME")]
name: String,
#[arg(long)]
recursive: bool,
#[arg(long)]
shallow: bool,
},
Update {
#[arg(value_name = "NAME")]
name: Option<String>,
#[arg(long)]
recursive: bool,
#[arg(long)]
checkout: Option<String>,
},
Validate {
#[arg(long, value_name = "PATH")]
spec: Option<PathBuf>,
#[arg(long, default_value = "95")]
min_closure: f32,
#[arg(long)]
strict: bool,
},
Sync {
#[arg(long, value_name = "PATH")]
source: Option<PathBuf>,
#[arg(long, value_name = "PATH")]
target: Option<PathBuf>,
#[arg(long)]
dry_run: bool,
},
Deploy {
#[arg(long, value_name = "ENV")]
environment: String,
#[arg(long, value_name = "TARGET")]
target: Option<String>,
#[arg(long)]
dry_run: bool,
#[arg(long)]
force: bool,
},
Status {
#[arg(long, value_name = "ENV")]
environment: Option<String>,
#[arg(short, long)]
detailed: bool,
},
Logs {
#[arg(short, long, default_value = "50")]
lines: usize,
#[arg(long, value_name = "NAME")]
deployment: Option<String>,
#[arg(short, long)]
follow: bool,
#[arg(long)]
level: Option<String>,
},
Describe {
#[arg(value_name = "NAME")]
name: String,
#[arg(long)]
detailed: bool,
#[arg(long, default_value = "table")]
format: String,
},
Explain {
#[arg(value_name = "PATH")]
path: PathBuf,
#[arg(long)]
show_spec: bool,
#[arg(long)]
show_pipeline: bool,
},
}
impl PaasCommand {
pub async fn execute(self) -> Result<()> {
if let Some(spec_dir) = self.spec_dir.as_ref() {
if let Some(spec_str) = spec_dir.to_str() {
validators::validate_closure(spec_str, 95.0).await?;
}
}
match self.action {
PaasAction::Init {
name,
recursive,
shallow,
} => {
handlers::init::init_submodule(&name, recursive, shallow).await?;
}
PaasAction::Update {
name,
recursive,
checkout,
} => {
handlers::update::update_submodule(name.as_deref(), recursive, checkout.as_deref())
.await?;
}
PaasAction::Validate {
spec,
min_closure,
strict,
} => {
let spec_path = spec
.as_ref()
.and_then(|p| p.to_str())
.unwrap_or(".specify");
handlers::validate::validate_specs(spec_path, min_closure, strict).await?;
}
PaasAction::Sync {
source,
target,
dry_run,
} => {
let src = source
.as_ref()
.and_then(|p| p.to_str())
.unwrap_or(".specify");
let tgt = target
.as_ref()
.and_then(|p| p.to_str())
.unwrap_or(".");
handlers::sync::sync_specs(src, tgt, dry_run).await?;
}
PaasAction::Deploy {
environment,
target,
dry_run,
force,
} => {
handlers::deploy::deploy_artifacts(&environment, target.as_deref(), dry_run, force)
.await?;
}
PaasAction::Status {
environment,
detailed,
} => {
handlers::status::show_status(environment.as_deref(), detailed).await?;
}
PaasAction::Logs {
lines,
deployment,
follow,
level,
} => {
handlers::logs::stream_logs(
lines,
deployment.as_deref(),
follow,
level.as_deref(),
)
.await?;
}
PaasAction::Describe { name, detailed, format } => {
handlers::describe::describe_resource(&name, detailed, &format).await?;
}
PaasAction::Explain {
path,
show_spec,
show_pipeline,
} => {
handlers::explain::explain_artifact(&path, show_spec, show_pipeline).await?;
}
}
Ok(())
}
}