diff options
| author | Hermes Agent <hermes@localhost> | 2026-08-11 20:53:53 +0000 |
|---|---|---|
| committer | Hermes Agent <hermes@localhost> | 2026-08-11 20:53:53 +0000 |
| commit | de352f683f104c68106d488863f338afdb836e94 (patch) | |
| tree | 47812ded4b6a042c4a86e55f16bc661c4c657d57 /src/lib.rs | |
Add independent Rust Hasher rootfs builder
Diffstat (limited to 'src/lib.rs')
| -rw-r--r-- | src/lib.rs | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..b7bf8c2 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,61 @@ +use std::fs; +use std::path::{Path, PathBuf}; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct Profile { + pub packages: Vec<String>, + pub regex_packages: Vec<String>, +} + +impl Profile { + pub fn load(path: &Path) -> Result<Self, String> { + let profile = fs::read_to_string(path).map_err(|error| error.to_string())?; + let parent = path.parent().ok_or("profile path has no parent")?; + let mut packages = Vec::new(); + let mut regex_packages = Vec::new(); + + for line in profile.lines() { + let line = line.trim(); + if line.is_empty() || line.starts_with('#') { + continue; + } + if let Some(values) = line.strip_prefix("base:") { + extend_words(&mut packages, values); + } else if let Some(relative) = line.strip_prefix("include:") { + let list = parent.join(relative.trim()); + let contents = fs::read_to_string(&list) + .map_err(|error| format!("{}: {error}", list.display()))?; + for entry in contents.lines().map(str::trim) { + if entry.is_empty() || entry.starts_with('#') { + continue; + } + let package = entry.split('@').next().unwrap_or(entry).trim(); + if !package.is_empty() { + packages.push(package.to_owned()); + } + } + } else if let Some(value) = line.strip_prefix("regex:") { + regex_packages.push(value.trim().to_owned()); + } else { + return Err(format!("unsupported profile statement: {line}")); + } + } + packages.sort(); + packages.dedup(); + regex_packages.sort(); + regex_packages.dedup(); + Ok(Self { packages, regex_packages }) + } + + pub fn install_arguments(&self) -> Vec<String> { + self.regex_packages.iter().chain(self.packages.iter()).cloned().collect() + } +} + +fn extend_words(target: &mut Vec<String>, values: &str) { + target.extend(values.split_whitespace().map(str::to_owned)); +} + +pub fn artifact_path(project: &Path) -> PathBuf { + project.join("out/alt-controller-rootfs.tar") +} |