54 lines
1.2 KiB
Rust
54 lines
1.2 KiB
Rust
use serde::{
|
|
de::{Deserializer, Visitor},
|
|
Deserialize,
|
|
Serialize,
|
|
};
|
|
use std::fmt;
|
|
|
|
#[derive(Deserialize, Serialize, Debug)]
|
|
pub struct Message {
|
|
pub text: String,
|
|
pub username: String,
|
|
#[serde(skip_serializing)]
|
|
pub event: Option<Event>,
|
|
pub gateway: String,
|
|
}
|
|
|
|
#[derive(Deserialize, Debug)]
|
|
pub struct MemeResponse {
|
|
pub link: String,
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub enum Event {
|
|
ApiConnected,
|
|
Other(String),
|
|
}
|
|
|
|
impl<'de> Deserialize<'de> for Event {
|
|
fn deserialize<D>(deserializer: D) -> Result<Event, D::Error>
|
|
where
|
|
D: Deserializer<'de>,
|
|
{
|
|
struct EventVisitor;
|
|
|
|
impl<'de> Visitor<'de> for EventVisitor {
|
|
type Value = Event;
|
|
|
|
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
|
formatter.write_str("an event type in the form of a string")
|
|
}
|
|
|
|
fn visit_str<E>(self, value: &str) -> Result<Self::Value, E> {
|
|
Ok(match value {
|
|
"api_connected" => Event::ApiConnected,
|
|
_ => Event::Other(value.into()),
|
|
})
|
|
}
|
|
}
|
|
|
|
deserializer.deserialize_str(EventVisitor)
|
|
}
|
|
}
|
|
|