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