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#[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 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 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}