use anyhow::{anyhow, Result};
use icu::{
collator::{Collator, CollatorOptions, Strength},
locid::Locale,
};
use icu_provider_adapters::fallback::LocaleFallbackProvider;
use log::debug;
struct UnstableProvider;
include!("./icu-data/mod.rs");
impl_data_provider!(UnstableProvider);
pub(crate) fn collator_for_locale(locale_name: &str, case_insensitive: bool) -> Result<Collator> {
debug!("Creating collator for locale: {locale_name}");
let locale = Locale::try_from_bytes(locale_name.as_bytes())
.map_err(|e| anyhow!("'{locale_name}' is not a valid locale: {e}"))?;
let provider =
LocaleFallbackProvider::try_new_unstable(UnstableProvider).map_err(|e| anyhow!("{e}"))?;
let mut opts = CollatorOptions::new();
if case_insensitive {
debug!("Setting collator strength to secondary to make it case-insensitive");
opts.strength = Some(Strength::Secondary);
}
Collator::try_new_unstable(&provider, &locale.into(), opts).map_err(|e| anyhow!("{e}"))
}