floria_plugin_sdk/data/math/number/
conversions.rs1use 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}