diff --git a/crates/owlry-plugin-converter/src/currency.rs b/crates/owlry-plugin-converter/src/currency.rs index e93e614..1d74698 100644 --- a/crates/owlry-plugin-converter/src/currency.rs +++ b/crates/owlry-plugin-converter/src/currency.rs @@ -23,21 +23,66 @@ struct CurrencyAlias { } static CURRENCY_ALIASES: &[CurrencyAlias] = &[ - CurrencyAlias { code: "EUR", aliases: &["eur", "euro", "euros", "€"] }, - CurrencyAlias { code: "USD", aliases: &["usd", "dollar", "dollars", "$", "us_dollar"] }, - CurrencyAlias { code: "GBP", aliases: &["gbp", "pound_sterling", "£", "british_pound", "pounds"] }, - CurrencyAlias { code: "JPY", aliases: &["jpy", "yen", "¥", "japanese_yen"] }, - CurrencyAlias { code: "CHF", aliases: &["chf", "swiss_franc", "francs"] }, - CurrencyAlias { code: "CAD", aliases: &["cad", "canadian_dollar", "c$"] }, - CurrencyAlias { code: "AUD", aliases: &["aud", "australian_dollar", "a$"] }, - CurrencyAlias { code: "CNY", aliases: &["cny", "yuan", "renminbi", "rmb"] }, - CurrencyAlias { code: "SEK", aliases: &["sek", "swedish_krona", "kronor"] }, - CurrencyAlias { code: "NOK", aliases: &["nok", "norwegian_krone"] }, - CurrencyAlias { code: "DKK", aliases: &["dkk", "danish_krone"] }, - CurrencyAlias { code: "PLN", aliases: &["pln", "zloty", "złoty"] }, - CurrencyAlias { code: "CZK", aliases: &["czk", "czech_koruna"] }, - CurrencyAlias { code: "HUF", aliases: &["huf", "forint"] }, - CurrencyAlias { code: "TRY", aliases: &["try", "turkish_lira", "lira"] }, + CurrencyAlias { + code: "EUR", + aliases: &["eur", "euro", "euros", "€"], + }, + CurrencyAlias { + code: "USD", + aliases: &["usd", "dollar", "dollars", "$", "us_dollar"], + }, + CurrencyAlias { + code: "GBP", + aliases: &["gbp", "pound_sterling", "£", "british_pound", "pounds"], + }, + CurrencyAlias { + code: "JPY", + aliases: &["jpy", "yen", "¥", "japanese_yen"], + }, + CurrencyAlias { + code: "CHF", + aliases: &["chf", "swiss_franc", "francs"], + }, + CurrencyAlias { + code: "CAD", + aliases: &["cad", "canadian_dollar", "c$"], + }, + CurrencyAlias { + code: "AUD", + aliases: &["aud", "australian_dollar", "a$"], + }, + CurrencyAlias { + code: "CNY", + aliases: &["cny", "yuan", "renminbi", "rmb"], + }, + CurrencyAlias { + code: "SEK", + aliases: &["sek", "swedish_krona", "kronor"], + }, + CurrencyAlias { + code: "NOK", + aliases: &["nok", "norwegian_krone"], + }, + CurrencyAlias { + code: "DKK", + aliases: &["dkk", "danish_krone"], + }, + CurrencyAlias { + code: "PLN", + aliases: &["pln", "zloty", "złoty"], + }, + CurrencyAlias { + code: "CZK", + aliases: &["czk", "czech_koruna"], + }, + CurrencyAlias { + code: "HUF", + aliases: &["huf", "forint"], + }, + CurrencyAlias { + code: "TRY", + aliases: &["try", "turkish_lira", "lira"], + }, ]; pub fn resolve_currency_code(alias: &str) -> Option { @@ -58,16 +103,17 @@ pub fn resolve_currency_code(alias: &str) -> Option { return Some(upper); } // Check if we have rates for it - if let Some(rates) = get_rates() { - if rates.rates.contains_key(&upper) { - return Some(upper); - } + if let Some(rates) = get_rates() + && rates.rates.contains_key(&upper) + { + return Some(upper); } } None } +#[allow(dead_code)] pub fn is_currency_alias(alias: &str) -> bool { resolve_currency_code(alias).is_some() } @@ -82,12 +128,12 @@ pub fn get_rates() -> Option { } // Try disk cache - if let Some(rates) = load_cache() { - if !is_stale(&rates) { - let mut cache = CACHED_RATES.lock().ok()?; - *cache = Some(rates.clone()); - return Some(rates); - } + if let Some(rates) = load_cache() + && !is_stale(&rates) + { + let mut cache = CACHED_RATES.lock().ok()?; + *cache = Some(rates.clone()); + return Some(rates); } // Fetch fresh rates @@ -157,12 +203,12 @@ fn parse_ecb_xml(xml: &str) -> Option { let trimmed = line.trim(); // Extract date: - if trimmed.contains("time=") { - if let Some(start) = trimmed.find("time='") { - let rest = &trimmed[start + 6..]; - if let Some(end) = rest.find('\'') { - date = rest[..end].to_string(); - } + if trimmed.contains("time=") + && let Some(start) = trimmed.find("time='") + { + let rest = &trimmed[start + 6..]; + if let Some(end) = rest.find('\'') { + date = rest[..end].to_string(); } } diff --git a/crates/owlry-plugin-converter/src/lib.rs b/crates/owlry-plugin-converter/src/lib.rs index 7e11b85..139e40a 100644 --- a/crates/owlry-plugin-converter/src/lib.rs +++ b/crates/owlry-plugin-converter/src/lib.rs @@ -154,3 +154,85 @@ fn format_with_separators(n: i64) -> String { } result.chars().rev().collect() } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_format_number_integer() { + assert_eq!(format_number(42.0), "42"); + } + + #[test] + fn test_format_number_large_integer() { + assert_eq!(format_number(1000000.0), "1,000,000"); + } + + #[test] + fn test_format_number_decimal() { + assert_eq!(format_number(3.14), "3.14"); + } + + #[test] + fn test_format_with_separators() { + assert_eq!(format_with_separators(1234567), "1,234,567"); + assert_eq!(format_with_separators(999), "999"); + assert_eq!(format_with_separators(-1234), "-1,234"); + } + + #[test] + fn test_provider_query_with_prefix() { + let result = provider_query( + ProviderHandle { + ptr: std::ptr::null_mut(), + }, + RStr::from("> 100 km to mi"), + ); + assert!(!result.is_empty()); + } + + #[test] + fn test_provider_query_auto_detect() { + let result = provider_query( + ProviderHandle { + ptr: std::ptr::null_mut(), + }, + RStr::from("100 km to mi"), + ); + assert!(!result.is_empty()); + } + + #[test] + fn test_provider_query_no_target() { + let result = provider_query( + ProviderHandle { + ptr: std::ptr::null_mut(), + }, + RStr::from("> 100 km"), + ); + assert!(result.len() > 1); + } + + #[test] + fn test_provider_query_nonsense() { + let result = provider_query( + ProviderHandle { + ptr: std::ptr::null_mut(), + }, + RStr::from("hello world"), + ); + assert!(result.is_empty()); + } + + #[test] + fn test_provider_query_temperature() { + let result = provider_query( + ProviderHandle { + ptr: std::ptr::null_mut(), + }, + RStr::from("102F to C"), + ); + assert!(!result.is_empty()); + } +} diff --git a/crates/owlry-plugin-converter/src/units.rs b/crates/owlry-plugin-converter/src/units.rs index c8509e1..dd0dedd 100644 --- a/crates/owlry-plugin-converter/src/units.rs +++ b/crates/owlry-plugin-converter/src/units.rs @@ -28,8 +28,8 @@ enum Conversion { } #[derive(Clone)] -struct UnitDef { - id: &'static str, +pub(crate) struct UnitDef { + _id: &'static str, symbol: &'static str, aliases: &'static [&'static str], category: Category, @@ -44,7 +44,7 @@ impl UnitDef { } } - fn from_base(&self, value: f64) -> f64 { + fn convert_from_base(&self, value: f64) -> f64 { match &self.conversion { Conversion::Factor(f) => value / f, Conversion::Custom { from_base, .. } => from_base(value), @@ -120,7 +120,7 @@ pub fn convert_to(value: &f64, from: &str, to: &str) -> Option } let base_value = from_def.to_base(*value); - let result = to_def.from_base(base_value); + let result = to_def.convert_from_base(base_value); Some(format_result(result, to_def.symbol)) } @@ -150,7 +150,7 @@ pub fn convert_common(value: &f64, from: &str) -> Vec { .filter(|&&sym| sym != from_symbol) .filter_map(|&sym| { let (_, to_def) = lookup_unit(sym)?; - let result = to_def.from_base(base_value); + let result = to_def.convert_from_base(base_value); Some(format_result(result, to_def.symbol)) }) .take(5) @@ -253,7 +253,8 @@ fn build_unit_table() -> Vec { vec![ // Temperature (base: Kelvin) UnitDef { - id: "celsius", symbol: "°C", + _id: "celsius", + symbol: "°C", aliases: &["c", "°c", "celsius", "degc", "centigrade"], category: Category::Temperature, conversion: Conversion::Custom { @@ -262,7 +263,8 @@ fn build_unit_table() -> Vec { }, }, UnitDef { - id: "fahrenheit", symbol: "°F", + _id: "fahrenheit", + symbol: "°F", aliases: &["f", "°f", "fahrenheit", "degf"], category: Category::Temperature, conversion: Conversion::Custom { @@ -271,99 +273,511 @@ fn build_unit_table() -> Vec { }, }, UnitDef { - id: "kelvin", symbol: "K", + _id: "kelvin", + symbol: "K", aliases: &["k", "kelvin"], category: Category::Temperature, conversion: Conversion::Factor(1.0), // base }, - // Length (base: meter) - UnitDef { id: "millimeter", symbol: "mm", aliases: &["mm", "millimeter", "millimeters", "millimetre"], category: Category::Length, conversion: Conversion::Factor(0.001) }, - UnitDef { id: "centimeter", symbol: "cm", aliases: &["cm", "centimeter", "centimeters", "centimetre"], category: Category::Length, conversion: Conversion::Factor(0.01) }, - UnitDef { id: "meter", symbol: "m", aliases: &["m", "meter", "meters", "metre", "metres"], category: Category::Length, conversion: Conversion::Factor(1.0) }, - UnitDef { id: "kilometer", symbol: "km", aliases: &["km", "kms", "kilometer", "kilometers", "kilometre"], category: Category::Length, conversion: Conversion::Factor(1000.0) }, - UnitDef { id: "inch", symbol: "in", aliases: &["in", "inch", "inches"], category: Category::Length, conversion: Conversion::Factor(0.0254) }, - UnitDef { id: "foot", symbol: "ft", aliases: &["ft", "foot", "feet"], category: Category::Length, conversion: Conversion::Factor(0.3048) }, - UnitDef { id: "yard", symbol: "yd", aliases: &["yd", "yard", "yards"], category: Category::Length, conversion: Conversion::Factor(0.9144) }, - UnitDef { id: "mile", symbol: "mi", aliases: &["mi", "mile", "miles"], category: Category::Length, conversion: Conversion::Factor(1609.344) }, - UnitDef { id: "nautical_mile", symbol: "nmi", aliases: &["nmi", "nautical_mile", "nautical_miles"], category: Category::Length, conversion: Conversion::Factor(1852.0) }, - + UnitDef { + _id: "millimeter", + symbol: "mm", + aliases: &["mm", "millimeter", "millimeters", "millimetre"], + category: Category::Length, + conversion: Conversion::Factor(0.001), + }, + UnitDef { + _id: "centimeter", + symbol: "cm", + aliases: &["cm", "centimeter", "centimeters", "centimetre"], + category: Category::Length, + conversion: Conversion::Factor(0.01), + }, + UnitDef { + _id: "meter", + symbol: "m", + aliases: &["m", "meter", "meters", "metre", "metres"], + category: Category::Length, + conversion: Conversion::Factor(1.0), + }, + UnitDef { + _id: "kilometer", + symbol: "km", + aliases: &["km", "kms", "kilometer", "kilometers", "kilometre"], + category: Category::Length, + conversion: Conversion::Factor(1000.0), + }, + UnitDef { + _id: "inch", + symbol: "in", + aliases: &["in", "inch", "inches"], + category: Category::Length, + conversion: Conversion::Factor(0.0254), + }, + UnitDef { + _id: "foot", + symbol: "ft", + aliases: &["ft", "foot", "feet"], + category: Category::Length, + conversion: Conversion::Factor(0.3048), + }, + UnitDef { + _id: "yard", + symbol: "yd", + aliases: &["yd", "yard", "yards"], + category: Category::Length, + conversion: Conversion::Factor(0.9144), + }, + UnitDef { + _id: "mile", + symbol: "mi", + aliases: &["mi", "mile", "miles"], + category: Category::Length, + conversion: Conversion::Factor(1609.344), + }, + UnitDef { + _id: "nautical_mile", + symbol: "nmi", + aliases: &["nmi", "nautical_mile", "nautical_miles"], + category: Category::Length, + conversion: Conversion::Factor(1852.0), + }, // Weight (base: kg) - UnitDef { id: "milligram", symbol: "mg", aliases: &["mg", "milligram", "milligrams"], category: Category::Weight, conversion: Conversion::Factor(0.000001) }, - UnitDef { id: "gram", symbol: "g", aliases: &["g", "gram", "grams"], category: Category::Weight, conversion: Conversion::Factor(0.001) }, - UnitDef { id: "kilogram", symbol: "kg", aliases: &["kg", "kilogram", "kilograms", "kilo", "kilos"], category: Category::Weight, conversion: Conversion::Factor(1.0) }, - UnitDef { id: "tonne", symbol: "t", aliases: &["t", "ton", "tons", "tonne", "tonnes", "metric_ton"], category: Category::Weight, conversion: Conversion::Factor(1000.0) }, - UnitDef { id: "short_ton", symbol: "short_ton", aliases: &["short_ton", "ton_us"], category: Category::Weight, conversion: Conversion::Factor(907.185) }, - UnitDef { id: "ounce", symbol: "oz", aliases: &["oz", "ounce", "ounces"], category: Category::Weight, conversion: Conversion::Factor(0.0283495) }, - UnitDef { id: "pound", symbol: "lb", aliases: &["lb", "lbs", "pound", "pounds"], category: Category::Weight, conversion: Conversion::Factor(0.453592) }, - UnitDef { id: "stone", symbol: "st", aliases: &["st", "stone", "stones"], category: Category::Weight, conversion: Conversion::Factor(6.35029) }, - + UnitDef { + _id: "milligram", + symbol: "mg", + aliases: &["mg", "milligram", "milligrams"], + category: Category::Weight, + conversion: Conversion::Factor(0.000001), + }, + UnitDef { + _id: "gram", + symbol: "g", + aliases: &["g", "gram", "grams"], + category: Category::Weight, + conversion: Conversion::Factor(0.001), + }, + UnitDef { + _id: "kilogram", + symbol: "kg", + aliases: &["kg", "kilogram", "kilograms", "kilo", "kilos"], + category: Category::Weight, + conversion: Conversion::Factor(1.0), + }, + UnitDef { + _id: "tonne", + symbol: "t", + aliases: &["t", "ton", "tons", "tonne", "tonnes", "metric_ton"], + category: Category::Weight, + conversion: Conversion::Factor(1000.0), + }, + UnitDef { + _id: "short_ton", + symbol: "short_ton", + aliases: &["short_ton", "ton_us"], + category: Category::Weight, + conversion: Conversion::Factor(907.185), + }, + UnitDef { + _id: "ounce", + symbol: "oz", + aliases: &["oz", "ounce", "ounces"], + category: Category::Weight, + conversion: Conversion::Factor(0.0283495), + }, + UnitDef { + _id: "pound", + symbol: "lb", + aliases: &["lb", "lbs", "pound", "pounds"], + category: Category::Weight, + conversion: Conversion::Factor(0.453592), + }, + UnitDef { + _id: "stone", + symbol: "st", + aliases: &["st", "stone", "stones"], + category: Category::Weight, + conversion: Conversion::Factor(6.35029), + }, // Volume (base: liter) - UnitDef { id: "milliliter", symbol: "ml", aliases: &["ml", "milliliter", "milliliters", "millilitre"], category: Category::Volume, conversion: Conversion::Factor(0.001) }, - UnitDef { id: "liter", symbol: "l", aliases: &["l", "liter", "liters", "litre", "litres"], category: Category::Volume, conversion: Conversion::Factor(1.0) }, - UnitDef { id: "us_gallon", symbol: "gal", aliases: &["gal", "gallon", "gallons"], category: Category::Volume, conversion: Conversion::Factor(3.78541) }, - UnitDef { id: "imp_gallon", symbol: "imp gal", aliases: &["imp_gal", "gal_uk", "imperial_gallon"], category: Category::Volume, conversion: Conversion::Factor(4.54609) }, - UnitDef { id: "quart", symbol: "qt", aliases: &["qt", "quart", "quarts"], category: Category::Volume, conversion: Conversion::Factor(0.946353) }, - UnitDef { id: "pint", symbol: "pt", aliases: &["pt", "pint", "pints"], category: Category::Volume, conversion: Conversion::Factor(0.473176) }, - UnitDef { id: "cup", symbol: "cup", aliases: &["cup", "cups"], category: Category::Volume, conversion: Conversion::Factor(0.236588) }, - UnitDef { id: "fluid_ounce", symbol: "fl oz", aliases: &["floz", "fl_oz", "fluid_ounce", "fluid_ounces"], category: Category::Volume, conversion: Conversion::Factor(0.0295735) }, - UnitDef { id: "tablespoon", symbol: "tbsp", aliases: &["tbsp", "tablespoon", "tablespoons"], category: Category::Volume, conversion: Conversion::Factor(0.0147868) }, - UnitDef { id: "teaspoon", symbol: "tsp", aliases: &["tsp", "teaspoon", "teaspoons"], category: Category::Volume, conversion: Conversion::Factor(0.00492892) }, - + UnitDef { + _id: "milliliter", + symbol: "ml", + aliases: &["ml", "milliliter", "milliliters", "millilitre"], + category: Category::Volume, + conversion: Conversion::Factor(0.001), + }, + UnitDef { + _id: "liter", + symbol: "l", + aliases: &["l", "liter", "liters", "litre", "litres"], + category: Category::Volume, + conversion: Conversion::Factor(1.0), + }, + UnitDef { + _id: "us_gallon", + symbol: "gal", + aliases: &["gal", "gallon", "gallons"], + category: Category::Volume, + conversion: Conversion::Factor(3.78541), + }, + UnitDef { + _id: "imp_gallon", + symbol: "imp gal", + aliases: &["imp_gal", "gal_uk", "imperial_gallon"], + category: Category::Volume, + conversion: Conversion::Factor(4.54609), + }, + UnitDef { + _id: "quart", + symbol: "qt", + aliases: &["qt", "quart", "quarts"], + category: Category::Volume, + conversion: Conversion::Factor(0.946353), + }, + UnitDef { + _id: "pint", + symbol: "pt", + aliases: &["pt", "pint", "pints"], + category: Category::Volume, + conversion: Conversion::Factor(0.473176), + }, + UnitDef { + _id: "cup", + symbol: "cup", + aliases: &["cup", "cups"], + category: Category::Volume, + conversion: Conversion::Factor(0.236588), + }, + UnitDef { + _id: "fluid_ounce", + symbol: "fl oz", + aliases: &["floz", "fl_oz", "fluid_ounce", "fluid_ounces"], + category: Category::Volume, + conversion: Conversion::Factor(0.0295735), + }, + UnitDef { + _id: "tablespoon", + symbol: "tbsp", + aliases: &["tbsp", "tablespoon", "tablespoons"], + category: Category::Volume, + conversion: Conversion::Factor(0.0147868), + }, + UnitDef { + _id: "teaspoon", + symbol: "tsp", + aliases: &["tsp", "teaspoon", "teaspoons"], + category: Category::Volume, + conversion: Conversion::Factor(0.00492892), + }, // Speed (base: m/s) - UnitDef { id: "mps", symbol: "m/s", aliases: &["m/s", "mps", "meters_per_second"], category: Category::Speed, conversion: Conversion::Factor(1.0) }, - UnitDef { id: "kmh", symbol: "km/h", aliases: &["km/h", "kmh", "kph", "kilometers_per_hour"], category: Category::Speed, conversion: Conversion::Factor(0.277778) }, - UnitDef { id: "mph", symbol: "mph", aliases: &["mph", "miles_per_hour"], category: Category::Speed, conversion: Conversion::Factor(0.44704) }, - UnitDef { id: "knot", symbol: "kn", aliases: &["kn", "kt", "knot", "knots"], category: Category::Speed, conversion: Conversion::Factor(0.514444) }, - UnitDef { id: "fps", symbol: "ft/s", aliases: &["ft/s", "fps", "feet_per_second"], category: Category::Speed, conversion: Conversion::Factor(0.3048) }, - + UnitDef { + _id: "mps", + symbol: "m/s", + aliases: &["m/s", "mps", "meters_per_second"], + category: Category::Speed, + conversion: Conversion::Factor(1.0), + }, + UnitDef { + _id: "kmh", + symbol: "km/h", + aliases: &["km/h", "kmh", "kph", "kilometers_per_hour"], + category: Category::Speed, + conversion: Conversion::Factor(0.277778), + }, + UnitDef { + _id: "mph", + symbol: "mph", + aliases: &["mph", "miles_per_hour"], + category: Category::Speed, + conversion: Conversion::Factor(0.44704), + }, + UnitDef { + _id: "knot", + symbol: "kn", + aliases: &["kn", "kt", "knot", "knots"], + category: Category::Speed, + conversion: Conversion::Factor(0.514444), + }, + UnitDef { + _id: "fps", + symbol: "ft/s", + aliases: &["ft/s", "fps", "feet_per_second"], + category: Category::Speed, + conversion: Conversion::Factor(0.3048), + }, // Area (base: m²) - UnitDef { id: "sqmm", symbol: "mm²", aliases: &["mm2", "sqmm", "square_millimeter"], category: Category::Area, conversion: Conversion::Factor(0.000001) }, - UnitDef { id: "sqcm", symbol: "cm²", aliases: &["cm2", "sqcm", "square_centimeter"], category: Category::Area, conversion: Conversion::Factor(0.0001) }, - UnitDef { id: "sqm", symbol: "m²", aliases: &["m2", "sqm", "square_meter", "square_meters"], category: Category::Area, conversion: Conversion::Factor(1.0) }, - UnitDef { id: "sqkm", symbol: "km²", aliases: &["km2", "sqkm", "square_kilometer"], category: Category::Area, conversion: Conversion::Factor(1000000.0) }, - UnitDef { id: "sqft", symbol: "ft²", aliases: &["ft2", "sqft", "square_foot", "square_feet"], category: Category::Area, conversion: Conversion::Factor(0.092903) }, - UnitDef { id: "acre", symbol: "ac", aliases: &["ac", "acre", "acres"], category: Category::Area, conversion: Conversion::Factor(4046.86) }, - UnitDef { id: "hectare", symbol: "ha", aliases: &["ha", "hectare", "hectares"], category: Category::Area, conversion: Conversion::Factor(10000.0) }, - + UnitDef { + _id: "sqmm", + symbol: "mm²", + aliases: &["mm2", "sqmm", "square_millimeter"], + category: Category::Area, + conversion: Conversion::Factor(0.000001), + }, + UnitDef { + _id: "sqcm", + symbol: "cm²", + aliases: &["cm2", "sqcm", "square_centimeter"], + category: Category::Area, + conversion: Conversion::Factor(0.0001), + }, + UnitDef { + _id: "sqm", + symbol: "m²", + aliases: &["m2", "sqm", "square_meter", "square_meters"], + category: Category::Area, + conversion: Conversion::Factor(1.0), + }, + UnitDef { + _id: "sqkm", + symbol: "km²", + aliases: &["km2", "sqkm", "square_kilometer"], + category: Category::Area, + conversion: Conversion::Factor(1000000.0), + }, + UnitDef { + _id: "sqft", + symbol: "ft²", + aliases: &["ft2", "sqft", "square_foot", "square_feet"], + category: Category::Area, + conversion: Conversion::Factor(0.092903), + }, + UnitDef { + _id: "acre", + symbol: "ac", + aliases: &["ac", "acre", "acres"], + category: Category::Area, + conversion: Conversion::Factor(4046.86), + }, + UnitDef { + _id: "hectare", + symbol: "ha", + aliases: &["ha", "hectare", "hectares"], + category: Category::Area, + conversion: Conversion::Factor(10000.0), + }, // Data (base: byte) - UnitDef { id: "byte", symbol: "B", aliases: &["b", "byte", "bytes"], category: Category::Data, conversion: Conversion::Factor(1.0) }, - UnitDef { id: "kilobyte", symbol: "KB", aliases: &["kb", "kilobyte", "kilobytes"], category: Category::Data, conversion: Conversion::Factor(1000.0) }, - UnitDef { id: "megabyte", symbol: "MB", aliases: &["mb", "megabyte", "megabytes"], category: Category::Data, conversion: Conversion::Factor(1_000_000.0) }, - UnitDef { id: "gigabyte", symbol: "GB", aliases: &["gb", "gigabyte", "gigabytes"], category: Category::Data, conversion: Conversion::Factor(1_000_000_000.0) }, - UnitDef { id: "terabyte", symbol: "TB", aliases: &["tb", "terabyte", "terabytes"], category: Category::Data, conversion: Conversion::Factor(1_000_000_000_000.0) }, - UnitDef { id: "kibibyte", symbol: "KiB", aliases: &["kib", "kibibyte", "kibibytes"], category: Category::Data, conversion: Conversion::Factor(1024.0) }, - UnitDef { id: "mebibyte", symbol: "MiB", aliases: &["mib", "mebibyte", "mebibytes"], category: Category::Data, conversion: Conversion::Factor(1_048_576.0) }, - UnitDef { id: "gibibyte", symbol: "GiB", aliases: &["gib", "gibibyte", "gibibytes"], category: Category::Data, conversion: Conversion::Factor(1_073_741_824.0) }, - UnitDef { id: "tebibyte", symbol: "TiB", aliases: &["tib", "tebibyte", "tebibytes"], category: Category::Data, conversion: Conversion::Factor(1_099_511_627_776.0) }, - + UnitDef { + _id: "byte", + symbol: "B", + aliases: &["b", "byte", "bytes"], + category: Category::Data, + conversion: Conversion::Factor(1.0), + }, + UnitDef { + _id: "kilobyte", + symbol: "KB", + aliases: &["kb", "kilobyte", "kilobytes"], + category: Category::Data, + conversion: Conversion::Factor(1000.0), + }, + UnitDef { + _id: "megabyte", + symbol: "MB", + aliases: &["mb", "megabyte", "megabytes"], + category: Category::Data, + conversion: Conversion::Factor(1_000_000.0), + }, + UnitDef { + _id: "gigabyte", + symbol: "GB", + aliases: &["gb", "gigabyte", "gigabytes"], + category: Category::Data, + conversion: Conversion::Factor(1_000_000_000.0), + }, + UnitDef { + _id: "terabyte", + symbol: "TB", + aliases: &["tb", "terabyte", "terabytes"], + category: Category::Data, + conversion: Conversion::Factor(1_000_000_000_000.0), + }, + UnitDef { + _id: "kibibyte", + symbol: "KiB", + aliases: &["kib", "kibibyte", "kibibytes"], + category: Category::Data, + conversion: Conversion::Factor(1024.0), + }, + UnitDef { + _id: "mebibyte", + symbol: "MiB", + aliases: &["mib", "mebibyte", "mebibytes"], + category: Category::Data, + conversion: Conversion::Factor(1_048_576.0), + }, + UnitDef { + _id: "gibibyte", + symbol: "GiB", + aliases: &["gib", "gibibyte", "gibibytes"], + category: Category::Data, + conversion: Conversion::Factor(1_073_741_824.0), + }, + UnitDef { + _id: "tebibyte", + symbol: "TiB", + aliases: &["tib", "tebibyte", "tebibytes"], + category: Category::Data, + conversion: Conversion::Factor(1_099_511_627_776.0), + }, // Time (base: second) - UnitDef { id: "second", symbol: "s", aliases: &["s", "sec", "second", "seconds"], category: Category::Time, conversion: Conversion::Factor(1.0) }, - UnitDef { id: "minute", symbol: "min", aliases: &["min", "minute", "minutes"], category: Category::Time, conversion: Conversion::Factor(60.0) }, - UnitDef { id: "hour", symbol: "h", aliases: &["h", "hr", "hour", "hours"], category: Category::Time, conversion: Conversion::Factor(3600.0) }, - UnitDef { id: "day", symbol: "d", aliases: &["d", "day", "days"], category: Category::Time, conversion: Conversion::Factor(86400.0) }, - UnitDef { id: "week", symbol: "wk", aliases: &["wk", "week", "weeks"], category: Category::Time, conversion: Conversion::Factor(604800.0) }, - UnitDef { id: "month", symbol: "mo", aliases: &["mo", "month", "months"], category: Category::Time, conversion: Conversion::Factor(2_592_000.0) }, - UnitDef { id: "year", symbol: "yr", aliases: &["yr", "year", "years"], category: Category::Time, conversion: Conversion::Factor(31_536_000.0) }, - + UnitDef { + _id: "second", + symbol: "s", + aliases: &["s", "sec", "second", "seconds"], + category: Category::Time, + conversion: Conversion::Factor(1.0), + }, + UnitDef { + _id: "minute", + symbol: "min", + aliases: &["min", "minute", "minutes"], + category: Category::Time, + conversion: Conversion::Factor(60.0), + }, + UnitDef { + _id: "hour", + symbol: "h", + aliases: &["h", "hr", "hour", "hours"], + category: Category::Time, + conversion: Conversion::Factor(3600.0), + }, + UnitDef { + _id: "day", + symbol: "d", + aliases: &["d", "day", "days"], + category: Category::Time, + conversion: Conversion::Factor(86400.0), + }, + UnitDef { + _id: "week", + symbol: "wk", + aliases: &["wk", "week", "weeks"], + category: Category::Time, + conversion: Conversion::Factor(604800.0), + }, + UnitDef { + _id: "month", + symbol: "mo", + aliases: &["mo", "month", "months"], + category: Category::Time, + conversion: Conversion::Factor(2_592_000.0), + }, + UnitDef { + _id: "year", + symbol: "yr", + aliases: &["yr", "year", "years"], + category: Category::Time, + conversion: Conversion::Factor(31_536_000.0), + }, // Pressure (base: Pa) - UnitDef { id: "pascal", symbol: "Pa", aliases: &["pa", "pascal", "pascals"], category: Category::Pressure, conversion: Conversion::Factor(1.0) }, - UnitDef { id: "hectopascal", symbol: "hPa", aliases: &["hpa", "hectopascal"], category: Category::Pressure, conversion: Conversion::Factor(100.0) }, - UnitDef { id: "kilopascal", symbol: "kPa", aliases: &["kpa", "kilopascal"], category: Category::Pressure, conversion: Conversion::Factor(1000.0) }, - UnitDef { id: "bar", symbol: "bar", aliases: &["bar", "bars"], category: Category::Pressure, conversion: Conversion::Factor(100_000.0) }, - UnitDef { id: "millibar", symbol: "mbar", aliases: &["mbar", "millibar"], category: Category::Pressure, conversion: Conversion::Factor(100.0) }, - UnitDef { id: "psi", symbol: "psi", aliases: &["psi", "pounds_per_square_inch"], category: Category::Pressure, conversion: Conversion::Factor(6894.76) }, - UnitDef { id: "atmosphere", symbol: "atm", aliases: &["atm", "atmosphere", "atmospheres"], category: Category::Pressure, conversion: Conversion::Factor(101_325.0) }, - UnitDef { id: "mmhg", symbol: "mmHg", aliases: &["mmhg", "torr"], category: Category::Pressure, conversion: Conversion::Factor(133.322) }, - + UnitDef { + _id: "pascal", + symbol: "Pa", + aliases: &["pa", "pascal", "pascals"], + category: Category::Pressure, + conversion: Conversion::Factor(1.0), + }, + UnitDef { + _id: "hectopascal", + symbol: "hPa", + aliases: &["hpa", "hectopascal"], + category: Category::Pressure, + conversion: Conversion::Factor(100.0), + }, + UnitDef { + _id: "kilopascal", + symbol: "kPa", + aliases: &["kpa", "kilopascal"], + category: Category::Pressure, + conversion: Conversion::Factor(1000.0), + }, + UnitDef { + _id: "bar", + symbol: "bar", + aliases: &["bar", "bars"], + category: Category::Pressure, + conversion: Conversion::Factor(100_000.0), + }, + UnitDef { + _id: "millibar", + symbol: "mbar", + aliases: &["mbar", "millibar"], + category: Category::Pressure, + conversion: Conversion::Factor(100.0), + }, + UnitDef { + _id: "psi", + symbol: "psi", + aliases: &["psi", "pounds_per_square_inch"], + category: Category::Pressure, + conversion: Conversion::Factor(6894.76), + }, + UnitDef { + _id: "atmosphere", + symbol: "atm", + aliases: &["atm", "atmosphere", "atmospheres"], + category: Category::Pressure, + conversion: Conversion::Factor(101_325.0), + }, + UnitDef { + _id: "mmhg", + symbol: "mmHg", + aliases: &["mmhg", "torr"], + category: Category::Pressure, + conversion: Conversion::Factor(133.322), + }, // Energy (base: Joule) - UnitDef { id: "joule", symbol: "J", aliases: &["j", "joule", "joules"], category: Category::Energy, conversion: Conversion::Factor(1.0) }, - UnitDef { id: "kilojoule", symbol: "kJ", aliases: &["kj", "kilojoule", "kilojoules"], category: Category::Energy, conversion: Conversion::Factor(1000.0) }, - UnitDef { id: "calorie", symbol: "cal", aliases: &["cal", "calorie", "calories"], category: Category::Energy, conversion: Conversion::Factor(4.184) }, - UnitDef { id: "kilocalorie", symbol: "kcal", aliases: &["kcal", "kilocalorie", "kilocalories"], category: Category::Energy, conversion: Conversion::Factor(4184.0) }, - UnitDef { id: "watt_hour", symbol: "Wh", aliases: &["wh", "watt_hour"], category: Category::Energy, conversion: Conversion::Factor(3600.0) }, - UnitDef { id: "kilowatt_hour", symbol: "kWh", aliases: &["kwh", "kilowatt_hour"], category: Category::Energy, conversion: Conversion::Factor(3_600_000.0) }, - UnitDef { id: "btu", symbol: "BTU", aliases: &["btu", "british_thermal_unit"], category: Category::Energy, conversion: Conversion::Factor(1055.06) }, + UnitDef { + _id: "joule", + symbol: "J", + aliases: &["j", "joule", "joules"], + category: Category::Energy, + conversion: Conversion::Factor(1.0), + }, + UnitDef { + _id: "kilojoule", + symbol: "kJ", + aliases: &["kj", "kilojoule", "kilojoules"], + category: Category::Energy, + conversion: Conversion::Factor(1000.0), + }, + UnitDef { + _id: "calorie", + symbol: "cal", + aliases: &["cal", "calorie", "calories"], + category: Category::Energy, + conversion: Conversion::Factor(4.184), + }, + UnitDef { + _id: "kilocalorie", + symbol: "kcal", + aliases: &["kcal", "kilocalorie", "kilocalories"], + category: Category::Energy, + conversion: Conversion::Factor(4184.0), + }, + UnitDef { + _id: "watt_hour", + symbol: "Wh", + aliases: &["wh", "watt_hour"], + category: Category::Energy, + conversion: Conversion::Factor(3600.0), + }, + UnitDef { + _id: "kilowatt_hour", + symbol: "kWh", + aliases: &["kwh", "kilowatt_hour"], + category: Category::Energy, + conversion: Conversion::Factor(3_600_000.0), + }, + UnitDef { + _id: "btu", + symbol: "BTU", + aliases: &["btu", "british_thermal_unit"], + category: Category::Energy, + conversion: Conversion::Factor(1055.06), + }, ] }