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