gaze-pii 0.6.6

Reversible PII pseudonymization runtime for agentic workflows
Documentation
pub use gaze_types::{LocaleChain, LocaleError, LocaleTag};

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

    #[test]
    fn parses_known_locale_tags() {
        assert_eq!(LocaleTag::parse("global"), Ok(LocaleTag::Global));
        assert_eq!(LocaleTag::parse("de-DE"), Ok(LocaleTag::DeDe));
        assert_eq!(LocaleTag::parse("en_IE"), Ok(LocaleTag::EnIe));
    }

    #[test]
    fn display_uses_canonical_tag() {
        assert_eq!(LocaleTag::EnGb.to_string(), "en-GB");
        assert_eq!(LocaleTag::parse("pt-BR").unwrap().to_string(), "pt-BR");
    }

    #[test]
    fn rejects_invalid_locale_tags() {
        assert_eq!(
            LocaleTag::parse("not a locale"),
            Err(LocaleError::Unsupported)
        );
        assert_eq!(LocaleTag::parse(""), Err(LocaleError::Unsupported));
    }

    #[test]
    fn cli_chain_appends_global() {
        let chain = LocaleChain::from_cli("de-DE,en-US").unwrap();
        assert_eq!(chain.to_strings(), vec!["de-DE", "en-US", "global"]);
    }

    #[test]
    fn cli_chain_replaces_policy_chain_when_explicit() {
        let policy = [LocaleTag::EnGb, LocaleTag::Global];
        let cli = [LocaleTag::DeDe];
        let chain = LocaleChain::merge_policy_and_cli(Some(&policy), Some(&cli));
        assert_eq!(chain.to_strings(), vec!["de-DE", "global"]);
    }

    #[test]
    fn merge_includes_rulepack_default_between_policy_and_system_default() {
        let rulepack = [LocaleTag::EnUs];
        let chain = LocaleChain::merge_cli_policy_rulepack_default(None, None, Some(&rulepack));
        assert_eq!(chain.to_strings(), vec!["en-US", "global"]);

        let policy = [LocaleTag::DeDe];
        let chain =
            LocaleChain::merge_cli_policy_rulepack_default(None, Some(&policy), Some(&rulepack));
        assert_eq!(chain.to_strings(), vec!["de-DE", "global"]);
    }

    #[test]
    fn intersection_treats_global_as_universal() {
        let chain = LocaleChain::from_cli("fr-FR").unwrap();
        assert!(chain.intersects(&[LocaleTag::Global]));
        assert!(chain.intersects(&[LocaleTag::Other("fr-FR".to_string())]));
        assert!(!chain.intersects(&[LocaleTag::DeDe]));
    }

    #[test]
    fn locale_other_does_not_match_unrelated_other() {
        let chain = LocaleChain::from_cli("en-US").unwrap();
        assert!(!chain.intersects(&[LocaleTag::Other("fr-FR".to_string())]));
    }

    #[test]
    fn locale_other_matches_same_other_in_chain() {
        let chain = LocaleChain::from_cli("zh-CN").unwrap();
        assert!(chain.intersects(&[LocaleTag::Other("zh-CN".to_string())]));
    }
}