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    warmup: bool,
29) -> Result<crate::build::BuildResult> {
30    write_normalized_build_dir(state, &state.build_dir)?;
31    if warmup {
32        crate::build::warmup::warmup_build_dir(&state.build_dir)?;
33    }
34    crate::bundle_fs::write_bundle(&state.build_dir, artifact)?;
35    Ok(crate::build::BuildResult {
36        artifact_path: artifact.display().to_string(),
37        build_dir: state.build_dir.display().to_string(),
38        manifest_path: state
39            .build_dir
40            .join("bundle-manifest.json")
41            .display()
42            .to_string(),
43    })
44}
45
46pub fn write_normalized_build_dir(
47    state: &crate::build::plan::BuildState,
48    build_dir: &Path,
49) -> Result<()> {
50    if build_dir.exists() {
51        fs::remove_dir_all(build_dir)?;
52    }
53    fs::create_dir_all(build_dir)?;
54    fs::write(
55        build_dir.join("bundle-manifest.json"),
56        format!("{}\n", serde_json::to_string_pretty(&state.manifest)?),
57    )?;
58    fs::write(
59        build_dir.join("bundle-lock.json"),
60        format!("{}\n", serde_json::to_string_pretty(&state.lock)?),
61    )?;
62    fs::write(build_dir.join("bundle.yaml"), &state.bundle_yaml)?;
63    for (name, contents) in &state.resolved_files {
64        let path = build_dir.join(name);
65        if let Some(parent) = path.parent() {
66            fs::create_dir_all(parent)?;
67        }
68        fs::write(path, contents)?;
69    }
70    for (name, contents) in &state.setup_files {
71        let path = build_dir.join(name);
72        if let Some(parent) = path.parent() {
73            fs::create_dir_all(parent)?;
74        }
75        fs::write(path, contents)?;
76    }
77    for (name, contents) in &state.asset_files {
78        let path = build_dir.join(name);
79        if let Some(parent) = path.parent() {
80            fs::create_dir_all(parent)?;
81        }
82        fs::write(path, contents)?;
83    }
84    Ok(())
85}