feat(converter): finalize integration and add integration tests

This commit is contained in:
2026-03-26 15:28:54 +01:00
parent b2156dc0b2
commit f3b9728f07
3 changed files with 660 additions and 118 deletions

View File

@@ -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<String> {
@@ -58,16 +103,17 @@ pub fn resolve_currency_code(alias: &str) -> Option<String> {
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<CurrencyRates> {
}
// 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<CurrencyRates> {
let trimmed = line.trim();
// Extract date: <Cube time='2026-03-26'>
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();
}
}

View File

@@ -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());
}
}

View File

@@ -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<ConversionResult>
}
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<ConversionResult> {
.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<UnitDef> {
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> {
},
},
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> {
},
},
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: "", 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: "",
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),
},
]
}