1use kittycad_unit_conversion_derive::UnitConversion;
2use parse_display_derive::{Display, FromStr};
3use schemars::JsonSchema;
4use serde::{Deserialize, Serialize};
5
6#[derive(
8 Default,
9 Display,
10 FromStr,
11 Copy,
12 Eq,
13 PartialEq,
14 Debug,
15 JsonSchema,
16 Deserialize,
17 Serialize,
18 Clone,
19 Ord,
20 PartialOrd,
21 UnitConversion,
22 Hash,
23)]
24#[cfg_attr(feature = "tabled", derive(tabled::Tabled))]
25#[display(style = "snake_case")]
26#[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
27#[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
28#[cfg_attr(feature = "python", pyo3::pyclass, pyo3_stub_gen::derive::gen_stub_pyclass_enum)]
29pub enum UnitLength {
30 #[serde(rename = "cm")]
32 #[display("cm")]
33 Centimeters,
34 #[serde(rename = "ft")]
36 #[display("ft")]
37 Feet,
38 #[serde(rename = "in")]
40 #[display("in")]
41 Inches,
42 #[default]
44 #[serde(rename = "m")]
45 #[display("m")]
46 Meters,
47 #[serde(rename = "mm")]
49 #[display("mm")]
50 Millimeters,
51 #[serde(rename = "yd")]
53 #[display("yd")]
54 Yards,
55}
56
57impl UnitLength {
58 pub fn as_measurement(self, value: f64) -> measurements::Length {
60 match self {
61 Self::Centimeters => measurements::Length::from_centimeters(value),
62 Self::Feet => measurements::Length::from_feet(value),
63 Self::Inches => measurements::Length::from_inches(value),
64 Self::Meters => measurements::Length::from_meters(value),
65 Self::Millimeters => measurements::Length::from_millimeters(value),
66 Self::Yards => measurements::Length::from_yards(value),
67 }
68 }
69}
70
71#[derive(
73 Default,
74 Display,
75 FromStr,
76 Copy,
77 Eq,
78 PartialEq,
79 Debug,
80 JsonSchema,
81 Deserialize,
82 Serialize,
83 Clone,
84 Ord,
85 PartialOrd,
86 UnitConversion,
87 Hash,
88)]
89#[cfg_attr(feature = "tabled", derive(tabled::Tabled))]
90#[serde(rename_all = "snake_case")]
91#[display(style = "snake_case")]
92#[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
93#[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
94#[cfg_attr(feature = "python", pyo3::pyclass, pyo3_stub_gen::derive::gen_stub_pyclass_enum)]
95pub enum UnitAngle {
96 #[default]
98 #[display("deg")]
99 Degrees,
100 #[display("rad")]
102 Radians,
103}
104
105#[derive(
107 Display,
108 FromStr,
109 Copy,
110 Eq,
111 PartialEq,
112 Debug,
113 JsonSchema,
114 Deserialize,
115 Serialize,
116 Clone,
117 Ord,
118 PartialOrd,
119 UnitConversion,
120 Default,
121 Hash,
122)]
123#[cfg_attr(feature = "tabled", derive(tabled::Tabled))]
124#[serde(rename_all = "snake_case")]
125#[display(style = "snake_case")]
126#[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
127#[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
128#[cfg_attr(feature = "python", pyo3::pyclass, pyo3_stub_gen::derive::gen_stub_pyclass_enum)]
129pub enum UnitArea {
130 #[serde(rename = "cm2")]
132 #[display("cm2")]
133 SquareCentimeters,
134 #[serde(rename = "dm2")]
136 #[display("dm2")]
137 SquareDecimeters,
138 #[serde(rename = "ft2")]
140 #[display("ft2")]
141 SquareFeet,
142 #[serde(rename = "in2")]
144 #[display("in2")]
145 SquareInches,
146 #[serde(rename = "km2")]
148 #[display("km2")]
149 SquareKilometers,
150 #[default]
152 #[serde(rename = "m2")]
153 #[display("m2")]
154 SquareMeters,
155 #[serde(rename = "mm2")]
157 #[display("mm2")]
158 SquareMillimeters,
159 #[serde(rename = "yd2")]
161 #[display("yd2")]
162 SquareYards,
163}
164
165impl UnitArea {
166 pub fn as_measurement(self, value: f64) -> measurements::Area {
168 match self {
169 Self::SquareCentimeters => measurements::Area::from_square_centimeters(value),
170 Self::SquareDecimeters => measurements::Area::from_square_decimeters(value),
171 Self::SquareFeet => measurements::Area::from_square_feet(value),
172 Self::SquareInches => measurements::Area::from_square_inches(value),
173 Self::SquareKilometers => measurements::Area::from_square_kilometers(value),
174 Self::SquareMeters => measurements::Area::from_square_meters(value),
175 Self::SquareMillimeters => measurements::Area::from_square_millimeters(value),
176 Self::SquareYards => measurements::Area::from_square_yards(value),
177 }
178 }
179}
180
181#[derive(
183 Display,
184 FromStr,
185 Copy,
186 Eq,
187 PartialEq,
188 Debug,
189 JsonSchema,
190 Deserialize,
191 Serialize,
192 Clone,
193 Ord,
194 PartialOrd,
195 Default,
196 UnitConversion,
197 Hash,
198)]
199#[cfg_attr(feature = "tabled", derive(tabled::Tabled))]
200#[display(style = "snake_case")]
201#[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
202#[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
203#[cfg_attr(feature = "python", pyo3::pyclass, pyo3_stub_gen::derive::gen_stub_pyclass_enum)]
204pub enum UnitDensity {
205 #[serde(rename = "lb:ft3")]
207 #[display("lb:ft3")]
208 PoundsPerCubicFeet,
209
210 #[default]
212 #[serde(rename = "kg:m3")]
213 #[display("kg:m3")]
214 KilogramsPerCubicMeter,
215}
216
217impl UnitDensity {
218 pub fn as_measurement(self, value: f64) -> measurements::Density {
220 match self {
221 Self::PoundsPerCubicFeet => measurements::Density::from_pounds_per_cubic_feet(value),
222 Self::KilogramsPerCubicMeter => measurements::Density::from_kilograms_per_cubic_meter(value),
223 }
224 }
225}
226
227#[derive(
229 Default,
230 Display,
231 FromStr,
232 Copy,
233 Eq,
234 PartialEq,
235 Debug,
236 JsonSchema,
237 Deserialize,
238 Serialize,
239 Clone,
240 Ord,
241 PartialOrd,
242 UnitConversion,
243 Hash,
244)]
245#[cfg_attr(feature = "tabled", derive(tabled::Tabled))]
246#[serde(rename_all = "snake_case")]
247#[display(style = "snake_case")]
248#[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
249#[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
250#[cfg_attr(feature = "python", pyo3::pyclass, pyo3_stub_gen::derive::gen_stub_pyclass_enum)]
251pub enum UnitMass {
252 #[default]
254 #[serde(rename = "g")]
255 #[display("g")]
256 Grams,
257 #[serde(rename = "kg")]
259 #[display("kg")]
260 Kilograms,
261 #[serde(rename = "lb")]
263 #[display("lb")]
264 Pounds,
265}
266
267impl UnitMass {
268 pub fn as_measurement(self, value: f64) -> measurements::Mass {
270 match self {
271 Self::Grams => measurements::Mass::from_grams(value),
272 Self::Kilograms => measurements::Mass::from_kilograms(value),
273 Self::Pounds => measurements::Mass::from_pounds(value),
274 }
275 }
276}
277
278#[derive(
280 Default,
281 Display,
282 FromStr,
283 Copy,
284 Eq,
285 PartialEq,
286 Debug,
287 JsonSchema,
288 Deserialize,
289 Serialize,
290 Clone,
291 Ord,
292 PartialOrd,
293 UnitConversion,
294 Hash,
295)]
296#[cfg_attr(feature = "tabled", derive(tabled::Tabled))]
297#[display(style = "snake_case")]
298#[cfg_attr(feature = "ts-rs", derive(ts_rs::TS))]
299#[cfg_attr(feature = "ts-rs", ts(export_to = "ModelingCmd.ts"))]
300#[cfg_attr(feature = "python", pyo3::pyclass, pyo3_stub_gen::derive::gen_stub_pyclass_enum)]
301pub enum UnitVolume {
302 #[serde(rename = "cm3")]
304 #[display("cm3")]
305 CubicCentimeters,
306 #[serde(rename = "ft3")]
308 #[display("ft3")]
309 CubicFeet,
310 #[serde(rename = "in3")]
312 #[display("in3")]
313 CubicInches,
314 #[default]
316 #[serde(rename = "m3")]
317 #[display("m3")]
318 CubicMeters,
319 #[serde(rename = "yd3")]
321 #[display("yd3")]
322 CubicYards,
323 #[serde(rename = "usfloz")]
325 #[display("usfloz")]
326 FluidOunces,
327 #[serde(rename = "usgal")]
329 #[display("usgal")]
330 Gallons,
331 #[serde(rename = "l")]
333 #[display("l")]
334 Liters,
335 #[serde(rename = "ml")]
337 #[display("ml")]
338 Milliliters,
339}
340
341impl UnitVolume {
342 pub fn as_measurement(self, value: f64) -> measurements::Volume {
344 match self {
345 Self::CubicCentimeters => measurements::Volume::from_cubic_centimeters(value),
346 Self::CubicFeet => measurements::Volume::from_cubic_feet(value),
347 Self::CubicInches => measurements::Volume::from_cubic_inches(value),
348 Self::CubicMeters => measurements::Volume::from_cubic_meters(value),
349 Self::CubicYards => measurements::Volume::from_cubic_yards(value),
350 Self::FluidOunces => measurements::Volume::from_fluid_ounces(value),
351 Self::Gallons => measurements::Volume::from_gallons(value),
352 Self::Liters => measurements::Volume::from_liters(value),
353 Self::Milliliters => measurements::Volume::from_milliliters(value),
354 }
355 }
356}