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