xcell_types/integer/
parse_cell.rs

1use super::*;
2
3impl From<IntegerDescription> for XCellTyped {
4    fn from(desc: IntegerDescription) -> Self {
5        XCellTyped::Integer(Box::new(desc))
6    }
7}
8
9impl IntegerDescription {
10    pub fn parse_cell(&self, cell: &DataType) -> XResult<XCellValue> {
11        match self.kind {
12            IntegerKind::Integer8 => self.parse_i8(cell),
13            IntegerKind::Integer16 => self.parse_i16(cell),
14            IntegerKind::Integer32 => self.parse_i32(cell),
15            IntegerKind::Integer64 => self.parse_i64(cell),
16            IntegerKind::Unsigned8 => self.parse_u8(cell),
17            IntegerKind::Unsigned16 => self.parse_u16(cell),
18            IntegerKind::Unsigned32 => self.parse_u32(cell),
19            IntegerKind::Unsigned64 => self.parse_u64(cell),
20        }
21    }
22    pub fn parse_value(&self, cell: &DataType) -> XResult<BigInt> {
23        match cell {
24            DataType::Int(i) => Ok(self.clamp(*i)),
25            DataType::Float(f) => match BigInt::from_f64(*f) {
26                Some(o) => Ok(o),
27                None => syntax_error(format!("{} 无法解析为 int 类型", f)),
28            },
29            DataType::String(s) => match BigInt::from_str(s) {
30                Ok(o) => Ok(o),
31                Err(_) => syntax_error(format!("{} 无法解析为 int 类型", s)),
32            },
33            DataType::Empty => Ok(self.default.clone()),
34            _ => syntax_error(format!("{} 无法解析为 int 类型", cell.to_string())),
35        }
36    }
37
38    fn parse_i8(&self, cell: &DataType) -> XResult<XCellValue> {
39        let int = self.parse_value(cell)?;
40        match int.to_i8() {
41            Some(s) => Ok(XCellValue::Integer8(s)),
42            None => syntax_error(format!("{int} 无法转化为 i8 类型")),
43        }
44    }
45    fn parse_i16(&self, cell: &DataType) -> XResult<XCellValue> {
46        let int = self.parse_value(cell)?;
47        match int.to_i16() {
48            Some(s) => Ok(XCellValue::Integer16(s)),
49            None => syntax_error(format!("{int} 无法转化为 i16 类型")),
50        }
51    }
52    fn parse_i32(&self, cell: &DataType) -> XResult<XCellValue> {
53        let int = self.parse_value(cell)?;
54        match int.to_i32() {
55            Some(s) => Ok(XCellValue::Integer32(s)),
56            None => syntax_error(format!("{int} 无法转化为 i32 类型")),
57        }
58    }
59    fn parse_i64(&self, cell: &DataType) -> XResult<XCellValue> {
60        let int = self.parse_value(cell)?;
61        match int.to_i64() {
62            Some(s) => Ok(XCellValue::Integer64(s)),
63            None => syntax_error(format!("{int} 无法转化为 i64 类型")),
64        }
65    }
66    fn parse_u8(&self, cell: &DataType) -> XResult<XCellValue> {
67        let int = self.parse_value(cell)?;
68        match int.to_u8() {
69            Some(s) => Ok(XCellValue::Unsigned8(s)),
70            None => syntax_error(format!("{int} 无法转化为 u8 类型")),
71        }
72    }
73    fn parse_u16(&self, cell: &DataType) -> XResult<XCellValue> {
74        let int = self.parse_value(cell)?;
75        match int.to_u16() {
76            Some(s) => Ok(XCellValue::Unsigned16(s)),
77            None => syntax_error(format!("{int} 无法转化为 u16 类型")),
78        }
79    }
80    fn parse_u32(&self, cell: &DataType) -> XResult<XCellValue> {
81        let int = self.parse_value(cell)?;
82        match int.to_u32() {
83            Some(s) => Ok(XCellValue::Unsigned32(s)),
84            None => syntax_error(format!("{int} 无法转化为 u32 类型")),
85        }
86    }
87    fn parse_u64(&self, cell: &DataType) -> XResult<XCellValue> {
88        let int = self.parse_value(cell)?;
89        match int.to_u64() {
90            Some(s) => Ok(XCellValue::Unsigned64(s)),
91            None => syntax_error(format!("{int} 无法转化为 u64 类型")),
92        }
93    }
94}