use std::env;
use std::process::ExitCode;
use vle_units::{DimensionVector, UnitRegistry};
fn run() -> Result<(), Box<dyn std::error::Error>> {
let mut reg = UnitRegistry::with_vle_defaults();
reg.define_dimension("length", DimensionVector::new([1, 0, 0, 0, 0, 0, 0]))?;
for (name, meters_per_unit) in [
("m", 1.0),
("meter", 1.0),
("mm", 1.0e-3),
("cm", 1.0e-2),
("km", 1.0e3),
("in", 0.0254),
("inch", 0.0254),
("ft", 0.3048), ("foot", 0.3048),
("yd", 0.9144), ("yard", 0.9144),
("mi", 1609.344), ("mile", 1609.344),
("nmi", 1852.0), ] {
reg.define_with_dimension(name, "length", meters_per_unit, 0.0)?;
}
let args: Vec<String> = env::args().skip(1).collect();
if args.len() != 2 {
eprintln!(r#"usage: length_convert "<value> <from-unit>" <to-unit>"#);
eprintln!(r#"example: length_convert "1 mile" m"#);
return Err("expected exactly 2 arguments".into());
}
let q = reg.parse(&args[0])?;
let value_in_target = reg.from_canonical(q.canonical, &args[1])?;
println!("{} = {} {}", args[0], value_in_target, args[1]);
Ok(())
}
fn main() -> ExitCode {
match run() {
Ok(()) => ExitCode::SUCCESS,
Err(e) => {
eprintln!("error: {e}");
ExitCode::FAILURE
}
}
}