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 pub kind: XCellValue,
27 pub x: usize,
29 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 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}