diff --git a/src/types/entities/mod.rs b/src/types/entities/mod.rs index 7c914b1..ee31bf4 100644 --- a/src/types/entities/mod.rs +++ b/src/types/entities/mod.rs @@ -71,9 +71,9 @@ pub trait Composite { async fn watch_whole(self, gateway: &GatewayHandle) -> Self; async fn option_observe_fn( - value: Option>>, + value: Option>, gateway: &GatewayHandle, - ) -> Option>> + ) -> Option> where T: Composite + Debug, { @@ -86,9 +86,9 @@ pub trait Composite { } async fn option_vec_observe_fn( - value: Option>>>, + value: Option>>, gateway: &GatewayHandle, - ) -> Option>>> + ) -> Option>> where T: Composite, { @@ -103,17 +103,14 @@ pub trait Composite { } } - async fn value_observe_fn(value: Arc>, gateway: &GatewayHandle) -> Arc> + async fn value_observe_fn(value: Shared, gateway: &GatewayHandle) -> Shared where T: Composite, { gateway.observe(value).await } - async fn vec_observe_fn( - value: Vec>>, - gateway: &GatewayHandle, - ) -> Vec>> + async fn vec_observe_fn(value: Vec>, gateway: &GatewayHandle) -> Vec> where T: Composite, { @@ -123,17 +120,16 @@ pub trait Composite { } vec } - - /// Uses [`Shared`] to provide an ergonomic alternative to `Arc::new(RwLock::new(obj))`. - /// - /// [`Shared`] can then be observed using the [`Gateway`], turning the underlying - /// `dyn Composite` into a self-updating struct, which is a tracked variant of a chorus - /// entity struct, updating its' held information when new information concerning itself arrives - /// over the [`Gateway`] connection, reducing the need for expensive network-API calls. - fn into_shared(self) -> Shared - where - Self: Sized, - { - Arc::new(RwLock::new(self)) - } +} + +/// Uses [`Shared`] to provide an ergonomic alternative to `Arc::new(RwLock::new(obj))`. +/// +/// [`Shared`] can then be observed using the [`Gateway`], turning the underlying +/// `dyn Composite` into a self-updating struct, which is a tracked variant of a chorus +/// entity struct, updating its' held information when new information concerning itself arrives +/// over the [`Gateway`] connection, reducing the need for expensive network-API calls. +pub fn into_shared + Updateable + Clone + Debug + Sized>( + composite: T, +) -> Shared { + Arc::new(RwLock::new(composite)) } diff --git a/tests/common/mod.rs b/tests/common/mod.rs index a267125..fe064fb 100644 --- a/tests/common/mod.rs +++ b/tests/common/mod.rs @@ -1,5 +1,5 @@ use chorus::gateway::{Gateway, Shared}; -use chorus::types::Composite; +use chorus::types::into_shared; use chorus::{ instance::{ChorusUser, Instance}, types::{ @@ -118,9 +118,9 @@ pub(crate) async fn setup() -> TestBundle { urls, user, instance, - guild: guild.into_shared(), - role: role.into_shared(), - channel: channel.into_shared(), + guild: into_shared(guild), + role: into_shared(role), + channel: into_shared(channel), } } diff --git a/tests/gateway.rs b/tests/gateway.rs index deb3129..84361fb 100644 --- a/tests/gateway.rs +++ b/tests/gateway.rs @@ -2,7 +2,7 @@ mod common; use chorus::errors::GatewayError; use chorus::gateway::*; -use chorus::types::{self, ChannelModifySchema, Composite, RoleCreateModifySchema, RoleObject}; +use chorus::types::{self, into_shared, ChannelModifySchema, RoleCreateModifySchema, RoleObject}; #[cfg(target_arch = "wasm32")] use wasm_bindgen_test::*; #[cfg(target_arch = "wasm32")] @@ -95,7 +95,7 @@ async fn test_recursive_self_updating_structs() { .await .unwrap(); // Watch role; - bundle.user.gateway.observe(role.into_shared()).await; + bundle.user.gateway.observe(into_shared(role.clone())).await; // Update Guild and check for Guild let inner_guild = guild.read().unwrap().clone(); assert!(inner_guild.roles.is_some()); @@ -107,7 +107,7 @@ async fn test_recursive_self_updating_structs() { let role_inner = bundle .user .gateway - .observe_and_into_inner(role.into_shared()) + .observe_and_into_inner(into_shared(role.clone())) .await; assert_eq!(role_inner.name, "yippieee"); // Check if the change propagated