xcell_types/decimal/
parse_cell.rs

1use super::*;
2use std::str::FromStr;
3
4impl DecimalDescription {
5    pub fn parse_cell(&self, cell: &DataType) -> XResult<XCellValue> {
6        match self.kind {
7            DecimalKind::Float32 => self.parse_f32(cell),
8            DecimalKind::Float64 => self.parse_f64(cell),
9            DecimalKind::Decimal128 => self.parse_d128(cell),
10        }
11    }
12    fn parse_value(&self, cell: &DataType) -> XResult<BigDecimal> {
13        match cell {
14            DataType::Int(i) => Ok(self.clamp(*i)),
15            DataType::Float(f) => match BigDecimal::from_f64(*f) {
16                Some(o) => Ok(o),
17                None => syntax_error(format!("DataType::Float {} 无法解析为 decimal 类型", f)),
18            },
19            DataType::String(s) if s.trim().is_empty() => Ok(self.default.clone()),
20            DataType::String(s) => match BigDecimal::from_str(s) {
21                Ok(o) => Ok(o),
22                Err(_) => syntax_error(format!("DataType::String {} 无法解析为 decimal 类型", s)),
23            },
24            DataType::Empty => Ok(self.default.clone()),
25            _ => syntax_error(format!("{} 无法解析为 decimal 类型", cell)),
26        }
27    }
28    fn parse_f32(&self, cell: &DataType) -> XResult<XCellValue> {
29        let dec = self.parse_value(cell)?;
30        match dec.to_f32() {
31            Some(s) => Ok(XCellValue::Float32(s)),
32            None => syntax_error(format!("{dec} 无法转化为 f32 类型")),
33        }
34    }
35    fn parse_f64(&self, cell: &DataType) -> XResult<XCellValue> {
36        let dec = self.parse_value(cell)?;
37        match dec.to_f64() {
38            Some(s) => Ok(XCellValue::Float64(s)),
39            None => syntax_error(format!("{dec} 无法转化为 f64 类型")),
40        }
41    }
42    fn parse_d128(&self, cell: &DataType) -> XResult<XCellValue> {
43        let dec = self.parse_value(cell)?;
44        match dec.to_f64() {
45            Some(s) => Ok(XCellValue::Float64(s)),
46            None => syntax_error(format!("{dec} 无法转化为 d128 类型")),
47        }
48    }
49}