Skip to main content

ciab_packer/
template.rs

1use ciab_core::error::{CiabError, CiabResult};
2use ciab_core::resolve::{parse_source_string, resolve_resource};
3use ciab_core::types::config::PackerConfig;
4use ciab_core::types::image::TemplateSource;
5use std::path::PathBuf;
6
7pub async fn resolve_template(
8    source: &Option<TemplateSource>,
9    config: &PackerConfig,
10) -> CiabResult<String> {
11    match source {
12        Some(TemplateSource::Inline { content }) => Ok(content.clone()),
13        Some(TemplateSource::FilePath { path }) => {
14            tokio::fs::read_to_string(path).await.map_err(|e| {
15                CiabError::PackerError(format!("Failed to read template {}: {}", path.display(), e))
16            })
17        }
18        Some(TemplateSource::Url { url }) => {
19            let src = parse_source_string(url);
20            resolve_resource(&src).await
21        }
22        Some(TemplateSource::Git { url, path, ref_ }) => {
23            let git_uri = format!(
24                "git::{}//{}{}",
25                url,
26                path,
27                ref_.as_ref()
28                    .map(|r| format!("?ref={}", r))
29                    .unwrap_or_default()
30            );
31            let src = parse_source_string(&git_uri);
32            resolve_resource(&src).await
33        }
34        Some(TemplateSource::Builtin { name }) => {
35            let src = parse_source_string(&format!("builtin://{}", name));
36            resolve_resource(&src).await
37        }
38        None => {
39            let src = parse_source_string(&config.default_template);
40            resolve_resource(&src).await
41        }
42    }
43}
44
45pub async fn write_temp_template(content: &str) -> CiabResult<PathBuf> {
46    let dir = tempfile::tempdir()
47        .map_err(|e| CiabError::PackerError(format!("Failed to create temp dir: {}", e)))?;
48    let path = dir.keep().join("template.pkr.hcl");
49    tokio::fs::write(&path, content).await.map_err(|e| {
50        CiabError::PackerError(format!("Failed to write temp template: {}", e))
51    })?;
52    Ok(path)
53}