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}