#![cfg(all(feature = "with-system-locale", any(unix, windows)))]
mod nix;
mod windows;
use std::collections::HashSet;
use crate::error::Error;
use crate::format::Format;
use crate::grouping::Grouping;
use crate::strings::{
DecString, DecimalStr, InfString, InfinityStr, MinString, MinusSignStr, NanStr, NanString,
PlusSignStr, PlusString, SepString, SeparatorStr,
};
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
#[cfg_attr(feature = "with-serde", derive(Serialize, Deserialize))]
pub struct SystemLocale {
pub(crate) dec: DecString,
pub(crate) grp: Grouping,
pub(crate) inf: InfString,
pub(crate) min: MinString,
pub(crate) name: String,
pub(crate) nan: NanString,
pub(crate) plus: PlusString,
pub(crate) sep: SepString,
}
impl SystemLocale {
pub fn new() -> Result<SystemLocale, Error> {
SystemLocale::default()
}
pub fn default() -> Result<SystemLocale, Error> {
#[cfg(unix)]
return self::nix::new(None);
#[cfg(windows)]
return self::windows::new(None);
#[cfg(not(any(unix, windows)))]
unreachable!()
}
pub fn from_name<S>(name: S) -> Result<SystemLocale, Error>
where
S: Into<String>,
{
#[cfg(unix)]
return self::nix::new(Some(name.into()));
#[cfg(windows)]
return self::windows::new(Some(name.into()));
#[cfg(not(any(unix, windows)))]
unreachable!()
}
pub fn available_names() -> Result<HashSet<String>, Error> {
#[cfg(unix)]
return Ok(self::nix::available_names());
#[cfg(windows)]
return self::windows::available_names();
#[cfg(not(any(unix, windows)))]
unreachable!()
}
pub fn decimal(&self) -> &str {
&self.dec
}
pub fn grouping(&self) -> Grouping {
self.grp
}
pub fn infinity(&self) -> &str {
&self.inf
}
pub fn minus_sign(&self) -> &str {
&self.min
}
pub fn name(&self) -> &str {
&self.name
}
pub fn nan(&self) -> &str {
&self.nan
}
pub fn plus_sign(&self) -> &str {
&self.plus
}
pub fn separator(&self) -> &str {
&self.sep
}
#[cfg(unix)]
pub fn set_infinity<S>(&mut self, s: S) -> Result<(), Error>
where
S: AsRef<str>,
{
self.inf = InfString::new(s)?;
Ok(())
}
#[cfg(unix)]
pub fn set_nan<S>(&mut self, s: S) -> Result<(), Error>
where
S: AsRef<str>,
{
self.nan = NanString::new(s)?;
Ok(())
}
}
impl std::str::FromStr for SystemLocale {
type Err = Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
SystemLocale::from_name(s)
}
}
impl Format for SystemLocale {
#[inline(always)]
fn decimal(&self) -> DecimalStr<'_> {
DecimalStr::new(self.decimal()).unwrap()
}
#[inline(always)]
fn grouping(&self) -> Grouping {
self.grouping()
}
#[inline(always)]
fn infinity(&self) -> InfinityStr<'_> {
InfinityStr::new(self.infinity()).unwrap()
}
#[inline(always)]
fn minus_sign(&self) -> MinusSignStr<'_> {
MinusSignStr::new(self.minus_sign()).unwrap()
}
#[inline(always)]
fn nan(&self) -> NanStr<'_> {
NanStr::new(self.nan()).unwrap()
}
#[inline(always)]
fn plus_sign(&self) -> PlusSignStr<'_> {
PlusSignStr::new(self.plus_sign()).unwrap()
}
#[inline(always)]
fn separator(&self) -> SeparatorStr<'_> {
SeparatorStr::new(self.separator()).unwrap()
}
}