Something went wrong. Try again.
🌤 Track the weather for event days wed.fyi
Something went wrong. Try again.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677use crate::atproto::lexicon::event;use crate::GEOCOORDINATE_SCALE;use anyhow::{anyhow, Result};use chrono::NaiveDateTime;use jacquard_common::deps::smol_str::SmolStr;use serde::{Deserialize, Serialize};
#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]pub struct Event { pub rkey: Option<String>, pub name: Option<String>, #[serde(with = "crate::date_format")] pub when: NaiveDateTime, pub before: Option<i64>, pub after: Option<i64>, pub read_only: bool,
pub location: String, pub latitude: f64, pub longitude: f64,
#[serde(default)] pub collection: Option<String>,}
impl Event { pub fn countdown_in_days(&self) -> i64 { (self.when - chrono::Local::now().naive_local()).num_days() }
pub fn to_record(&self) -> Result<event::Event> { let record = event::Event { latitude: (self.latitude * GEOCOORDINATE_SCALE).round() as i64, longitude: (self.longitude * GEOCOORDINATE_SCALE).round() as i64, name: self.name.clone().map(SmolStr::from), when: SmolStr::from( self.when .format(crate::date_format::WED_FILE_DATE_FORMAT) .to_string(), ), before: self.before, after: self.after, location: if self.location.is_empty() { None } else { Some(SmolStr::from(self.location.clone())) }, extra_data: None, }; record .validate() .map_err(|e| anyhow!("invalid event: {e}"))?; Ok(record) }
pub fn from_record(record: &event::Event, rkey: Option<String>) -> Result<Event> { let when = lexicons::parse_when(record.when.as_ref()) .map_err(|e| anyhow!("invalid event `when` '{}': {e}", record.when.as_str()))?; Ok(Event { name: record.name.as_ref().map(|s| s.as_str().to_string()), when, before: record.before, after: record.after, location: record .location .as_ref() .map(|s| s.as_str().to_string()) .unwrap_or_default(), latitude: record.latitude as f64 / GEOCOORDINATE_SCALE, longitude: record.longitude as f64 / GEOCOORDINATE_SCALE, rkey, read_only: false, collection: None, }) }}