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