summaryrefslogtreecommitdiff
path: root/exercises/conversions/from_str.rs
diff options
context:
space:
mode:
Diffstat (limited to 'exercises/conversions/from_str.rs')
-rw-r--r--exercises/conversions/from_str.rs48
1 files changed, 48 insertions, 0 deletions
diff --git a/exercises/conversions/from_str.rs b/exercises/conversions/from_str.rs
new file mode 100644
index 0000000..247ae14
--- /dev/null
+++ b/exercises/conversions/from_str.rs
@@ -0,0 +1,48 @@
+// This does practically the same thing that TryFrom<&str> does.
+// Additionally, upon implementing FromStr, you can use the `parse` method
+// on strings to generate an object of the implementor type.
+// You can read more about it at https://doc.rust-lang.org/std/str/trait.FromStr.html
+use std::str::FromStr;
+
+#[derive(Debug)]
+struct Person {
+ name: String,
+ age: usize,
+}
+
+// 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
+// 3. Extract the first element from the split operation and use it as the name
+// 4. 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 an error
+// Otherwise, then return a Result of a Person object
+impl FromStr for Person {
+ type Err = String;
+ fn from_str(s: &str) -> Result<Person, Self::Err> {
+ }
+}
+
+fn main() {
+ let p = "Mark,20".parse::<Person>().unwrap();
+ println!("{:?}", p);
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn empty_input() {
+ assert!("".parse::<Person>().is_err());
+ }
+ #[test]
+ fn good_input() {
+ assert!("John,32".parse::<Person>().is_ok());
+ }
+ #[test]
+ #[should_panic]
+ fn missing_age() {
+ "John".parse::<Person>().unwrap();
+ }
+} \ No newline at end of file