kittycad_modeling_cmds/
units.rs

1use kittycad_unit_conversion_derive::UnitConversion;
2use parse_display_derive::{Display, FromStr};
3use schemars::JsonSchema;
4use serde::{Deserialize, Serialize};
5
6/// The valid types of length units.
7#[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    /// Centimeters <https://en.wikipedia.org/wiki/Centimeter>
31    #[serde(rename = "cm")]
32    #[display("cm")]
33    Centimeters,
34    /// Feet <https://en.wikipedia.org/wiki/Foot_(unit)>
35    #[serde(rename = "ft")]
36    #[display("ft")]
37    Feet,
38    /// Inches <https://en.wikipedia.org/wiki/Inch>
39    #[serde(rename = "in")]
40    #[display("in")]
41    Inches,
42    /// Meters <https://en.wikipedia.org/wiki/Meter>
43    #[default]
44    #[serde(rename = "m")]
45    #[display("m")]
46    Meters,
47    /// Millimeters <https://en.wikipedia.org/wiki/Millimeter>
48    #[serde(rename = "mm")]
49    #[display("mm")]
50    Millimeters,
51    /// Yards <https://en.wikipedia.org/wiki/Yard>
52    #[serde(rename = "yd")]
53    #[display("yd")]
54    Yards,
55}
56
57impl UnitLength {
58    /// Convert to measurement.
59    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/// The valid types of angle formats.
72#[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    /// Degrees <https://en.wikipedia.org/wiki/Degree_(angle)>
97    #[default]
98    #[display("deg")]
99    Degrees,
100    /// Radians <https://en.wikipedia.org/wiki/Radian>
101    #[display("rad")]
102    Radians,
103}
104
105/// The valid types of area units.
106#[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    /// Square centimeters <https://en.wikipedia.org/wiki/Square_centimeter>
131    #[serde(rename = "cm2")]
132    #[display("cm2")]
133    SquareCentimeters,
134    /// Square decimeters <https://en.wikipedia.org/wiki/Square_decimeter>
135    #[serde(rename = "dm2")]
136    #[display("dm2")]
137    SquareDecimeters,
138    /// Square feet <https://en.wikipedia.org/wiki/Square_foot>
139    #[serde(rename = "ft2")]
140    #[display("ft2")]
141    SquareFeet,
142    /// Square inches <https://en.wikipedia.org/wiki/Square_inch>
143    #[serde(rename = "in2")]
144    #[display("in2")]
145    SquareInches,
146    /// Square kilometers <https://en.wikipedia.org/wiki/Square_kilometer>
147    #[serde(rename = "km2")]
148    #[display("km2")]
149    SquareKilometers,
150    /// Square meters <https://en.wikipedia.org/wiki/Square_meter>
151    #[default]
152    #[serde(rename = "m2")]
153    #[display("m2")]
154    SquareMeters,
155    /// Square millimeters <https://en.wikipedia.org/wiki/Square_millimeter>
156    #[serde(rename = "mm2")]
157    #[display("mm2")]
158    SquareMillimeters,
159    /// Square yards <https://en.wikipedia.org/wiki/Square_mile>
160    #[serde(rename = "yd2")]
161    #[display("yd2")]
162    SquareYards,
163}
164
165impl UnitArea {
166    /// Convert to measurement.
167    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/// The valid types for density units.
182#[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    /// Pounds per cubic feet.
206    #[serde(rename = "lb:ft3")]
207    #[display("lb:ft3")]
208    PoundsPerCubicFeet,
209
210    /// Kilograms per cubic meter.
211    #[default]
212    #[serde(rename = "kg:m3")]
213    #[display("kg:m3")]
214    KilogramsPerCubicMeter,
215}
216
217impl UnitDensity {
218    /// Convert to measurement.
219    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/// The valid types of mass units.
228#[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    /// Grams <https://en.wikipedia.org/wiki/Gram>
253    #[default]
254    #[serde(rename = "g")]
255    #[display("g")]
256    Grams,
257    /// Kilograms <https://en.wikipedia.org/wiki/Kilogram>
258    #[serde(rename = "kg")]
259    #[display("kg")]
260    Kilograms,
261    /// Pounds <https://en.wikipedia.org/wiki/Pound_(mass)>
262    #[serde(rename = "lb")]
263    #[display("lb")]
264    Pounds,
265}
266
267impl UnitMass {
268    /// Convert to measurement.
269    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/// The valid types of volume units.
279#[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    /// Cubic centimeters (cc or cm³) <https://en.wikipedia.org/wiki/Cubic_centimeter>
303    #[serde(rename = "cm3")]
304    #[display("cm3")]
305    CubicCentimeters,
306    /// Cubic feet (ft³) <https://en.wikipedia.org/wiki/Cubic_foot>
307    #[serde(rename = "ft3")]
308    #[display("ft3")]
309    CubicFeet,
310    /// Cubic inches (cu in or in³) <https://en.wikipedia.org/wiki/Cubic_inch>
311    #[serde(rename = "in3")]
312    #[display("in3")]
313    CubicInches,
314    /// Cubic meters (m³) <https://en.wikipedia.org/wiki/Cubic_meter>
315    #[default]
316    #[serde(rename = "m3")]
317    #[display("m3")]
318    CubicMeters,
319    /// Cubic yards (yd³) <https://en.wikipedia.org/wiki/Cubic_yard>
320    #[serde(rename = "yd3")]
321    #[display("yd3")]
322    CubicYards,
323    /// US Fluid Ounces (fl oz) <https://en.wikipedia.org/wiki/Fluid_ounce>
324    #[serde(rename = "usfloz")]
325    #[display("usfloz")]
326    FluidOunces,
327    /// US Gallons (gal US) <https://en.wikipedia.org/wiki/Gallon>
328    #[serde(rename = "usgal")]
329    #[display("usgal")]
330    Gallons,
331    /// Liters (l) <https://en.wikipedia.org/wiki/Litre>
332    #[serde(rename = "l")]
333    #[display("l")]
334    Liters,
335    /// Milliliters (ml) <https://en.wikipedia.org/wiki/Litre>
336    #[serde(rename = "ml")]
337    #[display("ml")]
338    Milliliters,
339}
340
341impl UnitVolume {
342    /// Convert to measurement.
343    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}