fluent_static_value/
lib.rs

1use std::{borrow::Cow, str::FromStr};
2
3pub mod number;
4
5pub use number::format::NumberFormat;
6pub use number::Number;
7
8#[derive(Debug, Clone)]
9pub enum Value<'a> {
10    String(Cow<'a, str>),
11    Number {
12        value: Number,
13        format: Option<NumberFormat>,
14    },
15    // TODO datetime
16    Empty,
17    Error,
18}
19
20impl<'a> Value<'a> {
21    pub fn try_number(value: &'a str) -> Self {
22        if let Ok(number) = Number::from_str(value) {
23            number.into()
24        } else {
25            value.into()
26        }
27    }
28
29    pub fn formatted_number(value: impl Into<Number>, number_format: NumberFormat) -> Self {
30        Self::Number {
31            value: value.into(),
32            format: Some(number_format),
33        }
34    }
35
36    pub fn is_string(&self) -> bool {
37        match self {
38            Value::String(_) => true,
39            _ => false,
40        }
41    }
42
43    pub fn is_number(&self) -> bool {
44        match self {
45            Value::Number { .. } => true,
46            _ => false,
47        }
48    }
49}
50
51impl<'a> PartialEq for Value<'a> {
52    fn eq(&self, other: &Self) -> bool {
53        match (self, other) {
54            (Value::String(s), Value::String(o)) => s == o,
55            (
56                Value::Number {
57                    value: self_value, ..
58                },
59                Value::Number {
60                    value: other_value, ..
61                },
62            ) => self_value == other_value,
63            _ => false,
64        }
65    }
66}
67
68impl<'a> From<String> for Value<'a> {
69    fn from(value: String) -> Self {
70        Self::String(value.into())
71    }
72}
73
74impl<'a> From<&'a String> for Value<'a> {
75    fn from(value: &'a String) -> Self {
76        Self::String(value.into())
77    }
78}
79
80impl<'a> From<&'a str> for Value<'a> {
81    fn from(value: &'a str) -> Self {
82        Self::String(value.into())
83    }
84}
85
86impl<'a> From<Cow<'a, str>> for Value<'a> {
87    fn from(value: Cow<'a, str>) -> Self {
88        Self::String(value)
89    }
90}
91
92impl<'a, T> From<Option<T>> for Value<'a>
93where
94    T: Into<Value<'a>>,
95{
96    fn from(value: Option<T>) -> Self {
97        match value {
98            Some(v) => v.into(),
99            None => Self::Empty,
100        }
101    }
102}