Skip to main content

floria_plugin_sdk/data/math/number/
conversions.rs

1use super::{
2    super::super::super::{dispatch_bindings::*, utils::*, *},
3    number::*,
4};
5
6use {num_traits::*, std::str::*};
7
8impl From<i64> for Number {
9    fn from(integer: i64) -> Self {
10        Self::Integer(integer)
11    }
12}
13
14impl From<u64> for Number {
15    fn from(unsigned_integer: u64) -> Self {
16        Self::UnsignedInteger(unsigned_integer)
17    }
18}
19
20impl From<f64> for Number {
21    fn from(float: f64) -> Self {
22        Self::Float(float)
23    }
24}
25
26impl FromStr for Number {
27    type Err = DispatchError;
28
29    fn from_str(representation: &str) -> Result<Self, Self::Err> {
30        if let Ok(unsigned_integer) = representation.parse() {
31            return Ok(Self::UnsignedInteger(unsigned_integer));
32        }
33
34        if let Ok(integer) = representation.parse() {
35            return Ok(Self::Integer(integer));
36        }
37
38        if let Ok(float) = representation.parse() {
39            return Ok(Self::Float(float));
40        }
41
42        Err(format!("not a number: |error|{:?}|", escape_depiction_markup(representation)).into())
43    }
44}
45
46impl TryFrom<&Expression> for Number {
47    type Error = DispatchError;
48
49    fn try_from(expression: &Expression) -> Result<Self, Self::Error> {
50        match expression {
51            Expression::Integer(integer) => Ok(Self::Integer(*integer)),
52            Expression::UnsignedInteger(unsigned_integer) => Ok(Self::UnsignedInteger(*unsigned_integer)),
53            Expression::Float(float) => Ok(Self::Float(*float)),
54
55            _ => Err(format!(
56                "not an |name|integer|, |name|unsigned integer|, or |name|float|: |error|{}|",
57                expression.type_name()
58            )),
59        }
60    }
61}
62
63impl TryFrom<Expression> for Number {
64    type Error = DispatchError;
65
66    fn try_from(expression: Expression) -> Result<Self, Self::Error> {
67        (&expression).try_into()
68    }
69}
70
71impl TryInto<i64> for Number {
72    type Error = DispatchError;
73
74    fn try_into(self) -> Result<i64, Self::Error> {
75        match self {
76            Self::Integer(integer) => Ok(integer),
77
78            Self::UnsignedInteger(unsigned_integer) => match cast(unsigned_integer) {
79                Some(integer) => Ok(integer),
80                None => Err(format!("won't fit in integer: |error|{}|", unsigned_integer)),
81            },
82
83            Self::Float(float) => match cast(float) {
84                Some(integer) => Ok(integer),
85                None => Err(format!("won't fit in integer: |error|{}|", float)),
86            },
87        }
88    }
89}
90
91impl TryInto<u64> for Number {
92    type Error = DispatchError;
93
94    fn try_into(self) -> Result<u64, Self::Error> {
95        match self {
96            Self::Integer(integer) => match cast(integer) {
97                Some(unsigned_integer) => Ok(unsigned_integer),
98                None => Err(format!("won't fit in unsigned integer: |error|{}|", integer)),
99            },
100
101            Self::UnsignedInteger(unsigned_integer) => Ok(unsigned_integer),
102
103            Self::Float(float) => match cast(float) {
104                Some(unsigned_integer) => Ok(unsigned_integer),
105                None => Err(format!("won't fit in unsigned integer: |error|{}|", float)),
106            },
107        }
108    }
109}
110
111impl TryInto<f64> for Number {
112    type Error = DispatchError;
113
114    fn try_into(self) -> Result<f64, Self::Error> {
115        match self {
116            Self::Integer(integer) => match cast(integer) {
117                Some(float) => Ok(float),
118                None => Err(format!("won't fit in float: |error|{}|", integer)),
119            },
120
121            Self::UnsignedInteger(unsigned_integer) => match cast(unsigned_integer) {
122                Some(float) => Ok(float),
123                None => Err(format!("won't fit in float: |error|{}|", unsigned_integer)),
124            },
125
126            Self::Float(float) => Ok(float),
127        }
128    }
129}
130
131impl Into<Expression> for Number {
132    fn into(self) -> Expression {
133        match self {
134            Self::Integer(integer) => integer.into(),
135            Self::UnsignedInteger(unsigned_integer) => unsigned_integer.into(),
136            Self::Float(float) => float.into(),
137        }
138    }
139}