diff --git a/src/lib.rs b/src/lib.rs index 0c313dc..804983e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,11 +4,7 @@ extern crate select; pub mod pirates; pub mod ninjas; - -use select::document::Document; -use select::predicate::Class; - -use std::collections::BTreeMap; +mod parser; #[derive(Debug)] pub enum Error { @@ -38,62 +34,3 @@ impl From for Error { pub trait Fighter { fn power (&self) -> u8; } - -struct Parser { - fighter_type: &'static str, - document: Document -} - -impl Parser { - pub fn parse_name (&self) -> Result { - let name_class = format!("{}-name", self.fighter_type); - self.document.find(Class(&name_class[..])).first() - .ok_or_else(|| Error::Parse(format!("could not find {} element", name_class))).map(|result| result.text()) - } - - pub fn parse_skills (&self) -> Result { - let skill_class = format!("{}-skill", self.fighter_type); - let score_class = format!("{}-score", self.fighter_type); - let map: Result, Error> = self.document.find(Class(&skill_class[..])).iter().map(|node| { - let skill = node.text(); - let score = node.parent().ok_or_else(|| Error::Parse(format!("could not get {} parent element", skill_class)))? - .find(Class(&score_class[..])).first() - .ok_or_else(|| Error::Parse(format!("could not get {} element", score_class)))? - .text(); - - Result::Ok((skill, Skill { score: score })) - }).collect(); - - Result::Ok(Skills { - map: map? - }) - } -} - -struct Skills { - map: BTreeMap -} - -impl Skills { - pub fn get (&self, key: &str) -> Result<&Skill, Error> { - self.map.get(key).ok_or_else(|| Error::Parse(format!("could not get {} value", key))) - } -} - -struct Skill { - score: String -} - -impl Skill { - pub fn as_number (&self) -> Result { - self.score.parse::() - } - - pub fn as_weapons (&self) -> Vec { - if self.score == "None" { - return vec![]; - } - - self.score.split(", ").into_iter().map(String::from).collect() - } -} diff --git a/src/ninjas/mod.rs b/src/ninjas.rs similarity index 97% rename from src/ninjas/mod.rs rename to src/ninjas.rs index 4d42e97..5c59d8c 100644 --- a/src/ninjas/mod.rs +++ b/src/ninjas.rs @@ -4,7 +4,8 @@ use select::document::Document; use std::io::Read; -use {Error, Fighter, Parser}; +use {Error, Fighter}; +use parser::Parser; pub struct Ninjas { cache: LruCache, diff --git a/src/parser.rs b/src/parser.rs new file mode 100644 index 0000000..2e53b31 --- /dev/null +++ b/src/parser.rs @@ -0,0 +1,65 @@ +use select::document::Document; +use select::predicate::Class; + +use std::collections::BTreeMap; + +use Error; + +pub struct Parser { + pub fighter_type: &'static str, + pub document: Document +} + +impl Parser { + pub fn parse_name (&self) -> Result { + let name_class = format!("{}-name", self.fighter_type); + self.document.find(Class(&name_class[..])).first() + .ok_or_else(|| Error::Parse(format!("could not find {} element", name_class))).map(|result| result.text()) + } + + pub fn parse_skills (&self) -> Result { + let skill_class = format!("{}-skill", self.fighter_type); + let score_class = format!("{}-score", self.fighter_type); + let map: Result, Error> = self.document.find(Class(&skill_class[..])).iter().map(|node| { + let skill = node.text(); + let score = node.parent().ok_or_else(|| Error::Parse(format!("could not get {} parent element", skill_class)))? + .find(Class(&score_class[..])).first() + .ok_or_else(|| Error::Parse(format!("could not get {} element", score_class)))? + .text(); + + Result::Ok((skill, Skill { score: score })) + }).collect(); + + Result::Ok(Skills { + map: map? + }) + } +} + +pub struct Skills { + map: BTreeMap +} + +impl Skills { + pub fn get (&self, key: &str) -> Result<&Skill, Error> { + self.map.get(key).ok_or_else(|| Error::Parse(format!("could not get {} value", key))) + } +} + +pub struct Skill { + score: String +} + +impl Skill { + pub fn as_number (&self) -> Result { + self.score.parse::() + } + + pub fn as_weapons (&self) -> Vec { + if self.score == "None" { + return vec![]; + } + + self.score.split(", ").into_iter().map(String::from).collect() + } +} diff --git a/src/pirates/mod.rs b/src/pirates.rs similarity index 97% rename from src/pirates/mod.rs rename to src/pirates.rs index cbf154c..0be5ca5 100644 --- a/src/pirates/mod.rs +++ b/src/pirates.rs @@ -4,7 +4,8 @@ use select::document::Document; use std::io::Read; -use {Error, Fighter, Parser}; +use {Error, Fighter}; +use parser::Parser; pub struct Pirates { cache: LruCache,