Created
November 27, 2023 03:52
-
-
Save quanphm/7f7f4b7663328754c48a4fbe87663922 to your computer and use it in GitHub Desktop.
rustling_94
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #[derive(Debug)] | |
| struct Person { | |
| name: String, | |
| age: usize, | |
| } | |
| // We implement the Default trait to use it as a fallback | |
| // when the provided string is not convertible into a Person object | |
| impl Default for Person { | |
| fn default() -> Person { | |
| Person { | |
| name: String::from("John"), | |
| age: 30, | |
| } | |
| } | |
| } | |
| // Your task is to complete this implementation in order for the line `let p = | |
| // Person::from("Mark,20")` to compile Please note that you'll need to parse the | |
| // age component into a `usize` with something like `"4".parse::<usize>()`. The | |
| // outcome of this needs to be handled appropriately. | |
| // | |
| // Steps: | |
| // 1. If the length of the provided string is 0, then return the default of | |
| // Person. | |
| // 2. Split the given string on the commas present in it. | |
| // 3. Extract the first element from the split operation and use it as the name. | |
| // 4. If the name is empty, then return the default of Person. | |
| // 5. Extract the other element from the split operation and parse it into a | |
| // `usize` as the age. | |
| // If while parsing the age, something goes wrong, then return the default of | |
| // Person Otherwise, then return an instantiated Person object with the results | |
| impl From<&str> for Person { | |
| fn from(s: &str) -> Person { | |
| if s.len() == 0 { | |
| return Person::default(); | |
| } | |
| let v = s.split(",").collect::<Vec<&str>>(); | |
| if v[0].len() == 0 { | |
| return Person::default(); | |
| } | |
| let name = v[0].to_string(); | |
| if let None = v.get(1) { | |
| return Person::default(); | |
| } | |
| let age = match v[1].parse::<usize>() { | |
| Ok(n) => n, | |
| Err(_) => { | |
| return Person::default(); | |
| } | |
| }; | |
| Person { name, age } | |
| } | |
| } | |
| fn main() { | |
| // Use the `from` function | |
| let p1 = Person::from("Mark,20"); | |
| // Since From is implemented for Person, we should be able to use Into | |
| let p2: Person = "Gerald,70".into(); | |
| println!("{:?}", p1); | |
| println!("{:?}", p2); | |
| } | |
| #[cfg(test)] | |
| mod tests { | |
| use super::*; | |
| #[test] | |
| fn test_default() { | |
| // Test that the default person is 30 year old John | |
| let dp = Person::default(); | |
| assert_eq!(dp.name, "John"); | |
| assert_eq!(dp.age, 30); | |
| } | |
| #[test] | |
| fn test_bad_convert() { | |
| // Test that John is returned when bad string is provided | |
| let p = Person::from(""); | |
| assert_eq!(p.name, "John"); | |
| assert_eq!(p.age, 30); | |
| } | |
| #[test] | |
| fn test_good_convert() { | |
| // Test that "Mark,20" works | |
| let p = Person::from("Mark,20"); | |
| assert_eq!(p.name, "Mark"); | |
| assert_eq!(p.age, 20); | |
| } | |
| #[test] | |
| fn test_bad_age() { | |
| // Test that "Mark,twenty" will return the default person due to an | |
| // error in parsing age | |
| let p = Person::from("Mark,twenty"); | |
| assert_eq!(p.name, "John"); | |
| assert_eq!(p.age, 30); | |
| } | |
| #[test] | |
| fn test_missing_comma_and_age() { | |
| let p: Person = Person::from("Mark"); | |
| assert_eq!(p.name, "John"); | |
| assert_eq!(p.age, 30); | |
| } | |
| #[test] | |
| fn test_missing_age() { | |
| let p: Person = Person::from("Mark,"); | |
| assert_eq!(p.name, "John"); | |
| assert_eq!(p.age, 30); | |
| } | |
| #[test] | |
| fn test_missing_name() { | |
| let p: Person = Person::from(",1"); | |
| assert_eq!(p.name, "John"); | |
| assert_eq!(p.age, 30); | |
| } | |
| #[test] | |
| fn test_missing_name_and_age() { | |
| let p: Person = Person::from(","); | |
| assert_eq!(p.name, "John"); | |
| assert_eq!(p.age, 30); | |
| } | |
| #[test] | |
| fn test_missing_name_and_invalid_age() { | |
| let p: Person = Person::from(",one"); | |
| assert_eq!(p.name, "John"); | |
| assert_eq!(p.age, 30); | |
| } | |
| #[test] | |
| fn test_trailing_comma() { | |
| let p: Person = Person::from("Mike,32,"); | |
| assert_eq!(p.name, "Mike"); | |
| assert_eq!(p.age, 32); | |
| } | |
| #[test] | |
| fn test_trailing_comma_and_some_string() { | |
| let p: Person = Person::from("Mike,32,man"); | |
| assert_eq!(p.name, "Mike"); | |
| assert_eq!(p.age, 32); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment