Disallow several temperatures in input

This commit is contained in:
Juhani Krekelä 2023-05-29 21:39:48 +03:00
parent 1a493a1716
commit 1842d480e1
1 changed files with 7 additions and 2 deletions

View File

@ -6,7 +6,7 @@ mod units;
use conversions::convert; use conversions::convert;
use format::format; use format::format;
use parse::{parse, ParseError}; use parse::{parse, ParseError};
use units::{MetricQuantity, NonMetric}; use units::{Metric, MetricQuantity, NonMetric};
pub fn run(input: &str) -> Result<String, String> { pub fn run(input: &str) -> Result<String, String> {
let non_metric = match parse(input) { let non_metric = match parse(input) {
@ -32,7 +32,8 @@ pub fn run(input: &str) -> Result<String, String> {
let metric: Vec<MetricQuantity> = non_metric.clone().into_iter().map(convert).collect(); let metric: Vec<MetricQuantity> = non_metric.clone().into_iter().map(convert).collect();
// Make sure the results of the conversions can be summed together // Make sure the results of the conversions can be summed together
// This is the case if the units after conversion are the same // This is the case if the units after conversion are the same and
// they are not temperature units (i.e. degrees Celsius)
let mut metric_unit = None; let mut metric_unit = None;
for index in 0..metric.len() { for index in 0..metric.len() {
match metric_unit { match metric_unit {
@ -48,6 +49,9 @@ pub fn run(input: &str) -> Result<String, String> {
} }
} }
} }
if metric.len() > 1 && metric_unit == Some(Metric::Celsius) {
return Err("Cannot sum together temperatures".to_string());
}
let amount = metric.into_iter().map(|quantity| { quantity.amount }).sum(); let amount = metric.into_iter().map(|quantity| { quantity.amount }).sum();
@ -92,6 +96,7 @@ mod test {
assert_eq!(run("1"), Err("Expected a unit".to_string())); assert_eq!(run("1"), Err("Expected a unit".to_string()));
assert_eq!(run(""), Err("Expected quantity or quantities to convert".to_string())); assert_eq!(run(""), Err("Expected quantity or quantities to convert".to_string()));
assert_eq!(run("6 ft 1 lbs"), Err("Incompatible units: feet, pounds".to_string())); assert_eq!(run("6 ft 1 lbs"), Err("Incompatible units: feet, pounds".to_string()));
assert_eq!(run("0 °F 0 °F"), Err("Cannot sum together temperatures".to_string()));
} }
#[test] #[test]