xcell_types/value/
mod.rs

1use std::{
2    fmt::{Display, Formatter},
3    str::FromStr,
4};
5
6use serde::{Deserialize, Serialize};
7
8use xcell_errors::{
9    for_3rd::{Color, DataType, DateTime, NaiveDateTime, TimeZone, Utc},
10    XResult,
11};
12
13use crate::{
14    utils::{syntax_error, type_mismatch},
15    XCellTyped,
16};
17
18pub mod color;
19pub mod convert;
20mod display;
21pub mod time;
22
23#[derive(Clone, Debug, Serialize, Deserialize)]
24pub struct XCellNode {
25    /// 实际储存的值
26    pub kind: XCellValue,
27    /// 从左往右数第几个, 0-index
28    pub x: usize,
29    /// 从上往下数第几个, 0-index
30    pub y: usize,
31}
32
33#[derive(Clone, Debug, Serialize, Deserialize)]
34pub enum XCellValue {
35    Boolean(bool),
36    Integer8(i8),
37    Integer16(i16),
38    Integer32(i32),
39    Integer64(i64),
40    Unsigned8(u8),
41    Unsigned16(u16),
42    Unsigned32(u32),
43    Unsigned64(u64),
44    Float32(f32),
45    Float64(f64),
46    Vector2([f32; 2]),
47    Vector3([f32; 3]),
48    Vector4([f32; 4]),
49    Color4([f32; 4]),
50    Quaternion4([f32; 4]),
51    String(String),
52    Color(Color),
53    // Time(DateTime),
54    Vector(Vec<XCellValue>),
55    Enumerate(String),
56}
57
58impl Default for XCellValue {
59    fn default() -> Self {
60        Self::Boolean(false)
61    }
62}
63
64impl XCellValue {
65    pub fn link_enumerate(&mut self, typing: &XCellTyped) -> XResult<()> {
66        let (value, map) = match (&self, typing) {
67            (XCellValue::Enumerate(v), XCellTyped::Enumerate(t)) => (v, t),
68            _ => return Ok(()),
69        };
70        let default = map.mapping.get(&map.default).cloned().unwrap_or_default();
71        let value = map.mapping.get(value).cloned();
72        match value {
73            Some(s) => {
74                *self = map.integer.cast_integer(s);
75            }
76            None => {
77                *self = map.integer.cast_integer(default);
78            }
79        }
80        Ok(())
81    }
82}