xcell_types/array/
parse_cell.rs

1use super::*;
2
3impl From<ArrayDescription> for XCellTyped {
4    fn from(value: ArrayDescription) -> Self {
5        Self::Array(Box::new(value))
6    }
7}
8
9impl ArrayDescription {
10    pub fn parse_cell(&self, cell: &DataType) -> XResult<XCellValue> {
11        match self.kind {
12            ArrayKind::Vector2 => self.parse_vec2(cell),
13            ArrayKind::Vector3 => self.parse_vec3(cell),
14            ArrayKind::Vector4 => self.parse_vec4(cell),
15            ArrayKind::Color4 => self.parse_color4(cell),
16            ArrayKind::Quaternion4 => self.parse_quaternion4(cell),
17        }
18    }
19    fn parse_value(&self, cell: &DataType) -> XResult<Vec<f64>> {
20        match cell {
21            DataType::Int(i) => Ok(vec![*i as f64]),
22            DataType::Float(f) => Ok(vec![*f]),
23            DataType::String(s) => {
24                let mut out = vec![];
25                for item in s.split(',').map(|s| s.trim()) {
26                    if item.is_empty() {
27                        continue;
28                    }
29                    match f64::from_str(item) {
30                        Ok(o) => out.push(o),
31                        Err(_) => return syntax_error(format!("{:?} 无法解析为 decimal 类型", item)),
32                    }
33                }
34                Ok(out)
35            }
36            DataType::Empty => Ok(self.default.clone()),
37            _ => syntax_error(format!("{} 无法解析为 decimal 类型", cell)),
38        }
39    }
40    fn parse_vec2(&self, cell: &DataType) -> XResult<XCellValue> {
41        let vec = self.parse_value(cell)?;
42        Ok(XCellValue::Vector2(fill_array(&vec)))
43    }
44    fn parse_vec3(&self, cell: &DataType) -> XResult<XCellValue> {
45        let vec = self.parse_value(cell)?;
46        Ok(XCellValue::Vector3(fill_array(&vec)))
47    }
48    fn parse_vec4(&self, cell: &DataType) -> XResult<XCellValue> {
49        let vec = self.parse_value(cell)?;
50        Ok(XCellValue::Vector4(fill_array(&vec)))
51    }
52    fn parse_color4(&self, cell: &DataType) -> XResult<XCellValue> {
53        let vec = self.parse_value(cell)?;
54        Ok(XCellValue::Color4(fill_array(&vec)))
55    }
56    fn parse_quaternion4(&self, cell: &DataType) -> XResult<XCellValue> {
57        let vec = self.parse_value(cell)?;
58        Ok(XCellValue::Quaternion4(fill_array(&vec)))
59    }
60}
61
62fn fill_array<const N: usize>(vec: &[f64]) -> [f32; N] {
63    let mut out = [0.0; N];
64    for (i, v) in vec.iter().enumerate() {
65        if i >= N {
66            break;
67        }
68        out[i] = *v as f32;
69    }
70    out
71}