diff --git a/src/lib.rs b/src/lib.rs index 7ed13f8..5f9424c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,157 +4,151 @@ use serde::{Deserialize, Serialize}; // success will always be 1/ #[derive(Deserialize, Serialize, Debug)] struct WolvesResult { - success: i8, - result: Vec, + success: i8, + result: Vec, } #[derive(Deserialize, Serialize, Debug)] struct WolvesResultSingle { - success: i8, - result: T, + success: i8, + result: T, } // get_members #[derive(Deserialize, Serialize, Debug)] -struct WolvesUser { - // TODO: Might be worth trying to get this replaced with the club/soc ID? - committee: String, - member_id: String, - first_name: String, - last_name: String, - contact_email: String, - opt_in_email: String, - student_id: Option, - note: Option, - expiry: String, - requested: String, - approved: String, - sitename: String, - domain: String, +pub struct WolvesUser { + // TODO: Might be worth trying to get this replaced with the club/soc ID? + committee: String, + member_id: String, + first_name: String, + last_name: String, + contact_email: String, + opt_in_email: String, + student_id: Option, + note: Option, + expiry: String, + requested: String, + approved: String, + sitename: String, + domain: String, } - // get_cns #[derive(Deserialize, Serialize, Debug)] -struct WolvesCNS { - id: String, - name: String, - // Link to their page such as https://ulwolves.ie/society/computer - link: String, - // array of Committee members member_id's - committee: Vec, +pub struct WolvesCNS { + id: String, + name: String, + // Link to their page such as https://ulwolves.ie/society/computer + link: String, + // array of Committee members member_id's + committee: Vec, } - #[derive(Serialize, Deserialize, Debug)] #[serde(untagged)] pub enum WolvesUserExists { - B(bool), - S(String), + B(bool), + S(String), } -pub struct Client<'a> { - base_wolves: &'a str, - base_key: Option<&'a str>, +pub struct Client { + base_wolves: String, + base_key: Option, } impl Client { - pub fn new(base_wolves: &str, base_key: Option<&str>) -> Self { - Self{ - base_wolves, - base_key - } + pub fn new(base_wolves: &str, base_key: Option<&str>) -> Self { + Self { + base_wolves: base_wolves.to_string(), + base_key: base_key.map(|x| x.to_string()), + } + } + + // This should handle any method where wolves returns an array + async fn get_bulk(&self, wolves_endpoint: &str, api_key: &str) -> Vec { + if self.base_wolves.is_empty() { + return vec![]; } - // This should handle any method where wolves returns an array - async fn get_bulk(self, wolves_endpoint: &str, api_key: &str) -> Vec { - if self.base_wolves.is_empty() { + let url = format!("{}/{}", &self.base_wolves, wolves_endpoint); + + // get wolves data + match reqwest::Client::new().post(&url).header("X-AM-Identity", api_key).send().await { + Ok(x) => { + if let Ok(WolvesResult { + success, + result, + }) = x.json::>().await + { + if success != 1 { return vec![]; + } + + return result; } + } + Err(e) => { + dbg!(e); + } + } + vec![] + } - let url = format!("{}/{}", self.base_wolves, wolves_endpoint); + // this is the command that gets a list of all members in a club/soc + // uses the api key for each club/soc + pub async fn get_members(&self, api_key: &str) -> Vec { + self.get_bulk::("get_members", api_key).await + } - // get wolves data - match reqwest::Client::new() - .post(&url) - .header("X-AM-Identity", api_key) - .send() - .await - { - Ok(x) => { - if let Ok(WolvesResult {success, result }) = x.json::>().await { - if success != 1 { - return vec![]; - } + // command to get club/soc and committee members + // uses the instance key if it exists + pub async fn get_committees(&self) -> Vec { + if let Some(api_key) = &self.base_key { + self.get_bulk::("get_cns", api_key).await + } else { + vec![] + } + } - return result; - } - } - Err(e) => { - dbg!(e); + // method to get member_id from an email + // email can be either the login email or contact email + pub async fn get_member(self, email: &str) -> Option { + // if the key isnt set then we cant do anything. + let api_key = match &self.base_key { + None => { + return None; + } + Some(key) => key, + }; + + let url = format!("{}/get_id_from_email", &self.base_wolves); + + match reqwest::Client::new() + .post(&url) + .form(&[("email", email)]) + .header("X-AM-Identity", api_key) + .send() + .await + { + Ok(x) => { + if let Ok(y) = x.json::>().await { + // this is the only time we will get a positive response, the None at the end catches everything else + if let WolvesUserExists::S(z) = y.result { + if let Ok(id) = z.parse::() { + return Some(id); } + } } - vec![] - } - - // this is the command that gets a list of all members in a club/soc - // uses the api key for each club/soc - pub async fn get_members(self, api_key: &str) -> Vec{ - self.get_bulk::("get_members", api_key) - } - - // command to get club/soc and committee members - // uses the instance key if it exists - pub async fn get_committees(self) -> Vec { - if let Some(api_key) = self.base_key { - self.get_bulk::("get_cns", api_key) - } else { - vec![] - } - } - - - // method to get member_id from an email - // email can be either the login email or contact email - pub async fn get_member(self, email: &str) -> Option { - // if the key isnt set then we cant do anything. - let api_key = match self.base_key { - None => { return None; } - Some(key) => {key} - }; - - let url = format!("{}/get_id_from_email", self.base_wolves); - - match reqwest::Client::new() - .post(&url) - .form(&[("email", email)]) - .header("X-AM-Identity", api_key) - .send() - .await - { - Ok(x) => { - if let Ok(y) = x.json::>().await { - // this is the only time we will get a positive response, the None at the end catches everything else - if let WolvesUserExists::S(z) = y.result { - if let Ok(id) = z.parse::() { - return Some(id); - } - } - } - } - Err(e) => { - dbg!(e); - } - } - - None + } + Err(e) => { + dbg!(e); + } } + None + } } - - - // pub fn add(left: u64, right: u64) -> u64 { // left + right // }