diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.rs | 54 | 
1 files changed, 53 insertions, 1 deletions
| diff --git a/src/main.rs b/src/main.rs index db82151..9f4ad6a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,8 +1,10 @@ +use base64;  use google_calendar3::api::{Event, EventAttendee};  use google_calendar3::CalendarHub;  use home;  use hyper;  use hyper_rustls; +use regex::Regex;  use tokio;  use yup_oauth2 as oauth2; @@ -10,6 +12,7 @@ use std::env;  use std::fmt;  use std::fs;  use std::process; +use std::str;  #[derive(Debug)] @@ -71,7 +74,10 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {      }      for event_id in &event_ids { -        rsvp(event_id, &action).await; +        rsvp( +            &event_id_from_base64(event_id), +            &action, +        ).await;      }      Ok(()) @@ -145,3 +151,49 @@ fn secret_from_file() -> oauth2::ApplicationSecret {          None => todo!(),      }  } + +fn event_id_from_base64(event_id: &str) -> String { +    // Base64-matching regex from Xuanyuanzhiyuan +    // (https://stackoverflow.com/users/1076906/xuanyuanzhiyuan) on Stack +    // Overflow: +    // https://stackoverflow.com/questions/8571501/how-to-check-whether-a-string-is-base64-encoded-or-not/8571649#8571649 +    let re = Regex::new( +        "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$", +    ).unwrap(); + +    if !re.is_match(event_id) { +        return event_id.to_owned(); +    } + +    let decoded = &base64::decode(event_id).unwrap(); +    let id_email_pair = str::from_utf8(decoded).unwrap(); +    let values = id_email_pair.split(" ").collect::<Vec<_>>(); +    let id = values.first().unwrap().to_string(); + +    id +} + + +#[cfg(test)] +mod tests { +    use crate::*; + +    #[test] +    fn test_event_id_from_base64_event_id() { +        let expected = "1g4j1h67ndq7kddrb2bptp2cua_20210521T120000Z"; + +        let id = event_id_from_base64(expected); + +        assert_eq!(expected, id); +    } + +    #[test] +    fn test_event_id_from_base64_eid() { +        let expected = "1g4j1h67ndq7kddrb2bptp2cua"; +        let encoded = base64::encode(format!("{} rory.mercury@example.com", expected)); + +        let id = event_id_from_base64(&encoded); + +        assert_eq!(expected, id); +    } +} | 
