use std::fmt;
pub mod options {
#[derive(Eq, PartialEq, Debug, Clone)]
pub enum CompactDisplay {
Short,
Long,
}
#[derive(Eq, PartialEq, Debug, Clone)]
pub struct Currency(pub String);
impl From<&str> for Currency {
fn from(s: &str) -> Self {
Self(s.to_string())
}
}
#[derive(Eq, PartialEq, Debug, Clone)]
pub enum CurrencyDisplay {
Symbol,
NarrowSymbol,
Code,
Name,
}
#[derive(Eq, PartialEq, Debug, Clone)]
pub enum CurrencySign {
Accounting,
Standard,
}
#[derive(Eq, PartialEq, Debug, Clone)]
pub enum Notation {
Standard,
Scientific,
Engineering,
Compact,
}
#[derive(Eq, PartialEq, Debug, Clone)]
pub struct NumberingSystem(pub String);
impl From<&str> for NumberingSystem {
fn from(s: &str) -> Self {
Self(s.to_string())
}
}
impl Default for NumberingSystem {
fn default() -> Self {
NumberingSystem("latn".to_string())
}
}
#[derive(Eq, PartialEq, Debug, Clone)]
pub enum SignDisplay {
Auto,
Never,
Always,
ExceptZero,
}
#[derive(Eq, PartialEq, Debug, Clone)]
pub enum Style {
Decimal,
Currency,
Percent,
Unit,
}
#[derive(Eq, PartialEq, Debug, Clone)]
pub enum UnitDisplay {
Long,
Short,
Narrow,
}
#[derive(Debug, Clone)]
pub struct Unit(pub String);
}
#[derive(Debug, Clone)]
pub struct Options {
pub compact_display: Option<options::CompactDisplay>,
pub currency: Option<options::Currency>,
pub currency_display: options::CurrencyDisplay,
pub currency_sign: options::CurrencySign,
pub notation: options::Notation,
pub numbering_system: Option<options::NumberingSystem>,
pub sign_display: options::SignDisplay,
pub style: options::Style,
pub unit: Option<options::Unit>,
pub minimum_integer_digits: Option<u8>,
pub minimum_fraction_digits: Option<u8>,
pub maximum_fraction_digits: Option<u8>,
pub minimum_significant_digits: Option<u8>,
pub maximum_significant_digits: Option<u8>,
}
impl Default for Options {
fn default() -> Self {
Options {
compact_display: None,
currency: None,
currency_display: options::CurrencyDisplay::Symbol,
currency_sign: options::CurrencySign::Standard,
notation: options::Notation::Standard,
sign_display: options::SignDisplay::Auto,
style: options::Style::Decimal,
unit: None,
numbering_system: None,
minimum_integer_digits: None,
minimum_fraction_digits: None,
maximum_fraction_digits: None,
minimum_significant_digits: None,
maximum_significant_digits: None,
}
}
}
pub trait NumberFormat {
type Error: std::error::Error;
fn try_new<L>(l: L, opts: Options) -> Result<Self, Self::Error>
where
L: crate::Locale,
Self: Sized;
fn format<W>(&self, number: f64, writer: &mut W) -> fmt::Result
where
W: fmt::Write;
}