1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
use bigdecimal::BigDecimal;
use serde::{Deserialize, Serialize};

mod primitive;

#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct Number {
    pub hint: String,
    pub value: BigDecimal,
}

// impl FromStr for Number {
//     type Err = ParseBigDecimalError;
//
//     /// ```js
//     /// +1
//     /// -1
//     /// +1.0
//     /// -1.0m
//     /// +2**5   => 2 * 10^5
//     /// ```
//     fn from_str(s: &str) -> Result<Self, Self::Err> {
//         let (sign, rest) = match s.split_once(|c| c == '+' || c == '-') {
//             // `+1`,
//             Some(("+", rest)) => (Sign::NoSign, rest),
//             // `-1`
//             Some(("-", rest)) => (Sign::NoSign, rest),
//             _ => (Sign::NoSign, s),
//         };
//         match s.split_once("**") {
//             // `2**5   => 2*10^5`,
//             Some((lhs, rhs)) => {
//                 let lhs = match BigDecimal::from_str(lhs) {
//                     Ok(o) => {o}
//                     Err(_) => {
//                         ParseIntError::from()
//                     }
//                 };
//                 match rhs.split_once(|c| !c.is_ascii_digit()) {
//                     Some(_) => {}
//                     None => {}
//                 }
//                 let exp = u32::from_str()?;
//
//
//                 10.pow()
//             }
//             _ => match rest.split_once(|c| !c.is_ascii_digit()) {
//                 None => {}
//                 Some(_) => {}
//             },
//         };
//
//         let value = BigDecimal::from_str_radix(s, 10)?;
//         Ok(Number { hint: "".to_string(), value })
//     }
// }