diff --git a/src/conversions.rs b/src/conversions.rs index 271c775..c02dde9 100644 --- a/src/conversions.rs +++ b/src/conversions.rs @@ -23,6 +23,9 @@ fn get_conversion(unit: NonMetric) -> Conversion { let imperial_gallon_from = 100_000.0; let imperial_gallon_to = 454609.0; + let us_gallon_from = inch_from * inch_from * inch_from; + let us_gallon_to = 231.0 * inch_to * inch_to * inch_to * 1000.0; + match unit { // Length NonMetric::Inch => Conversion { @@ -120,6 +123,11 @@ fn get_conversion(unit: NonMetric) -> Conversion { from: imperial_gallon_from, to: MetricQuantity { amount: imperial_gallon_to, unit: Metric::Litre }, }, + NonMetric::USGallon => Conversion { + offset: 0.0, + from: us_gallon_from, + to: MetricQuantity { amount: us_gallon_to, unit: Metric::Litre }, + }, } } @@ -195,6 +203,7 @@ mod test { Test(NonMetric::ImperialPint, 0.56826125), Test(NonMetric::ImperialQuart, 1.1365225), Test(NonMetric::ImperialGallon, 4.54609), + Test(NonMetric::USGallon, 3.785411784), ]; run_tests(&tests, Metric::Litre); } diff --git a/src/lib.rs b/src/lib.rs index 13d6972..d2e1d0a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -89,6 +89,7 @@ fn unit_to_name(unit: NonMetric) -> &'static str { NonMetric::ImperialPint => "imperial pints", NonMetric::ImperialQuart => "imperial quarts", NonMetric::ImperialGallon => "imperial gallons", + NonMetric::USGallon => "US gallons", } } @@ -135,5 +136,6 @@ mod test { assert_eq!(run("1 imp pt"), Ok("5.683 dl".to_string())); assert_eq!(run("1 imp qt"), Ok("1.137 l".to_string())); assert_eq!(run("1 imp gal"), Ok("4.546 l".to_string())); + assert_eq!(run("1 US gal"), Ok("3.785 l".to_string())); } } diff --git a/src/parse.rs b/src/parse.rs index 555ac41..e5fe566 100644 --- a/src/parse.rs +++ b/src/parse.rs @@ -204,6 +204,13 @@ fn parse_unit(input: String) -> Result { "imperial gallons" => Ok(NonMetric::ImperialGallon), "imp gal" => Ok(NonMetric::ImperialGallon), + "US gallon" => Ok(NonMetric::USGallon), + "US gallons" => Ok(NonMetric::USGallon), + "US gal" => Ok(NonMetric::USGallon), + "us gallon" => Ok(NonMetric::USGallon), + "us gallons" => Ok(NonMetric::USGallon), + "us gal" => Ok(NonMetric::USGallon), + _ => Err(ParseError::UnknownUnit(input)), } } @@ -457,6 +464,13 @@ mod test { assert_eq!(parse_unit("imperial gallons".to_string()), Ok(NonMetric::ImperialGallon)); assert_eq!(parse_unit("imp gal".to_string()), Ok(NonMetric::ImperialGallon)); + assert_eq!(parse_unit("US gallon".to_string()), Ok(NonMetric::USGallon)); + assert_eq!(parse_unit("US gallons".to_string()), Ok(NonMetric::USGallon)); + assert_eq!(parse_unit("US gal".to_string()), Ok(NonMetric::USGallon)); + assert_eq!(parse_unit("us gallon".to_string()), Ok(NonMetric::USGallon)); + assert_eq!(parse_unit("us gallons".to_string()), Ok(NonMetric::USGallon)); + assert_eq!(parse_unit("us gal".to_string()), Ok(NonMetric::USGallon)); + // Unknown unit assert_eq!(parse_unit("hutenosa".to_string()), Err(ParseError::UnknownUnit("hutenosa".to_string()))); } diff --git a/src/units.rs b/src/units.rs index 4a69fb5..92ce66c 100644 --- a/src/units.rs +++ b/src/units.rs @@ -34,6 +34,7 @@ pub enum NonMetric { ImperialPint, ImperialQuart, ImperialGallon, + USGallon, } #[derive(Clone, Copy, Debug, PartialEq)]