fastboop-core 0.0.1-rc.21

Core profile matching and boot orchestration primitives for fastboop.
Documentation
extern crate alloc;

use alloc::string::{String, ToString};
use alloc::vec::Vec;

#[derive(Clone, Debug, Default)]
pub struct Personalization {
    pub locale: Option<String>,
    pub locale_messages: Option<String>,
    pub keymap: Option<String>,
    pub timezone: Option<String>,
}

impl Personalization {
    pub fn stage0_entries(&self) -> Vec<(String, String)> {
        let mut entries = Vec::new();
        push_entry(&mut entries, "firstboot.locale", self.locale.as_deref());
        push_entry(
            &mut entries,
            "firstboot.locale-messages",
            self.locale_messages.as_deref(),
        );
        push_entry(&mut entries, "firstboot.keymap", self.keymap.as_deref());
        push_entry(&mut entries, "firstboot.timezone", self.timezone.as_deref());
        entries
    }
}

fn push_entry(out: &mut Vec<(String, String)>, name: &str, value: Option<&str>) {
    let Some(value) = value.map(str::trim) else {
        return;
    };
    if value.is_empty() {
        return;
    }
    out.push((name.to_string(), value.to_string()));
}

#[cfg(test)]
mod tests {
    use super::*;
    use alloc::vec;

    #[test]
    fn stage0_entries_include_non_empty_values_only() {
        let personalization = Personalization {
            locale: Some("en_US.UTF-8".to_string()),
            locale_messages: Some("".to_string()),
            keymap: Some("us".to_string()),
            timezone: None,
        };

        let entries = personalization.stage0_entries();
        assert_eq!(
            entries,
            vec![
                ("firstboot.locale".to_string(), "en_US.UTF-8".to_string()),
                ("firstboot.keymap".to_string(), "us".to_string()),
            ]
        );
    }
}