pub mod common;
pub mod docker;
pub mod k8s;
pub mod systemd;
use crate::config::Config;
use std::path::Path;
use thiserror::Error;
#[derive(Debug, Clone, Copy)]
pub enum OnpremTarget {
Docker,
Systemd,
K8s,
}
pub struct GenerateOutcome {
pub written: Vec<std::path::PathBuf>,
}
#[derive(Debug, Error)]
pub enum GenerateError {
#[error("config: {0}")]
Config(#[from] crate::config::ConfigError),
#[error("io: {0}")]
Io(#[from] std::io::Error),
#[error("template: {0}")]
Template(String),
#[error("serialization: {0}")]
Serialization(#[from] serde_yaml::Error),
}
pub fn generate(
config: &Config,
deployment_name: &str,
target: OnpremTarget,
output_dir: &Path,
) -> Result<GenerateOutcome, GenerateError> {
let sliced = crate::config::slice::for_deployment(config, deployment_name)?;
let dep = &sliced.deployments[0];
if !matches!(dep.target, crate::config::DeploymentTarget::Onprem) {
tracing::warn!(
deployment = %deployment_name,
"deployment target is not 'onprem'; artefacts are still useful for testing or migration"
);
}
std::fs::create_dir_all(output_dir)?;
let common_paths = common::write_common(&sliced, output_dir)?;
let target_paths = match target {
OnpremTarget::Docker => docker::write(&sliced, deployment_name, output_dir)?,
OnpremTarget::Systemd => systemd::write(&sliced, deployment_name, output_dir)?,
OnpremTarget::K8s => k8s::write(&sliced, deployment_name, output_dir)?,
};
let written = common_paths.into_iter().chain(target_paths).collect();
Ok(GenerateOutcome { written })
}