diff --git a/src/lib.rs b/src/lib.rs index e7e361a..14a5d69 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -53,6 +53,7 @@ pub enum Organization { sid: String, url: Box, rank: OrganizationRank, + member_count: usize, }, Redacted, } diff --git a/src/parse_org.rs b/src/parse_org.rs index 2dac1ad..14aa4d6 100644 --- a/src/parse_org.rs +++ b/src/parse_org.rs @@ -10,6 +10,7 @@ struct OrgData { title: String, rank: u8, url: Url, + member_count: usize, } pub(crate) fn parse_org<'a>( @@ -39,6 +40,7 @@ pub(crate) fn parse_org<'a>( }, sid: info.sid, url: Box::new(info.url), + member_count: info.member_count, } } else { Organization::Redacted @@ -66,6 +68,7 @@ fn parse_logo<'a>(element: &ElementRef) -> Result> { fn parse_info<'a>(element: &ElementRef) -> Result> { let info_selector = Selector::parse("div.info > p").unwrap(); let rank_selector = Selector::parse("div.info > div.ranking > span.active").unwrap(); + let member_count_selector = Selector::parse("div.thumb > span.members").unwrap(); let rank = element.select(&rank_selector).count() as u8; @@ -134,12 +137,38 @@ fn parse_info<'a>(element: &ElementRef) -> Result> ScScrapingError::organization(message) })?; + let member_count = element + .select(&member_count_selector) + .next() + .ok_or_else(|| { + let message = "Could not find member count"; + error!("{message}"); + ScScrapingError::organization(message) + })? + .inner_html() + .split(" members") + .collect::>() + .first() + .ok_or_else(|| { + let message = "Could not split out member count"; + error!("{message}"); + ScScrapingError::organization(message) + })? + .parse::() + .ok() + .ok_or_else(|| { + let message = "Could not parse member count"; + error!("{message}"); + ScScrapingError::organization(message) + })?; + let data = OrgData { name, rank, sid, title, url, + member_count, }; Ok(data)