use crate::core::types::Resource;
pub fn check_script(resource: &Resource) -> String {
let name = resource.name.as_deref().unwrap_or("unknown");
format!(
"docker inspect -f '{{{{.State.Running}}}}' '{name}' 2>/dev/null && echo 'exists:{name}' || echo 'missing:{name}'"
)
}
pub fn apply_script(resource: &Resource) -> String {
let name = resource.name.as_deref().unwrap_or("unknown");
let state = resource.state.as_deref().unwrap_or("running");
let image = resource.image.as_deref().unwrap_or("unknown");
match state {
"absent" => format!(
"set -euo pipefail\n\
docker stop '{name}' 2>/dev/null || true\n\
docker rm '{name}' 2>/dev/null || true"
),
"stopped" => format!(
"set -euo pipefail\n\
docker stop '{name}' 2>/dev/null || true"
),
_ => {
let mut lines = vec![
"set -euo pipefail".to_string(),
format!("docker pull '{}'", image),
];
lines.push(format!("docker stop '{name}' 2>/dev/null || true"));
lines.push(format!("docker rm '{name}' 2>/dev/null || true"));
let mut run_args = vec!["docker run -d".to_string()];
run_args.push(format!("--name '{name}'"));
if let Some(ref restart) = resource.restart {
run_args.push(format!("--restart '{restart}'"));
}
for port in &resource.ports {
run_args.push(format!("-p '{port}'"));
}
for env in &resource.environment {
run_args.push(format!("-e '{env}'"));
}
for vol in &resource.volumes {
run_args.push(format!("-v '{vol}'"));
}
run_args.push(format!("'{image}'"));
if let Some(ref cmd) = resource.command {
run_args.push(cmd.clone());
}
lines.push(run_args.join(" \\\n "));
lines.join("\n")
}
}
}
pub fn state_query_script(resource: &Resource) -> String {
let name = resource.name.as_deref().unwrap_or("unknown");
format!(
"docker inspect '{name}' 2>/dev/null && echo 'container={name}' || echo 'container=MISSING:{name}'"
)
}