summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2020-10-14 18:05:26 +0200
committerMatthias Beyer <mail@beyermatthias.de>2020-10-14 18:05:26 +0200
commit77b7b1b04ed4039760d053cbd8fa05c7892ecb02 (patch)
tree2a376a0b337e4da0d2c2f4e5fa8a725c3c9dd3cf
parent87ae994c6031028643b62239ee9f27f3aaafbf56 (diff)
Add script module
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r--src/package/mod.rs3
-rw-r--r--src/package/script.rs64
2 files changed, 67 insertions, 0 deletions
diff --git a/src/package/mod.rs b/src/package/mod.rs
index 1d91205..2f4f58b 100644
--- a/src/package/mod.rs
+++ b/src/package/mod.rs
@@ -9,6 +9,9 @@ pub use name::*;
mod package;
pub use package::*;
+mod script;
+pub use script::*;
+
mod source;
pub use source::*;
diff --git a/src/package/script.rs b/src/package/script.rs
new file mode 100644
index 0000000..2a3074f
--- /dev/null
+++ b/src/package/script.rs
@@ -0,0 +1,64 @@
+use anyhow::Result;
+
+use crate::phase::Phase;
+use crate::phase::PhaseName;
+use crate::package::Package;
+
+#[derive(Debug)]
+pub struct Script(String);
+
+pub struct ScriptBuilder {
+ shebang : String,
+}
+
+impl ScriptBuilder {
+ // TODO: Use handlebars and templating instead of hardcoding
+ pub fn new(shebang: String) -> Self {
+ ScriptBuilder {
+ shebang,
+ }
+ }
+
+ pub fn build(self, package: &Package, phaseorder: &[&PhaseName]) -> Result<Script> {
+ let mut script = format!("{shebang}\n", shebang = self.shebang);
+
+ for name in phaseorder {
+ match package.phases().get(name) {
+ Some(Phase::Text(text)) => {
+ script.push_str(&format!(r#"
+ ### phase {name}
+ {text}
+ ### / phase
+ "#,
+ name = name.as_str(),
+ text = text,
+ ));
+
+ script.push_str("\n");
+ },
+
+ // TODO: Support path embedding
+ // (requires possibility to have stuff in Script type that gets copied to
+ // container)
+ Some(Phase::Path(pb)) => {
+ script.push_str(&format!(r#"
+ # Phase (from file {path}): {name}
+ # NOT SUPPORTED YET
+ exit 1
+ "#,
+ path = pb.display(),
+ name = name.as_str()));
+
+ script.push_str("\n");
+ },
+
+ None => {
+ script.push_str(&format!("# No script for phase: {name}", name = name.as_str()));
+ script.push_str("\n");
+ },
+ }
+ }
+
+ Ok(Script(script))
+ }
+}