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