use fluent_templates::{ArcLoader, StaticLoader};
use lang_id::LangID;
use once_cell::sync::{Lazy, OnceCell};
use crate::fluent::{loader::FluentLoader, LangResource};
impl<'a> From<&'static StaticLoader> for LangResource<'a> {
fn from(loader: &'static StaticLoader) -> Self {
LangResource::from_static_loader(loader)
}
}
type OnceStaticLoader = Lazy<StaticLoader>;
impl<'a> From<&'static OnceStaticLoader> for LangResource<'a> {
fn from(loader: &'static OnceStaticLoader) -> Self {
LangResource::from_static_loader(loader)
}
}
impl<'a> From<&'a ArcLoader> for LangResource<'a> {
fn from(loader: &'a ArcLoader) -> Self {
LangResource::from_arc_loader(loader)
}
}
impl<'a> From<ArcLoader> for LangResource<'a> {
fn from(loader: ArcLoader) -> Self {
Self::with_arc_owned(Self::get_current_locale().to_owned(), loader)
}
}
type OnceArcLoader = Lazy<ArcLoader>;
impl<'a> From<&'a OnceArcLoader> for LangResource<'a> {
fn from(loader: &'a OnceArcLoader) -> Self {
LangResource::from_arc_loader(loader)
}
}
impl<'a> LangResource<'a> {
pub fn from_static_loader(loader: &'static StaticLoader) -> Self {
Self::new(Self::get_current_locale().to_owned(), loader)
}
pub fn from_arc_loader(loader: &'a ArcLoader) -> Self {
Self::with_arc(Self::get_current_locale().to_owned(), loader)
}
pub fn new(id: LangID, loader: &'static StaticLoader) -> Self {
Self {
id,
loader: FluentLoader::Static(loader),
chain: OnceCell::new(),
}
}
pub fn with_arc(id: LangID, loader: &'a ArcLoader) -> Self {
Self {
id,
loader: FluentLoader::Arc(loader),
chain: OnceCell::new(),
}
}
pub fn with_arc_owned(id: LangID, loader: ArcLoader) -> Self {
Self {
id,
loader: FluentLoader::ArcOwned(loader),
chain: OnceCell::new(),
}
}
pub fn get_current_locale() -> &'static LangID {
static ID: OnceCell<LangID> = OnceCell::new();
ID.get_or_init(|| {
let mut loc = lang_id::sys_lang::current();
loc.maximize();
loc
})
}
}
#[cfg(test)]
mod tests {
#[test]
fn test_with_ref_arc() {
use crate::{
fluent::loader::{new_arc_loader, ArcLoader},
LangRes,
};
use once_cell::sync::Lazy;
use std::path::Path;
const ERR_MSG: &str = "Failed to create arc loader";
let lang = LangRes::get_current_locale();
let loader = new_arc_loader(Path::new("locales"), None).expect(ERR_MSG);
let res = LangRes::with_arc(lang.to_owned(), &loader);
dbg!(&res);
static LOADER: Lazy<ArcLoader> =
Lazy::new(|| new_arc_loader(Path::new("locales"), None).expect(ERR_MSG));
let res = LangRes::with_arc(lang.to_owned(), &LOADER);
dbg!(&res);
}
#[test]
fn new_language_resource() -> crate::Result<'static, ()> {
use crate::{
fluent::loader::{new_arc_loader, ArcLoader},
LangRes,
};
use once_cell::sync::Lazy;
use std::path::Path;
let lang = LangRes::get_current_locale();
let loader = new_arc_loader(Path::new("locales"), None)?;
let res = LangRes::with_arc(lang.to_owned(), &loader);
dbg!(&res);
static LOADER: Lazy<ArcLoader> = Lazy::new(|| {
new_arc_loader(Path::new("locales"), None)
.expect("Failed to create arc loader")
});
let res = LangRes::with_arc(lang.to_owned(), &LOADER);
dbg!(&res);
Ok(())
}
#[test]
fn test_from_static_loader() {
use crate::fluent::{loader::static_loader, LangResource};
static_loader! {
static L10N_LOADER = {
locales: "../locales",
fallback_language: "en",
customise: |bundle| bundle.set_use_isolating(false),
};
}
let res = LangResource::from(&L10N_LOADER);
dbg!(res
.loader
.get_locales()
.collect::<Vec<_>>());
}
#[test]
fn test_from_arc() {
use crate::fluent::{
loader::{new_arc_loader, ArcLoader},
LangResource,
};
use once_cell::sync::Lazy;
use std::path::Path;
static LOADER: Lazy<ArcLoader> = Lazy::new(|| {
new_arc_loader(Path::new("locales"), None)
.expect("Failed to create arc loader")
});
let res = LangResource::from(&LOADER);
dbg!(res);
}
}