mod language;
mod region;
mod script;
mod variant;
pub use language::{
LanguageIdentifierDisplayName, LanguageIdentifierDisplayNameBorrowed,
LanguageIdentifierNameFallbackError,
};
pub use region::{RegionDisplayName, RegionDisplayNameBorrowed};
pub use script::{ScriptDisplayName, ScriptDisplayNameBorrowed};
pub use variant::{VariantDisplayName, VariantDisplayNameBorrowed};
use icu_locale_core::preferences::define_preferences;
use icu_provider::prelude::*;
define_preferences!(
[Copy]
DisplayNamesPreferences,
{}
);
#[derive(Copy, Debug, Eq, PartialEq, Clone, Default)]
#[non_exhaustive]
pub struct LanguageIdentifierDisplayNameOptions {
pub language_display: Option<LanguageDisplay>,
}
impl LanguageIdentifierDisplayNameOptions {
pub(crate) fn should_load_dialect(self) -> bool {
self.language_display.unwrap_or_default() == LanguageDisplay::Dialect
}
}
#[non_exhaustive]
#[derive(Debug, Eq, PartialEq, Clone, Copy, Default)]
pub enum LanguageDisplay {
#[default]
Dialect,
Standard,
}
fn load_one<M0, M1, P>(
provider: &P,
locale: &DataLocale,
attrs: &DataMarkerAttributes,
) -> Result<Option<DataPayload<M1>>, DataError>
where
M0: DataMarker,
M1: DynamicDataMarker<DataStruct = M0::DataStruct>,
P: DataProvider<M0> + ?Sized,
{
let id = DataIdentifierBorrowed::for_marker_attributes_and_locale(attrs, locale);
let mut metadata = DataRequestMetadata::default();
metadata.silent = true;
let response = provider
.load(DataRequest { id, metadata })
.allow_identifier_not_found()?;
Ok(response.map(|r| r.payload.cast()))
}
macro_rules! impl_writeable_for_single_display_name_borrowed {
($borrowed:ident) => {
impl<'a> writeable::Writeable for $borrowed<'a> {
#[inline]
fn write_to<W: core::fmt::Write + ?Sized>(&self, sink: &mut W) -> core::fmt::Result {
sink.write_str(self.value)
}
#[inline]
fn writeable_length_hint(&self) -> writeable::LengthHint {
writeable::LengthHint::exact(self.value.len())
}
#[inline]
fn writeable_borrow(&self) -> Option<&str> {
Some(self.value)
}
}
writeable::impl_display_with_writeable!($borrowed<'_>);
};
}
macro_rules! impl_writeable_for_single_display_name_owned {
($owned:ident) => {
impl writeable::Writeable for $owned {
#[inline]
fn write_to<W: core::fmt::Write + ?Sized>(&self, sink: &mut W) -> core::fmt::Result {
self.as_borrowed().write_to(sink)
}
#[inline]
fn write_to_parts<S: writeable::PartsWrite + ?Sized>(
&self,
sink: &mut S,
) -> core::fmt::Result {
self.as_borrowed().write_to_parts(sink)
}
#[inline]
fn writeable_length_hint(&self) -> writeable::LengthHint {
self.as_borrowed().writeable_length_hint()
}
#[inline]
fn writeable_borrow(&self) -> Option<&str> {
Some(self.borrow_str())
}
}
writeable::impl_display_with_writeable!($owned);
};
}
pub(crate) use impl_writeable_for_single_display_name_borrowed;
pub(crate) use impl_writeable_for_single_display_name_owned;
#[cfg(test)]
pub(crate) fn format_table_row<S: core::fmt::Display, E1, E2>(
name: &str,
items: impl IntoIterator<Item = Result<Result<S, E1>, E2>>,
) -> String {
let row = items
.into_iter()
.map(|item| match item {
Ok(Ok(s)) => format!("\"{s}\""),
_ => "❌".to_string(),
})
.collect::<Vec<_>>()
.join(" | ");
format!("| [`{name}`](Self::{name}) | {row} |")
}