diff --git a/chorus-macros/src/lib.rs b/chorus-macros/src/lib.rs index 50bcebf..baac40b 100644 --- a/chorus-macros/src/lib.rs +++ b/chorus-macros/src/lib.rs @@ -105,7 +105,7 @@ pub fn composite_derive(input: TokenStream) -> TokenStream { let expanded = quote! { #[async_trait::async_trait(?Send)] impl Composite for #ident { - async fn watch_whole(self, gateway: &(impl GatewayObject + ?Sized)) -> Self { + async fn watch_whole(self, gateway: &GatewayHandle) -> Self { Self { #(#field_exprs,)* } diff --git a/src/gateway.rs b/src/gateway.rs index 950ec96..9232c2d 100644 --- a/src/gateway.rs +++ b/src/gateway.rs @@ -180,16 +180,32 @@ pub trait Updateable: 'static + Send + Sync { fn id(&self) -> Snowflake; } -#[async_trait(?Send)] -pub trait GatewayObject { - fn store(&self) -> Arc>>>; - fn events(&self) -> Arc>; - async fn observe>( +impl GatewayHandle { + /// Sends json to the gateway with an opcode + async fn send_json_event(&self, op_code: u8, to_send: serde_json::Value) { + let gateway_payload = types::GatewaySendPayload { + op_code, + event_data: Some(to_send), + sequence_number: None, + }; + + let payload_json = serde_json::to_string(&gateway_payload).unwrap(); + + let message = tokio_tungstenite::tungstenite::Message::text(payload_json); + + self.websocket_send + .lock() + .await + .send(message) + .await + .unwrap(); + } + + pub async fn observe>( &self, object: Arc>, ) -> watch::Receiver>> { - let store = self.store(); - let mut store = store.lock().await; + let mut store = self.store.lock().await; let id = object.read().unwrap().id(); if let Some(channel) = store.get(&id) { let (_, rx) = channel @@ -214,7 +230,8 @@ pub trait GatewayObject { receiver } } - async fn observe_and_get>( + + pub async fn observe_and_get>( &self, object: Arc>, ) -> Arc> { @@ -222,50 +239,6 @@ pub trait GatewayObject { let object = channel.borrow().clone(); object } -} - -#[async_trait(?Send)] -impl GatewayObject for GatewayHandle { - fn store(&self) -> Arc>>> { - self.store.clone() - } - - fn events(&self) -> Arc> { - self.events.clone() - } -} - -#[async_trait(?Send)] -impl GatewayObject for Gateway { - fn store(&self) -> Arc>>> { - self.store.clone() - } - - fn events(&self) -> Arc> { - self.events.clone() - } -} - -impl GatewayHandle { - /// Sends json to the gateway with an opcode - async fn send_json_event(&self, op_code: u8, to_send: serde_json::Value) { - let gateway_payload = types::GatewaySendPayload { - op_code, - event_data: Some(to_send), - sequence_number: None, - }; - - let payload_json = serde_json::to_string(&gateway_payload).unwrap(); - - let message = tokio_tungstenite::tungstenite::Message::text(payload_json); - - self.websocket_send - .lock() - .await - .send(message) - .await - .unwrap(); - } /// Sends an identify event to the gateway pub async fn send_identify(&self, to_send: types::GatewayIdentifyPayload) { diff --git a/src/types/entities/channel.rs b/src/types/entities/channel.rs index 8f0bf8b..ad776d8 100644 --- a/src/types/entities/channel.rs +++ b/src/types/entities/channel.rs @@ -6,7 +6,7 @@ use serde::{Deserialize, Serialize}; use serde_aux::prelude::deserialize_string_from_number; use serde_repr::{Deserialize_repr, Serialize_repr}; -use crate::gateway::{GatewayObject, Updateable}; +use crate::gateway::{GatewayHandle, Updateable}; use crate::types::{ entities::{GuildMember, User}, utils::Snowflake, diff --git a/src/types/entities/emoji.rs b/src/types/entities/emoji.rs index 25b7d9a..308c41b 100644 --- a/src/types/entities/emoji.rs +++ b/src/types/entities/emoji.rs @@ -3,7 +3,7 @@ use std::sync::{Arc, RwLock}; use chorus_macros::{Composite, Updateable}; use serde::{Deserialize, Serialize}; -use crate::gateway::{GatewayObject, Updateable}; +use crate::gateway::{GatewayHandle, Updateable}; use crate::types::entities::User; use crate::types::{Composite, Snowflake}; diff --git a/src/types/entities/guild.rs b/src/types/entities/guild.rs index 8f875ec..7f73403 100644 --- a/src/types/entities/guild.rs +++ b/src/types/entities/guild.rs @@ -5,7 +5,7 @@ use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use serde_repr::{Deserialize_repr, Serialize_repr}; -use crate::gateway::{GatewayObject, Updateable}; +use crate::gateway::{GatewayHandle, Updateable}; use crate::types::types::guild_configuration::GuildFeaturesList; use crate::types::{ entities::{Channel, Emoji, RoleObject, Sticker, User, VoiceState, Webhook}, diff --git a/src/types/entities/mod.rs b/src/types/entities/mod.rs index a92463c..7f8cc56 100644 --- a/src/types/entities/mod.rs +++ b/src/types/entities/mod.rs @@ -22,7 +22,7 @@ pub use user_settings::*; pub use voice_state::*; pub use webhook::*; -use crate::gateway::{GatewayObject, Updateable}; +use crate::gateway::{GatewayHandle, Updateable}; use async_trait::async_trait; use std::sync::{Arc, RwLock}; @@ -52,11 +52,11 @@ mod webhook; #[async_trait(?Send)] pub trait Composite { - async fn watch_whole(self, gateway: &(impl GatewayObject + ?Sized)) -> Self; + async fn watch_whole(self, gateway: &GatewayHandle) -> Self; async fn option_observe_fn( value: Option>>, - gateway: &(impl GatewayObject + ?Sized), + gateway: &GatewayHandle, ) -> Option>> where T: Composite, @@ -71,7 +71,7 @@ pub trait Composite { async fn option_vec_observe_fn( value: Option>>>, - gateway: &(impl GatewayObject + ?Sized), + gateway: &GatewayHandle, ) -> Option>>> where T: Composite, @@ -87,10 +87,7 @@ pub trait Composite { } } - async fn value_observe_fn( - value: Arc>, - gateway: &(impl GatewayObject + ?Sized), - ) -> Arc> + async fn value_observe_fn(value: Arc>, gateway: &GatewayHandle) -> Arc> where T: Composite, { @@ -99,7 +96,7 @@ pub trait Composite { async fn vec_observe_fn( value: Vec>>, - gateway: &(impl GatewayObject + ?Sized), + gateway: &GatewayHandle, ) -> Vec>> where T: Composite, diff --git a/src/types/entities/role.rs b/src/types/entities/role.rs index 17b9024..9fac835 100644 --- a/src/types/entities/role.rs +++ b/src/types/entities/role.rs @@ -3,7 +3,7 @@ use chorus_macros::{Composite, Updateable}; use serde::{Deserialize, Serialize}; use serde_aux::prelude::{deserialize_option_number_from_string, deserialize_string_from_number}; -use crate::gateway::{GatewayObject, Updateable}; +use crate::gateway::{GatewayHandle, Updateable}; use crate::types::{utils::Snowflake, Composite}; #[derive(Serialize, Deserialize, Debug, Default, Clone, PartialEq, Updateable, Composite)] diff --git a/src/types/entities/user.rs b/src/types/entities/user.rs index 22e3e9c..56329b2 100644 --- a/src/types/entities/user.rs +++ b/src/types/entities/user.rs @@ -3,7 +3,7 @@ use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use serde_aux::prelude::deserialize_option_number_from_string; -use crate::gateway::{GatewayObject, Updateable}; +use crate::gateway::{GatewayHandle, Updateable}; use crate::types::{utils::Snowflake, Composite}; #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] diff --git a/src/types/entities/voice_state.rs b/src/types/entities/voice_state.rs index 798fe04..e74aa7d 100644 --- a/src/types/entities/voice_state.rs +++ b/src/types/entities/voice_state.rs @@ -4,7 +4,7 @@ use chorus_macros::{Composite, Updateable}; use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; -use crate::gateway::{GatewayObject, Updateable}; +use crate::gateway::{GatewayHandle, Updateable}; use crate::types::{ entities::{Guild, GuildMember}, utils::Snowflake, diff --git a/src/types/entities/webhook.rs b/src/types/entities/webhook.rs index c80cdbd..dd88ca1 100644 --- a/src/types/entities/webhook.rs +++ b/src/types/entities/webhook.rs @@ -3,7 +3,7 @@ use std::sync::{Arc, RwLock}; use chorus_macros::{Composite, Updateable}; use serde::{Deserialize, Serialize}; -use crate::gateway::{GatewayObject, Updateable}; +use crate::gateway::{GatewayHandle, Updateable}; use crate::types::{ entities::{Guild, User}, utils::Snowflake, diff --git a/src/types/events/guild.rs b/src/types/events/guild.rs index 89a8339..2cbdbd0 100644 --- a/src/types/events/guild.rs +++ b/src/types/events/guild.rs @@ -1,17 +1,13 @@ -use std::sync::{Arc, RwLock}; - -use chorus_macros::JsonField; use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use crate::types::entities::{Guild, PublicUser, UnavailableGuild}; use crate::types::events::WebSocketEvent; use crate::types::{ - AuditLogEntry, Emoji, GuildMember, GuildScheduledEvent, JsonField, RoleObject, Snowflake, - Sticker, + AuditLogEntry, Emoji, GuildMember, GuildScheduledEvent, RoleObject, Snowflake, Sticker, }; -use super::{PresenceUpdate, UpdateMessage}; +use super::PresenceUpdate; #[derive(Debug, Deserialize, Serialize, Default, Clone)] /// See ; @@ -168,34 +164,15 @@ pub struct GuildMembersChunk { impl WebSocketEvent for GuildMembersChunk {} -#[derive(Debug, Default, Deserialize, Serialize, Clone, JsonField)] +#[derive(Debug, Default, Deserialize, Serialize, Clone)] /// See pub struct GuildRoleCreate { pub guild_id: Snowflake, pub role: RoleObject, - #[serde(skip)] - pub json: String, } impl WebSocketEvent for GuildRoleCreate {} -impl UpdateMessage for GuildRoleCreate { - fn id(&self) -> Snowflake { - self.role.id - } - - fn update(&mut self, object_to_update: std::sync::Arc>) { - let mut write = object_to_update.write().unwrap(); - if write.roles.is_some() { - write - .roles - .as_mut() - .unwrap() - .push(Arc::new(RwLock::new(self.role.clone()))); - } - } -} - #[derive(Debug, Default, Deserialize, Serialize, Clone)] /// See pub struct GuildRoleUpdate { diff --git a/tests/gateway.rs b/tests/gateway.rs index 742dc4e..4cc450a 100644 --- a/tests/gateway.rs +++ b/tests/gateway.rs @@ -1,7 +1,7 @@ mod common; use chorus::gateway::*; -use chorus::types::{self, Channel, ChannelModifySchema, Guild}; +use chorus::types::{self, Channel, ChannelModifySchema}; #[tokio::test] /// Tests establishing a connection (hello and heartbeats) on the local gateway; @@ -63,6 +63,3 @@ async fn test_self_updating_structs() { common::teardown(bundle).await } - -#[tokio::test] -async fn test_recursive_self_updating_structs() {}