Add Default derives to types

This commit is contained in:
bitfl0wer 2023-04-28 18:18:32 +02:00
parent 530c0deb36
commit 82f1b3dcc1
No known key found for this signature in database
GPG Key ID: 84BBB60DF895ABF2
2 changed files with 106 additions and 50 deletions

View File

@ -134,7 +134,7 @@ pub struct Error {
pub code: String, pub code: String,
} }
#[derive(Serialize, Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug, Default)]
pub struct UserObject { pub struct UserObject {
id: String, id: String,
username: String, username: String,
@ -203,8 +203,8 @@ impl User {
} }
} }
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize, Default)]
struct Message { pub struct Message {
id: String, id: String,
channel_id: String, channel_id: String,
author: UserObject, author: UserObject,
@ -239,8 +239,8 @@ struct Message {
role_subscription_data: Option<RoleSubscriptionData>, role_subscription_data: Option<RoleSubscriptionData>,
} }
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize, Default)]
struct MessageCreate { pub struct MessageCreate {
#[serde(flatten)] #[serde(flatten)]
message: Message, message: Message,
guild_id: Option<String>, guild_id: Option<String>,
@ -250,7 +250,7 @@ struct MessageCreate {
impl WebSocketEvent for MessageCreate {} impl WebSocketEvent for MessageCreate {}
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize, Default)]
struct PartialMessage { struct PartialMessage {
id: Option<String>, id: Option<String>,
channel_id: Option<String>, channel_id: Option<String>,
@ -288,8 +288,8 @@ struct PartialMessage {
member: Option<GuildMember>, member: Option<GuildMember>,
} }
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize, Default)]
struct MessageUpdate { pub struct MessageUpdate {
#[serde(flatten)] #[serde(flatten)]
message: PartialMessage, message: PartialMessage,
guild_id: Option<String>, guild_id: Option<String>,
@ -299,8 +299,8 @@ struct MessageUpdate {
impl WebSocketEvent for MessageUpdate {} impl WebSocketEvent for MessageUpdate {}
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize, Default)]
struct MessageDelete { pub struct MessageDelete {
id: String, id: String,
channel_id: String, channel_id: String,
guild_id: Option<String>, guild_id: Option<String>,
@ -308,8 +308,8 @@ struct MessageDelete {
impl WebSocketEvent for MessageDelete {} impl WebSocketEvent for MessageDelete {}
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize, Default)]
struct MessageDeleteBulk { pub struct MessageDeleteBulk {
ids: Vec<String>, ids: Vec<String>,
channel_id: String, channel_id: String,
guild_id: Option<String>, guild_id: Option<String>,
@ -317,8 +317,8 @@ struct MessageDeleteBulk {
impl WebSocketEvent for MessageDeleteBulk {} impl WebSocketEvent for MessageDeleteBulk {}
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize, Default)]
struct MessageReactionAdd { pub struct MessageReactionAdd {
user_id: String, user_id: String,
channel_id: String, channel_id: String,
message_id: String, message_id: String,
@ -329,8 +329,8 @@ struct MessageReactionAdd {
impl WebSocketEvent for MessageReactionAdd {} impl WebSocketEvent for MessageReactionAdd {}
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize, Default)]
struct MessageReactionRemove { pub struct MessageReactionRemove {
user_id: String, user_id: String,
channel_id: String, channel_id: String,
message_id: String, message_id: String,
@ -340,8 +340,8 @@ struct MessageReactionRemove {
impl WebSocketEvent for MessageReactionRemove {} impl WebSocketEvent for MessageReactionRemove {}
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize, Default)]
struct MessageReactionRemoveAll { pub struct MessageReactionRemoveAll {
channel_id: String, channel_id: String,
message_id: String, message_id: String,
guild_id: Option<String>, guild_id: Option<String>,
@ -349,8 +349,8 @@ struct MessageReactionRemoveAll {
impl WebSocketEvent for MessageReactionRemoveAll {} impl WebSocketEvent for MessageReactionRemoveAll {}
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize, Default)]
struct MessageReactionRemoveEmoji { pub struct MessageReactionRemoveEmoji {
channel_id: String, channel_id: String,
message_id: String, message_id: String,
guild_id: Option<String>, guild_id: Option<String>,
@ -463,7 +463,7 @@ struct Reaction {
emoji: Emoji, emoji: Emoji,
} }
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize, Default)]
struct Emoji { struct Emoji {
id: Option<u64>, id: Option<u64>,
name: Option<String>, name: Option<String>,
@ -698,8 +698,8 @@ struct RoleSubscriptionData {
is_renewal: bool, is_renewal: bool,
} }
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize, Default)]
struct TypingStartEvent { pub struct TypingStartEvent {
channel_id: String, channel_id: String,
guild_id: Option<String>, guild_id: Option<String>,
user_id: String, user_id: String,
@ -709,8 +709,8 @@ struct TypingStartEvent {
impl WebSocketEvent for TypingStartEvent {} impl WebSocketEvent for TypingStartEvent {}
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize, Default)]
struct GatewayIdentifyPayload { pub struct GatewayIdentifyPayload {
token: String, token: String,
properties: GatewayIdentifyConnectionProps, properties: GatewayIdentifyConnectionProps,
compress: Option<bool>, compress: Option<bool>,
@ -722,15 +722,15 @@ struct GatewayIdentifyPayload {
impl WebSocketEvent for GatewayIdentifyPayload {} impl WebSocketEvent for GatewayIdentifyPayload {}
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize, Default)]
struct GatewayIdentifyConnectionProps { pub struct GatewayIdentifyConnectionProps {
os: String, pub os: String,
browser: String, pub browser: String,
device: String, pub device: String,
} }
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize, Default)]
struct PresenceUpdate { pub struct PresenceUpdate {
since: Option<i64>, since: Option<i64>,
activities: Vec<Activity>, activities: Vec<Activity>,
status: String, status: String,
@ -793,11 +793,11 @@ struct ActivityButton {
url: String, url: String,
} }
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize, Default)]
pub(crate) struct GatewayResume { pub struct GatewayResume {
pub(crate) token: String, pub token: String,
pub(crate) session_id: String, pub session_id: String,
pub(crate) seq: String, pub seq: String,
} }
impl WebSocketEvent for GatewayResume {} impl WebSocketEvent for GatewayResume {}

View File

@ -1,23 +1,50 @@
use crate::{api::WebSocketEvent, errors::ObserverError}; use crate::api::types::*;
use crate::api::WebSocketEvent;
use crate::errors::ObserverError;
use crate::gateway::events::Events;
use crate::URLBundle;
use reqwest::{Client, Url};
use tokio::net::TcpStream;
use tokio_tungstenite::tungstenite::error::UrlError;
use tokio_tungstenite::tungstenite::Error;
use tokio_tungstenite::MaybeTlsStream;
use tokio_tungstenite::WebSocketStream;
use tokio_tungstenite::{connect_async, tungstenite::protocol::Message};
#[derive(Debug)]
/** /**
Represents a Gateway connection. Represents a Gateway connection. A Gateway connection will create observable
[`GatewayEvents`](GatewayEvent), which you can subscribe to. Gateway events include all currently
implemented [Types] with the trait [`WebSocketEvent`]
*/ */
pub struct Gateway {} pub struct Gateway<'a> {
pub url: String,
pub events: Events<'a>,
stream: WebSocketStream<MaybeTlsStream<TcpStream>>,
}
impl<'a> Gateway<'a> {
pub async fn new(websocket_url: String) {
let parsed_url = Url::parse(&URLBundle::parse_url(websocket_url.clone())).unwrap();
if parsed_url.scheme() != "ws" && parsed_url.scheme() != "wss" {
return Err(Error::Url(UrlError::UnsupportedUrlScheme));
}
}
}
/** /**
Trait which defines the behaviour of an Observer. An Observer is an object which is subscribed to Trait which defines the behaviour of an Observer. An Observer is an object which is subscribed to
an Observable. The Observer is notified when the Observable's data changes. an Observable. The Observer is notified when the Observable's data changes.
In this case, the Observable is a GatewayEvent, which is a wrapper around a WebSocketEvent. In this case, the Observable is a [`GatewayEvent`], which is a wrapper around a WebSocketEvent.
*/ */
pub trait Observer<T: WebSocketEvent> { pub trait Observer<T: WebSocketEvent> {
fn update(&self, data: &T); fn update(&self, data: &T);
} }
/** GatewayEvent is a wrapper around a WebSocketEvent. It is used to notify the observers of a /** GatewayEvent is a wrapper around a WebSocketEvent. It is used to notify the observers of a
* change in the WebSocketEvent. change in the WebSocketEvent. GatewayEvents are observable.
*/ */
#[derive(Default)]
pub struct GatewayEvent<'a, T: WebSocketEvent> { pub struct GatewayEvent<'a, T: WebSocketEvent> {
observers: Vec<&'a dyn Observer<T>>, observers: Vec<&'a dyn Observer<T>>,
pub event_data: T, pub event_data: T,
@ -85,6 +112,35 @@ impl<'a, T: WebSocketEvent> GatewayEvent<'a, T> {
} }
} }
mod events {
use super::*;
#[derive(Default)]
pub struct Events<'a> {
pub message: Message<'a>,
pub user: User<'a>,
pub gateway_identify_payload: GatewayEvent<'a, GatewayIdentifyPayload>,
pub gateway_resume: GatewayEvent<'a, GatewayResume>,
}
#[derive(Default)]
pub struct Message<'a> {
pub create: GatewayEvent<'a, MessageCreate>,
pub update: GatewayEvent<'a, MessageUpdate>,
pub delete: GatewayEvent<'a, MessageDelete>,
pub delete_bulk: GatewayEvent<'a, MessageDeleteBulk>,
pub reaction_add: GatewayEvent<'a, MessageReactionAdd>,
pub reaction_remove: GatewayEvent<'a, MessageReactionRemove>,
pub reaction_remove_all: GatewayEvent<'a, MessageReactionRemoveAll>,
pub reaction_remove_emoji: GatewayEvent<'a, MessageReactionRemoveEmoji>,
}
#[derive(Default)]
pub struct User<'a> {
pub presence_update: GatewayEvent<'a, PresenceUpdate>,
pub typing_start_event: GatewayEvent<'a, TypingStartEvent>,
}
}
#[cfg(test)] #[cfg(test)]
mod example { mod example {
use super::*; use super::*;