use std::sync::Arc;
use crate::core::{Backend, I18n};
use crate::error::I18nError;
pub struct I18nBuilder {
default_locale: String,
fallback_locale: String,
backends: Vec<Arc<dyn Backend>>,
}
impl Default for I18nBuilder {
fn default() -> Self {
Self::new()
}
}
impl I18nBuilder {
pub fn new() -> Self {
Self {
default_locale: "en".to_string(),
fallback_locale: "en".to_string(),
backends: Vec::new(),
}
}
pub fn default_locale(mut self, locale: impl Into<String>) -> Self {
self.default_locale = locale.into();
self
}
pub fn fallback_locale(mut self, locale: impl Into<String>) -> Self {
self.fallback_locale = locale.into();
self
}
#[cfg(feature = "toml-backend")]
pub fn embedded_translations(self, pairs: &[(&str, &str)]) -> Result<Self, I18nError> {
let backend = crate::backend::TomlBackend::from_embedded(pairs)?;
Ok(self.add_backend(Arc::new(backend)))
}
#[cfg(all(feature = "fs-loader", feature = "toml-backend"))]
pub fn translations_from_dir(
self,
path: impl AsRef<std::path::Path>,
) -> Result<Self, I18nError> {
let backend = crate::backend::TomlBackend::from_dir(path)?;
Ok(self.add_backend(Arc::new(backend)))
}
#[cfg(all(feature = "fs-loader", feature = "toml-backend"))]
pub fn optional_translations_from_dir(
self,
path: impl AsRef<std::path::Path>,
) -> Result<Self, I18nError> {
let backend = crate::backend::TomlBackend::try_from_dir(path)?;
Ok(self.add_backend(Arc::new(backend)))
}
#[cfg(feature = "json-backend")]
pub fn json_translations(self, pairs: &[(&str, &str)]) -> Result<Self, I18nError> {
let backend = crate::json_backend::JsonBackend::from_embedded(pairs)?;
Ok(self.add_backend(Arc::new(backend)))
}
#[cfg(all(feature = "fs-loader", feature = "json-backend"))]
pub fn json_from_dir(self, path: impl AsRef<std::path::Path>) -> Result<Self, I18nError> {
let backend = crate::json_backend::JsonBackend::from_dir(path)?;
Ok(self.add_backend(Arc::new(backend)))
}
#[cfg(all(feature = "fs-loader", feature = "json-backend"))]
pub fn optional_json_from_dir(
self,
path: impl AsRef<std::path::Path>,
) -> Result<Self, I18nError> {
let backend = crate::json_backend::JsonBackend::try_from_dir(path)?;
Ok(self.add_backend(Arc::new(backend)))
}
#[cfg(feature = "yaml-backend")]
pub fn yaml_translations(self, pairs: &[(&str, &str)]) -> Result<Self, I18nError> {
let backend = crate::yaml_backend::YamlBackend::from_embedded(pairs)?;
Ok(self.add_backend(Arc::new(backend)))
}
#[cfg(all(feature = "fs-loader", feature = "yaml-backend"))]
pub fn yaml_from_dir(self, path: impl AsRef<std::path::Path>) -> Result<Self, I18nError> {
let backend = crate::yaml_backend::YamlBackend::from_dir(path)?;
Ok(self.add_backend(Arc::new(backend)))
}
#[cfg(all(feature = "fs-loader", feature = "yaml-backend"))]
pub fn optional_yaml_from_dir(
self,
path: impl AsRef<std::path::Path>,
) -> Result<Self, I18nError> {
let backend = crate::yaml_backend::YamlBackend::try_from_dir(path)?;
Ok(self.add_backend(Arc::new(backend)))
}
pub fn add_backend(mut self, backend: Arc<dyn Backend>) -> Self {
self.backends.push(backend);
self
}
pub fn build(self) -> Result<I18n, I18nError> {
let backend: Arc<dyn Backend> = match self.backends.len() {
0 => return Err(I18nError::NoBackend),
1 => self.backends.into_iter().next().unwrap(),
_ => Arc::new(crate::backend::ChainedBackend::new(self.backends)),
};
Ok(I18n::new(
backend,
self.default_locale,
self.fallback_locale,
))
}
}