fluent_static_value/
lib.rs1use 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 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}