es-fluent 0.19.0

Type-safe Fluent localization derives and runtime traits for Rust applications
Documentation
mod fluent_choice;
mod fluent_message;
mod label;

use crate::registry::StaticFluentMessageKey;

fn missing_fluent_value(key: StaticFluentMessageKey, kind: &str) -> String {
    if let Some(fallback) = key.fallback() {
        return fallback.to_string();
    }

    panic!(
        "missing Fluent {} `{}` in domain `{}` owned by `{}`",
        kind,
        key.id().as_str(),
        key.domain().as_str(),
        key.owner().as_str(),
    )
}

pub use fluent_choice::EsFluentChoice;
pub use fluent_message::{
    FluentArgs, FluentArgumentValue, FluentBorrowedArgumentValue, FluentLocalizer,
    FluentLocalizerExt, FluentLocalizerLookup, FluentMessage, FluentMessageLookup,
    FluentOptionalArgumentValue, IntoFluentArgumentValue, IntoFluentValue,
};
pub use label::{FluentLabel, localize_label};

#[cfg(test)]
mod tests {
    use super::missing_fluent_value;
    use crate::registry::{StaticFluentDomain, StaticFluentEntryId, StaticFluentMessageKey};

    fn key(fallback: Option<&'static str>) -> StaticFluentMessageKey {
        let owner = StaticFluentDomain::try_new("test-app").expect("owner");
        let id = StaticFluentEntryId::try_new("missing_value").expect("id");
        match fallback {
            Some(fallback) => StaticFluentMessageKey::with_fallback(owner, owner, id, fallback),
            None => StaticFluentMessageKey::new(owner, owner, id),
        }
    }

    #[test]
    fn missing_value_behavior_is_carried_by_each_key() {
        assert_eq!(
            missing_fluent_value(key(Some("missing_value")), "message"),
            "missing_value"
        );
        assert!(std::panic::catch_unwind(|| missing_fluent_value(key(None), "message")).is_err());
    }
}