From 055ab32a99840ecb8d21a1e236ea5976107b8984 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juhani=20Krekel=C3=A4?= Date: Mon, 29 May 2023 03:27:55 +0300 Subject: [PATCH] Add support for square miles --- src/conversions.rs | 6 ++++++ src/lib.rs | 2 ++ src/parse.rs | 8 ++++++++ src/units.rs | 1 + 4 files changed, 17 insertions(+) diff --git a/src/conversions.rs b/src/conversions.rs index 4f3362d..71b7d32 100644 --- a/src/conversions.rs +++ b/src/conversions.rs @@ -80,6 +80,11 @@ fn get_conversion(unit: NonMetric) -> Conversion { from: inch_from * inch_from, to: MetricQuantity { amount: 43_560.0 * 12.0 * inch_to * 12.0 * inch_to, unit: Metric::SquareMetre }, }, + NonMetric::SquareMile => Conversion { + offset: 0.0, + from: inch_from * inch_from, + to: MetricQuantity { amount: 1760.0 * 3.0 * 12.0 * inch_to * 1760.0 * 3.0 * 12.0 * inch_to, unit: Metric::SquareMetre }, + }, } } @@ -134,6 +139,7 @@ mod test { Test(NonMetric::SquareInch, 0.00064516), Test(NonMetric::SquareFoot, 0.09290304), Test(NonMetric::Acre, 4046.8564224), + Test(NonMetric::SquareMile, 2589988.110336), ]; run_tests(&tests, Metric::SquareMetre); } diff --git a/src/lib.rs b/src/lib.rs index fc977bc..c428c80 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -76,6 +76,7 @@ fn unit_to_name(unit: NonMetric) -> &'static str { NonMetric::SquareInch => "square inches", NonMetric::SquareFoot => "square feet", NonMetric::Acre => "acres", + NonMetric::SquareMile => "square miles", } } @@ -112,5 +113,6 @@ mod test { assert_eq!(run("1 in²"), Ok("6.452 cm²".to_string())); assert_eq!(run("1 ft²"), Ok("929 cm²".to_string())); assert_eq!(run("1 acre"), Ok("4 047 m²".to_string())); + assert_eq!(run("1 mi²"), Ok("2.59 km²".to_string())); } } diff --git a/src/parse.rs b/src/parse.rs index 95e038d..ac07a1f 100644 --- a/src/parse.rs +++ b/src/parse.rs @@ -114,6 +114,10 @@ fn parse_unit(input: String) -> Result { "acres" => Ok(NonMetric::Acre), "ac" => Ok(NonMetric::Acre), + "mile²" => Ok(NonMetric::SquareMile), + "miles²" => Ok(NonMetric::SquareMile), + "mi²" => Ok(NonMetric::SquareMile), + _ => Err(ParseError::UnknownUnit(input)), } } @@ -275,6 +279,10 @@ mod test { assert_eq!(parse_unit("acres".to_string()), Ok(NonMetric::Acre)); assert_eq!(parse_unit("ac".to_string()), Ok(NonMetric::Acre)); + assert_eq!(parse_unit("mile²".to_string()), Ok(NonMetric::SquareMile)); + assert_eq!(parse_unit("miles²".to_string()), Ok(NonMetric::SquareMile)); + assert_eq!(parse_unit("mi²".to_string()), Ok(NonMetric::SquareMile)); + // 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 6123c8e..03c573b 100644 --- a/src/units.rs +++ b/src/units.rs @@ -23,6 +23,7 @@ pub enum NonMetric { SquareInch, SquareFoot, Acre, + SquareMile, } #[derive(Clone, Copy, Debug, PartialEq)]