1use anyhow::Result;
8use async_trait::async_trait;
9
10pub mod embedded;
11pub mod filesystem;
12pub mod layered;
13pub mod utils;
14
15#[async_trait]
17pub trait AssetManager: Send + Sync {
18 fn get_template(&self, template_type: &str) -> Result<String>;
20
21 fn get_dockerfile(&self, dockerfile_name: &str) -> Result<Vec<u8>>;
23
24 fn get_dockerfile_file(&self, dockerfile_name: &str, file_path: &str) -> Result<Vec<u8>>;
26
27 fn list_templates(&self) -> Vec<String>;
29
30 fn list_dockerfiles(&self) -> Vec<String>;
32
33 fn get_docker_layer(
35 &self,
36 layer_type: &str,
37 layer_name: &str,
38 _project_root: Option<&std::path::Path>,
39 ) -> Result<Vec<u8>> {
40 let dockerfile_name = if layer_type == "base" {
43 "base".to_string()
44 } else {
45 format!("{layer_type}/{layer_name}")
46 };
47 self.get_dockerfile(&dockerfile_name)
48 }
49
50 fn list_docker_layers(
52 &self,
53 layer_type: &str,
54 _project_root: Option<&std::path::Path>,
55 ) -> Vec<String> {
56 let prefix = if layer_type == "base" {
58 "base".to_string()
59 } else {
60 format!("{layer_type}/")
61 };
62
63 self.list_dockerfiles()
64 .into_iter()
65 .filter(|name| name.starts_with(&prefix))
66 .map(|name| {
67 if layer_type == "base" {
68 "base".to_string()
69 } else {
70 name.strip_prefix(&prefix).unwrap_or(&name).to_string()
71 }
72 })
73 .collect()
74 }
75}