From 71da37799bf77bb97a672cb4233ed136854a8a53 Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Sun, 15 Apr 2018 12:04:57 +0200 Subject: meetup_rss: Add `description_header` to format date & venue This function will format a string containing a date and venue for inclusion in the description of an RSS `Item`. Added a `derive(Clone)` on `Venue` in order to be able to clone it to use its fields in the function. --- meetup/src/event.rs | 2 +- src/meetup_rss.rs | 147 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 148 insertions(+), 1 deletion(-) diff --git a/meetup/src/event.rs b/meetup/src/event.rs index 30b3fca..cc6abdb 100644 --- a/meetup/src/event.rs +++ b/meetup/src/event.rs @@ -8,7 +8,7 @@ pub struct Event { pub venue: Option, } -#[derive(Debug, Deserialize, PartialEq)] +#[derive(Clone, Debug, Deserialize, PartialEq)] pub struct Venue { pub name: String, pub address_1: String, diff --git a/src/meetup_rss.rs b/src/meetup_rss.rs index fe7b6df..3445a1a 100644 --- a/src/meetup_rss.rs +++ b/src/meetup_rss.rs @@ -35,9 +35,70 @@ pub fn write(channel: Channel) -> Result<()> { } +fn description_header(event: &Event) -> String { + // let when = if let Some(date) = event.local_date && + // Some(time) = event.local_time { + // format!("When: {} {}", date, time) + // } else { + // "" + // }; + + let when = if event.local_date.is_some() && + event.local_time.is_some() { + format!( + "When: {} {}", + event.local_date.clone().unwrap_or("".to_owned()), + event.local_time.clone().unwrap_or("".to_owned()), + ) + } else { + "".to_owned() + }; + + let place = if let Some(venue) = event.venue.clone() { + format!( + "Where: {}, {}, {}, {}", + venue.name, + venue.address_1, + venue.city, + venue.localized_country_name, + ) + } else { + "".to_owned() + }; + + // format!("{}\n{}", when, place) + // [when, place].join("\n") + + let header = when; + + let header = if !header.is_empty() && !place.is_empty() { + format!("{}\n", header) + } else { + header + }; + + let header = format!("{}{}", header, place); + + header + + +// format!( +// "When: {} {} +// Where: {}, {}, {}, {}", +// event.local_date, +// event.local_time, +// event.venue.name, +// event.venue.address_1, +// event.venue.city, +// event.venue.localized_country_name, +// ) +} + + #[cfg(test)] mod tests { use super::*; + use meetup::event::Venue; #[test] fn test_generate_builds_a_channel_of_events() { @@ -64,4 +125,90 @@ mod tests { item.description().unwrap() ); } + + #[test] + fn description_header_makes_a_string_of_time_and_venue() { + let event = Event { + name: "Fairies Story 3 Release Party".to_owned(), + description: Some("Empty".to_owned()), + link: "http://example.com".to_owned(), + local_date: Some("2018-04-15".to_owned()), + local_time: Some("19:00".to_owned()), + venue: Some(Venue { + name: "Passage".to_owned(), + address_1: "99 Passage des Panoramas".to_owned(), + city: "Paris".to_owned(), + localized_country_name: "France".to_owned(), + }), + }; + + let header = description_header(&event); + + assert_eq!( + "When: 2018-04-15 19:00 +Where: Passage, 99 Passage des Panoramas, Paris, France", + header + ); + } + + #[test] + fn description_header_excludes_when_if_no_date_present() { + let header = description_header(&Event { + name: "Fairies Story 3 Release Party".to_owned(), + description: Some("Empty".to_owned()), + link: "http://example.com".to_owned(), + local_date: None, + local_time: Some("19:00".to_owned()), + venue: Some(Venue { + name: "Passage".to_owned(), + address_1: "99 Passage des Panoramas".to_owned(), + city: "Paris".to_owned(), + localized_country_name: "France".to_owned(), + }), + }); + + assert_eq!( + "Where: Passage, 99 Passage des Panoramas, Paris, France", + header + ); + } + + #[test] + fn description_header_excludes_when_if_no_time_present() { + let header = description_header(&Event { + name: "Fairies Story 3 Release Party".to_owned(), + description: Some("Empty".to_owned()), + link: "http://example.com".to_owned(), + local_date: Some("2018-04-15".to_owned()), + local_time: None, + venue: Some(Venue { + name: "Passage".to_owned(), + address_1: "99 Passage des Panoramas".to_owned(), + city: "Paris".to_owned(), + localized_country_name: "France".to_owned(), + }), + }); + + assert_eq!( + "Where: Passage, 99 Passage des Panoramas, Paris, France", + header + ); + } + + #[test] + fn description_header_excludes_where_if_no_venue_present() { + let header = description_header(&Event { + name: "Fairies Story 3 Release Party".to_owned(), + description: Some("Empty".to_owned()), + link: "http://example.com".to_owned(), + local_date: Some("2018-04-15".to_owned()), + local_time: Some("19:00".to_owned()), + venue: None, + }); + + assert_eq!( + "When: 2018-04-15 19:00", + header + ); + } } -- cgit v1.2.3