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