Skip to main content

kcl_lib/execution/
kcl_value_view.rs

1use std::collections::HashMap;
2
3use serde::Serialize;
4
5use crate::ModuleId;
6use crate::exec::KclValue;
7use crate::execution::AbstractSegment;
8use crate::execution::BoundedEdge;
9use crate::execution::Face;
10use crate::execution::GdtAnnotation;
11use crate::execution::Helix;
12use crate::execution::ImportedGeometry;
13use crate::execution::Plane;
14use crate::execution::Sketch;
15use crate::execution::SketchConstraint;
16use crate::execution::SketchVar;
17use crate::execution::Solid;
18use crate::execution::TagIdentifier;
19use crate::execution::types::NumericType;
20use crate::parsing::ast::types::KclNone;
21use crate::parsing::ast::types::TagDeclarator;
22
23pub type KclObjectFields = HashMap<String, KclValueView>;
24
25/// Any KCL value.
26#[derive(Debug, Clone, Serialize, PartialEq, ts_rs::TS)]
27#[ts(export)]
28#[serde(tag = "type")]
29pub enum KclValueView {
30    Uuid {
31        value: ::uuid::Uuid,
32    },
33    Bool {
34        value: bool,
35    },
36    Number {
37        value: f64,
38        ty: NumericType,
39    },
40    String {
41        value: String,
42    },
43    SketchVar {
44        value: Box<SketchVar>,
45    },
46    SketchConstraint {
47        value: Box<SketchConstraint>,
48    },
49    Tuple {
50        value: Vec<KclValueView>,
51    },
52    // An array where all values have a shared type (not necessarily the same principal type).
53    HomArray {
54        value: Vec<KclValueView>,
55    },
56    Object {
57        value: KclObjectFields,
58        constrainable: bool,
59        #[serde(default, skip_serializing_if = "super::kcl_value::KclObjectKind::is_default")]
60        #[ts(skip)]
61        object_kind: super::kcl_value::KclObjectKind,
62    },
63    TagIdentifier(Box<TagIdentifier>),
64    TagDeclarator(crate::parsing::ast::types::BoxNode<TagDeclarator>),
65    GdtAnnotation {
66        value: Box<GdtAnnotation>,
67    },
68    Plane {
69        value: Box<Plane>,
70    },
71    Face {
72        value: Box<Face>,
73    },
74    BoundedEdge {
75        value: BoundedEdge,
76    },
77    Segment {
78        value: Box<AbstractSegment>,
79    },
80    Sketch {
81        value: Box<Sketch>,
82    },
83    Solid {
84        value: Box<Solid>,
85    },
86    Helix {
87        value: Box<Helix>,
88    },
89    ImportedGeometry(ImportedGeometry),
90    Function {},
91    Module {
92        value: ModuleId,
93    },
94    #[ts(skip)]
95    Type {
96        experimental: bool,
97    },
98    KclNone {
99        value: KclNone,
100    },
101}
102
103impl From<KclValue> for KclValueView {
104    fn from(full: KclValue) -> Self {
105        match full {
106            KclValue::Uuid { value, .. } => KclValueView::Uuid { value },
107            KclValue::Bool { value, .. } => KclValueView::Bool { value },
108            KclValue::Number { value, ty, .. } => KclValueView::Number { value, ty },
109            KclValue::String { value, .. } => KclValueView::String { value },
110            KclValue::SketchVar { value } => KclValueView::SketchVar { value },
111            KclValue::SketchConstraint { value } => KclValueView::SketchConstraint { value },
112            KclValue::Tuple { value, .. } => KclValueView::Tuple {
113                value: value.into_iter().map(KclValueView::from).collect(),
114            },
115            KclValue::HomArray { value, .. } => KclValueView::HomArray {
116                value: value.into_iter().map(KclValueView::from).collect(),
117            },
118            KclValue::Object {
119                value,
120                constrainable,
121                object_kind,
122                ..
123            } => KclValueView::Object {
124                value: value.into_iter().map(|(k, v)| (k, KclValueView::from(v))).collect(),
125                constrainable,
126                object_kind,
127            },
128            KclValue::TagIdentifier(tag_identifier) => KclValueView::TagIdentifier(tag_identifier),
129            KclValue::TagDeclarator(node) => KclValueView::TagDeclarator(node),
130            KclValue::GdtAnnotation { value } => KclValueView::GdtAnnotation { value },
131            KclValue::Plane { value } => KclValueView::Plane { value },
132            KclValue::Face { value } => KclValueView::Face { value },
133            KclValue::BoundedEdge { value, .. } => KclValueView::BoundedEdge { value },
134            KclValue::Segment { value } => KclValueView::Segment { value },
135            KclValue::Sketch { value } => KclValueView::Sketch { value },
136            KclValue::Solid { value } => KclValueView::Solid { value },
137            KclValue::Helix { value } => KclValueView::Helix { value },
138            KclValue::ImportedGeometry(imported_geometry) => KclValueView::ImportedGeometry(imported_geometry),
139            KclValue::Function { .. } => KclValueView::Function {},
140            KclValue::Module { value, .. } => KclValueView::Module { value },
141            KclValue::Type { experimental, .. } => KclValueView::Type { experimental },
142            KclValue::KclNone { value, .. } => KclValueView::KclNone { value },
143        }
144    }
145}