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: String,
pub timezone: String,
pub events: Vec<EventSummary>,
pub multiday_starting: Vec<EventSummary>,
pub multiday_ongoing: Vec<EventSummary>,
#[serde(skip_deserializing)]
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)]
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)]
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: Vec<String>,
pub image: ImageInfo,
pub sources: Vec<String>,
pub description: RichText,
pub how_to_observe: RichText,
pub patterns: Vec<Pattern>,
pub occurrences: Vec<Occurrence>,
pub founders: Vec<FounderInfo>,
}
#[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: OccurrenceDate,
pub length: i32,
}
#[derive(Debug, PartialEq)]
pub enum OccurrenceDate {
Date(String),
Timestamp(i64),
}
impl<'de> Deserialize<'de> for OccurrenceDate {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where D: serde::Deserializer<'de>
{
struct OccurrenceDateVisitor;
impl<'de> serde::de::Visitor<'de> for OccurrenceDateVisitor {
type Value = OccurrenceDate;
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(OccurrenceDate::Timestamp(date))
}
fn visit_u64<E>(self, date: u64) -> Result<Self::Value, E>
where E: serde::de::Error
{
Ok(OccurrenceDate::Timestamp(date as i64))
}
fn visit_str<E>(self, date: &str) -> Result<Self::Value, E>
where E: serde::de::Error
{
Ok(OccurrenceDate::Date(date.to_string()))
}
}
deserializer.deserialize_any(OccurrenceDateVisitor)
}
}
#[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, Default)]
pub struct RateLimit {
pub limit_month: i32,
pub remaining_month: i32,
}
pub trait RateLimited {
fn get_rate_limit(&self) -> &RateLimit;
fn set_rate_limit(&mut self, rate_limit: RateLimit);
}
impl RateLimited for GetEventsResponse {
fn get_rate_limit(&self) -> &RateLimit {
&self.rate_limit
}
fn set_rate_limit(&mut self, rate_limit: RateLimit) {
self.rate_limit = rate_limit;
}
}
impl RateLimited for GetEventInfoResponse {
fn get_rate_limit(&self) -> &RateLimit {
&self.rate_limit
}
fn set_rate_limit(&mut self, rate_limit: RateLimit) {
self.rate_limit = rate_limit;
}
}
impl RateLimited for SearchResponse {
fn get_rate_limit(&self) -> &RateLimit {
&self.rate_limit
}
fn set_rate_limit(&mut self, rate_limit: RateLimit) {
self.rate_limit = rate_limit;
}
}