RUFF/src/api.rs

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)
}
}