use serde::Deserialize;
#[derive(Debug)]
pub struct GetEventsRequest {
pub date: Option<String>,
pub adult: Option<bool>,
pub timezone: Option<String>,
}
#[derive(Debug, Deserialize, PartialEq)]
pub struct GetEventsResponse {
pub adult: bool,
pub date: DateOrTimestamp,
pub timezone: String,
pub events: Vec<EventSummary>,
pub multiday_starting: Vec<EventSummary>,
pub multiday_ongoing: Vec<EventSummary>,
#[serde(skip_deserializing)]
pub rate_limit: RateLimit,
}
#[derive(Debug)]
pub struct GetEventInfoRequest {
pub id: String,
pub start: Option<i32>,
pub end: Option<i32>,
}
#[derive(Debug, Deserialize, PartialEq)]
pub struct GetEventInfoResponse {
pub event: EventInfo,
#[serde(skip_deserializing)]
pub rate_limit: RateLimit,
}
#[derive(Debug)]
pub struct SearchRequest {
pub query: String,
pub adult: Option<bool>,
}
#[derive(Debug, Deserialize, PartialEq)]
pub struct SearchResponse {
pub query: String,
pub adult: bool,
pub events: Vec<EventSummary>,
#[serde(skip_deserializing)]
pub rate_limit: RateLimit,
}
#[derive(Debug, Deserialize, PartialEq)]
pub struct EventInfo {
pub id: String,
pub name: String,
pub url: String,
pub adult: bool,
pub alternate_names: Vec<AlternateName>,
pub hashtags: Option<Vec<String>>,
pub image: Option<ImageInfo>,
pub sources: Option<Vec<String>>,
pub description: Option<RichText>,
pub how_to_observe: Option<RichText>,
pub patterns: Option<Vec<Pattern>>,
pub occurrences: Option<Vec<Occurrence>>,
pub founders: Option<Vec<FounderInfo>>,
pub analytics: Option<Analytics>,
pub tags: Option<Vec<Tag>>,
}
#[derive(Debug, Deserialize, PartialEq)]
pub struct Pattern {
pub first_year: Option<i32>,
pub last_year: Option<i32>,
pub observed: String,
pub observed_html: String,
pub observed_markdown: String,
pub length: i32,
}
#[derive(Debug, Deserialize, PartialEq)]
pub struct Occurrence {
pub date: DateOrTimestamp,
pub length: i32,
}
#[derive(Debug, PartialEq)]
pub enum DateOrTimestamp {
Date(String),
Timestamp(i64),
}
impl<'de> Deserialize<'de> for DateOrTimestamp {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
struct DateOrTimestampVisitor;
impl<'de> serde::de::Visitor<'de> for DateOrTimestampVisitor {
type Value = DateOrTimestamp;
fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
f.write_str("OccurrenceDate as a number or string")
}
fn visit_i64<E>(self, date: i64) -> Result<Self::Value, E>
where
E: serde::de::Error,
{
Ok(DateOrTimestamp::Timestamp(date))
}
fn visit_u64<E>(self, date: u64) -> Result<Self::Value, E>
where
E: serde::de::Error,
{
Ok(DateOrTimestamp::Timestamp(date as i64))
}
fn visit_str<E>(self, date: &str) -> Result<Self::Value, E>
where
E: serde::de::Error,
{
Ok(DateOrTimestamp::Date(date.to_string()))
}
}
deserializer.deserialize_any(DateOrTimestampVisitor)
}
}
#[derive(Debug, Deserialize, PartialEq)]
pub struct AlternateName {
pub name: String,
pub first_year: Option<i32>,
pub last_year: Option<i32>,
}
#[derive(Debug, Deserialize, PartialEq)]
pub struct RichText {
pub text: Option<String>,
pub html: Option<String>,
pub markdown: Option<String>,
}
#[derive(Debug, Deserialize, PartialEq)]
pub struct EventSummary {
pub id: String,
pub name: String,
pub url: String,
}
#[derive(Debug, Deserialize, PartialEq)]
pub struct ImageInfo {
pub small: String,
pub medium: String,
pub large: String,
}
#[derive(Debug, Deserialize, PartialEq)]
pub struct FounderInfo {
pub name: String,
pub url: Option<String>,
pub date: Option<String>,
}
#[derive(Debug, Deserialize, PartialEq)]
pub struct Analytics {
pub overall_rank: i32,
pub social_rank: i32,
pub social_shares: i32,
pub popularity: String,
}
#[derive(Debug, Deserialize, PartialEq)]
pub struct Tag {
pub name: String,
}
#[derive(Debug, Deserialize, PartialEq, Default)]
pub struct RateLimit {
pub limit_month: i32,
pub remaining_month: i32,
}
pub trait RateLimited {
fn set_rate_limit(&mut self, rate_limit: RateLimit);
}
impl RateLimited for GetEventsResponse {
fn set_rate_limit(&mut self, rate_limit: RateLimit) {
self.rate_limit = rate_limit;
}
}
impl RateLimited for GetEventInfoResponse {
fn set_rate_limit(&mut self, rate_limit: RateLimit) {
self.rate_limit = rate_limit;
}
}
impl RateLimited for SearchResponse {
fn set_rate_limit(&mut self, rate_limit: RateLimit) {
self.rate_limit = rate_limit;
}
}