agent-team-mail-core 1.1.2

Daemon-free core library for local agent team mail workflows.
Documentation
use super::AtmConfig;

pub fn resolve_agent(value: &str, config: Option<&AtmConfig>) -> String {
    config
        .and_then(|config| config.aliases.get(value))
        .cloned()
        .unwrap_or_else(|| value.to_string())
}

pub fn preferred_alias(canonical: &str, config: Option<&AtmConfig>) -> Option<String> {
    config.and_then(|config| {
        config
            .aliases
            .iter()
            .find_map(|(alias, resolved)| (resolved == canonical).then(|| alias.clone()))
    })
}

#[cfg(test)]
mod tests {
    use std::collections::BTreeMap;

    use super::{preferred_alias, resolve_agent};
    use crate::config::AtmConfig;

    #[test]
    fn resolve_agent_returns_canonical_name_when_alias_exists() {
        let mut aliases = BTreeMap::new();
        aliases.insert("tl".to_string(), "team-lead".to_string());
        let config = AtmConfig {
            aliases,
            ..Default::default()
        };

        assert_eq!(resolve_agent("tl", Some(&config)), "team-lead");
        assert_eq!(resolve_agent("team-lead", Some(&config)), "team-lead");
    }

    #[test]
    fn preferred_alias_returns_first_alias_for_canonical_name() {
        let mut aliases = BTreeMap::new();
        aliases.insert("lead".to_string(), "team-lead".to_string());
        aliases.insert("tl".to_string(), "team-lead".to_string());
        let config = AtmConfig {
            aliases,
            ..Default::default()
        };

        assert_eq!(
            preferred_alias("team-lead", Some(&config)).as_deref(),
            Some("lead")
        );
        assert_eq!(preferred_alias("arch-ctm", Some(&config)), None);
    }
}