From 473645a11a993ef63d273521943f65f4e0b4dd7a Mon Sep 17 00:00:00 2001 From: lukaszKielar <kielar.lukasz@hotmail.com> Date: Wed, 1 Jul 2020 19:43:44 +0200 Subject: [PATCH] finish from_str exercise --- exercises/conversions/from_str.rs | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/exercises/conversions/from_str.rs b/exercises/conversions/from_str.rs index 014d054..f287f2f 100644 --- a/exercises/conversions/from_str.rs +++ b/exercises/conversions/from_str.rs @@ -10,7 +10,6 @@ struct Person { age: usize, } -// I AM NOT DONE // Steps: // 1. If the length of the provided string is 0, then return an error // 2. Split the given string on the commas present in it @@ -23,6 +22,29 @@ struct Person { impl FromStr for Person { type Err = String; fn from_str(s: &str) -> Result<Person, Self::Err> { + if s.len() == 0 { + return Err("Please provide non empty string".to_string()); + } + + let person_vec: Vec<&str> = s.split(",").collect(); + + if (person_vec[0].len() == 0) | (person_vec[1].len() == 0) { + return Err(format!( + "Missing name or age in the string: {:?}", + person_vec + )); + } + + let name: &str = person_vec[0]; + let age = match person_vec[1].parse::<usize>() { + Ok(age) => age, + Err(_) => return Err(format!("Cannot parse {:?} to usize", person_vec[1])), + }; + + Ok(Person { + name: name.to_string(), + age: age, + }) } } @@ -82,5 +104,4 @@ mod tests { fn missing_name_and_invalid_age() { ",one".parse::<Person>().unwrap(); } - }