xcell_types/integer/
parse_cell.rs1use 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}