use serde::{Deserialize, Serialize};
use std::fmt;
#[cfg(feature = "diesel")]
use std::io::Write;
#[cfg(feature = "diesel")]
use diesel::deserialize::{self, FromSql, FromSqlRow};
#[cfg(feature = "diesel")]
use diesel::prelude::*;
#[cfg(feature = "diesel")]
use diesel::serialize::{self, IsNull, Output, ToSql};
#[cfg(feature = "diesel")]
use diesel::{expression::AsExpression, sql_types::Text};
#[cfg(feature = "diesel")]
use diesel::mysql::{Mysql, MysqlValue};
#[derive(Clone, Debug, Deserialize, Serialize, Eq, PartialEq, Hash)]
#[cfg_attr(
feature = "diesel",
derive(diesel::expression::AsExpression, diesel::deserialize::FromSqlRow)
)]
#[cfg_attr(feature = "diesel", diesel(sql_type = Text))]
pub enum EventType {
#[serde(rename = "itinerary")]
Itinerary,
#[serde(rename = "receipt")]
Receipt,
#[serde(rename = "transit_route.status.updated")]
TransitRouteStatusUpdated,
#[serde(rename = "transit_route.location.updated")]
TransitRouteLocationUpdated,
}
#[derive(Clone, Debug, Deserialize, Serialize, Eq, PartialEq, Hash)]
#[cfg_attr(
feature = "diesel",
derive(diesel::expression::AsExpression, diesel::deserialize::FromSqlRow)
)]
#[cfg_attr(feature = "diesel", diesel(sql_type = Text))]
#[cfg_attr(test, derive(strum::EnumIter))]
pub enum InitialEventType {
#[serde(rename = "itinerary")]
Itinerary,
#[serde(rename = "receipt")]
Receipt,
}
#[derive(Clone, Debug, Deserialize, Serialize, Eq, PartialEq, Hash)]
#[cfg_attr(
feature = "diesel",
derive(diesel::expression::AsExpression, diesel::deserialize::FromSqlRow)
)]
#[cfg_attr(feature = "diesel", diesel(sql_type = Text))]
#[cfg_attr(test, derive(strum::EnumIter))]
pub enum UpdateEventType {
#[serde(rename = "transit_route.status.updated")]
TransitRouteStatusUpdated,
#[serde(rename = "transit_route.location.updated")]
TransitRouteLocationUpdated,
}
impl From<InitialEventType> for EventType {
fn from(event: InitialEventType) -> Self {
match event {
InitialEventType::Itinerary => EventType::Itinerary,
InitialEventType::Receipt => EventType::Receipt,
}
}
}
impl From<UpdateEventType> for EventType {
fn from(event: UpdateEventType) -> Self {
match event {
UpdateEventType::TransitRouteStatusUpdated => EventType::TransitRouteStatusUpdated,
UpdateEventType::TransitRouteLocationUpdated => EventType::TransitRouteLocationUpdated,
}
}
}
impl fmt::Display for EventType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let serialized = serde_json::to_string(self).unwrap().replace("\"", "");
write!(f, "{}", serialized)
}
}
impl fmt::Display for InitialEventType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let serialized = serde_json::to_string(self).unwrap().replace("\"", "");
write!(f, "{}", serialized)
}
}
impl fmt::Display for UpdateEventType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let serialized = serde_json::to_string(self).unwrap().replace("\"", "");
write!(f, "{}", serialized)
}
}