1use super::AssetManager;
8use anyhow::{Context, Result};
9use std::fs;
10use std::path::PathBuf;
11
12pub fn extract_dockerfile_to_temp(
27 asset_manager: &dyn AssetManager,
28 dockerfile_name: &str,
29) -> Result<PathBuf> {
30 let temp_dir = tempfile::TempDir::new().context("Failed to create temporary directory")?;
32 let temp_path = temp_dir.path().to_owned();
33
34 let dockerfile_content = asset_manager.get_dockerfile(dockerfile_name)?;
36 let dockerfile_path = temp_path.join("Dockerfile");
37 fs::write(&dockerfile_path, dockerfile_content).context("Failed to write Dockerfile")?;
38
39 let additional_files = ["squid.conf", "entrypoint.sh", "requirements.txt"];
42
43 for file_name in &additional_files {
44 match asset_manager.get_dockerfile_file(dockerfile_name, file_name) {
45 Ok(content) => {
46 let file_path = temp_path.join(file_name);
47 fs::write(&file_path, content)
48 .with_context(|| format!("Failed to write {file_name}"))?;
49 }
50 Err(_) => {
51 continue;
53 }
54 }
55 }
56
57 std::mem::forget(temp_dir);
59
60 Ok(temp_path)
61}
62
63#[cfg(test)]
64mod tests {
65 use super::*;
66 use crate::assets::embedded::EmbeddedAssetManager;
67
68 #[test]
69 fn test_asset_extraction() {
70 let manager = EmbeddedAssetManager::new();
71
72 let result = extract_dockerfile_to_temp(&manager, "tsk-base");
74 assert!(result.is_ok());
75
76 let temp_dir = result.unwrap();
77 assert!(temp_dir.exists());
78 assert!(temp_dir.join("Dockerfile").exists());
79
80 let _ = std::fs::remove_dir_all(&temp_dir);
82 }
83
84 #[test]
85 fn test_asset_extraction_with_additional_files() {
86 let manager = EmbeddedAssetManager::new();
87
88 let result = extract_dockerfile_to_temp(&manager, "tsk-proxy");
90 assert!(result.is_ok());
91
92 let temp_dir = result.unwrap();
93 assert!(temp_dir.exists());
94 assert!(temp_dir.join("Dockerfile").exists());
95 assert!(temp_dir.join("squid.conf").exists());
96
97 let _ = std::fs::remove_dir_all(&temp_dir);
99 }
100}