Skip to main content

greentic_bundle/build/
export.rs

1use std::fs;
2use std::path::Path;
3
4use anyhow::Result;
5
6#[derive(Debug, Clone)]
7pub struct ExportPlan {
8    pub artifact_path: String,
9    pub build_dir: String,
10    pub manifest_path: String,
11}
12
13pub fn export_plan(state: &crate::build::plan::BuildState, artifact: &Path) -> ExportPlan {
14    ExportPlan {
15        artifact_path: artifact.display().to_string(),
16        build_dir: state.build_dir.display().to_string(),
17        manifest_path: state
18            .build_dir
19            .join("bundle-manifest.json")
20            .display()
21            .to_string(),
22    }
23}
24
25pub fn write_build_outputs(
26    state: &crate::build::plan::BuildState,
27    artifact: &Path,
28) -> Result<crate::build::BuildResult> {
29    write_normalized_build_dir(state, &state.build_dir)?;
30    crate::build::squashfs::build_artifact(&state.build_dir, artifact)?;
31    Ok(crate::build::BuildResult {
32        artifact_path: artifact.display().to_string(),
33        build_dir: state.build_dir.display().to_string(),
34        manifest_path: state
35            .build_dir
36            .join("bundle-manifest.json")
37            .display()
38            .to_string(),
39    })
40}
41
42pub fn write_normalized_build_dir(
43    state: &crate::build::plan::BuildState,
44    build_dir: &Path,
45) -> Result<()> {
46    if build_dir.exists() {
47        fs::remove_dir_all(build_dir)?;
48    }
49    fs::create_dir_all(build_dir)?;
50    fs::write(
51        build_dir.join("bundle-manifest.json"),
52        format!("{}\n", serde_json::to_string_pretty(&state.manifest)?),
53    )?;
54    fs::write(
55        build_dir.join("bundle-lock.json"),
56        format!("{}\n", serde_json::to_string_pretty(&state.lock)?),
57    )?;
58    fs::write(build_dir.join("bundle.yaml"), &state.bundle_yaml)?;
59    for (name, contents) in &state.resolved_files {
60        let path = build_dir.join(name);
61        if let Some(parent) = path.parent() {
62            fs::create_dir_all(parent)?;
63        }
64        fs::write(path, contents)?;
65    }
66    for (name, contents) in &state.setup_files {
67        let path = build_dir.join(name);
68        if let Some(parent) = path.parent() {
69            fs::create_dir_all(parent)?;
70        }
71        fs::write(path, contents)?;
72    }
73    for (name, contents) in &state.asset_files {
74        let path = build_dir.join(name);
75        if let Some(parent) = path.parent() {
76            fs::create_dir_all(parent)?;
77        }
78        fs::write(path, contents)?;
79    }
80    Ok(())
81}