use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "lowercase")]
pub enum Unit {
Micron,
#[default]
Millimeter,
Centimeter,
Inch,
Foot,
Meter,
}
impl Unit {
pub fn scale_factor(&self) -> f64 {
match self {
Unit::Micron => 1e-6,
Unit::Millimeter => 0.001,
Unit::Centimeter => 0.01,
Unit::Inch => 0.0254,
Unit::Foot => 0.3048,
Unit::Meter => 1.0,
}
}
pub fn convert(&self, value: f64, target: Unit) -> f64 {
if *self == target {
return value;
}
let meters = value * self.scale_factor();
meters / target.scale_factor()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_scale_factors() {
assert!((Unit::Millimeter.scale_factor() - 0.001).abs() < 1e-10);
assert!((Unit::Inch.scale_factor() - 0.0254).abs() < 1e-10);
}
#[test]
fn test_conversion() {
let val = Unit::Inch.convert(1.0, Unit::Millimeter);
assert!((val - 25.4).abs() < 1e-5);
let val = Unit::Millimeter.convert(1000.0, Unit::Meter);
assert!((val - 1.0).abs() < 1e-5);
}
}