From bec5b486012587b55e88a618a1684fb1270161af Mon Sep 17 00:00:00 2001 From: Adrian Malacoda Date: Sun, 19 Feb 2017 00:40:21 -0600 Subject: [PATCH] better error handling --- src/lib.rs | 9 ++++++++- src/ninjas/mod.rs | 17 ++++++++++++----- src/pirates/mod.rs | 17 ++++++++++++----- 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 0d65ac7..06a4da9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -8,7 +8,8 @@ pub mod ninjas; #[derive(Debug)] pub enum Error { Http(hyper::error::Error), - Io(std::io::Error) + Io(std::io::Error), + Parse(String) } impl From for Error { @@ -23,6 +24,12 @@ impl From for Error { } } +impl From for Error { + fn from (err: std::num::ParseIntError) -> Error { + Error::Parse(format!("{}", err)) + } +} + pub trait Fighter { fn power (&self) -> u8; } diff --git a/src/ninjas/mod.rs b/src/ninjas/mod.rs index 8cfb47d..7e7d9bd 100644 --- a/src/ninjas/mod.rs +++ b/src/ninjas/mod.rs @@ -53,8 +53,11 @@ pub struct Ninja { impl Ninja { pub fn from_html (contents: &str) -> Result { let document = Document::from(contents); + let full_name = document.find(Class("ninja-name")).first() + .ok_or_else(|| Error::Parse(String::from("could not find ninja-name element")))?.text(); + let mut ninja = Ninja { - name: String::from(document.find(Class("ninja-name")).first().unwrap().text()), + name: String::from(full_name), sneakiness: 0, pajamas: 0, pointy_things: 0, @@ -63,11 +66,15 @@ impl Ninja { for node in document.find(Class("ninja-skill")).iter() { let skill = node.text(); - let score = node.parent().unwrap().find(Class("ninja-score")).first().unwrap().text(); + let score = node.parent().ok_or_else(|| Error::Parse(String::from("could not get ninja-skill parent element")))? + .find(Class("ninja-score")).first() + .ok_or_else(|| Error::Parse(String::from("could not get ninja-score element")))? + .text(); + match &skill[..] { - "Sneakiness:" => { ninja.sneakiness = score.parse::().unwrap() } - "Pajamas:" => { ninja.pajamas = score.parse::().unwrap() }, - "Pointy Things:" => { ninja.pointy_things = score.parse::().unwrap() }, + "Sneakiness:" => { ninja.sneakiness = score.parse::()? } + "Pajamas:" => { ninja.pajamas = score.parse::()? }, + "Pointy Things:" => { ninja.pointy_things = score.parse::()? }, "Weapons:" => { ninja.weapons = parse_weapons(&score[..]) } _ => { } } diff --git a/src/pirates/mod.rs b/src/pirates/mod.rs index f789990..02df0a8 100644 --- a/src/pirates/mod.rs +++ b/src/pirates/mod.rs @@ -53,8 +53,11 @@ pub struct Pirate { impl Pirate { pub fn from_html (contents: &str) -> Result { let document = Document::from(contents); + let full_name = document.find(Class("pirate-name")).first() + .ok_or_else(|| Error::Parse(String::from("could not find pirate-name element")))?.text(); + let mut pirate = Pirate { - name: String::from(document.find(Class("pirate-name")).first().unwrap().text()), + name: String::from(full_name), swashbuckling: 0, drunkenness: 0, booty: 0, @@ -63,11 +66,15 @@ impl Pirate { for node in document.find(Class("pirate-skill")).iter() { let skill = node.text(); - let score = node.parent().unwrap().find(Class("pirate-score")).first().unwrap().text(); + let score = node.parent().ok_or_else(|| Error::Parse(String::from("could not get pirate-skill parent element")))? + .find(Class("pirate-score")).first() + .ok_or_else(|| Error::Parse(String::from("could not get pirate-score element")))? + .text(); + match &skill[..] { - "Swashbuckling:" => { pirate.swashbuckling = score.parse::().unwrap() } - "Drunkenness:" => { pirate.drunkenness = score.parse::().unwrap() }, - "Booty:" => { pirate.booty = score.parse::().unwrap() }, + "Swashbuckling:" => { pirate.swashbuckling = score.parse::()? } + "Drunkenness:" => { pirate.drunkenness = score.parse::()? }, + "Booty:" => { pirate.booty = score.parse::()? }, "Weapons:" => { pirate.weapons = parse_weapons(&score[..]) } _ => { } }