Fix errors by moving into_shared out of Composite

This commit is contained in:
bitfl0wer 2024-01-22 14:50:33 +01:00
parent b5923c30e2
commit c4bea069b7
3 changed files with 25 additions and 29 deletions

View File

@ -71,9 +71,9 @@ pub trait Composite<T: Updateable + Clone + Debug> {
async fn watch_whole(self, gateway: &GatewayHandle) -> Self; async fn watch_whole(self, gateway: &GatewayHandle) -> Self;
async fn option_observe_fn( async fn option_observe_fn(
value: Option<Arc<RwLock<T>>>, value: Option<Shared<T>>,
gateway: &GatewayHandle, gateway: &GatewayHandle,
) -> Option<Arc<RwLock<T>>> ) -> Option<Shared<T>>
where where
T: Composite<T> + Debug, T: Composite<T> + Debug,
{ {
@ -86,9 +86,9 @@ pub trait Composite<T: Updateable + Clone + Debug> {
} }
async fn option_vec_observe_fn( async fn option_vec_observe_fn(
value: Option<Vec<Arc<RwLock<T>>>>, value: Option<Vec<Shared<T>>>,
gateway: &GatewayHandle, gateway: &GatewayHandle,
) -> Option<Vec<Arc<RwLock<T>>>> ) -> Option<Vec<Shared<T>>>
where where
T: Composite<T>, T: Composite<T>,
{ {
@ -103,17 +103,14 @@ pub trait Composite<T: Updateable + Clone + Debug> {
} }
} }
async fn value_observe_fn(value: Arc<RwLock<T>>, gateway: &GatewayHandle) -> Arc<RwLock<T>> async fn value_observe_fn(value: Shared<T>, gateway: &GatewayHandle) -> Shared<T>
where where
T: Composite<T>, T: Composite<T>,
{ {
gateway.observe(value).await gateway.observe(value).await
} }
async fn vec_observe_fn( async fn vec_observe_fn(value: Vec<Shared<T>>, gateway: &GatewayHandle) -> Vec<Shared<T>>
value: Vec<Arc<RwLock<T>>>,
gateway: &GatewayHandle,
) -> Vec<Arc<RwLock<T>>>
where where
T: Composite<T>, T: Composite<T>,
{ {
@ -123,17 +120,16 @@ pub trait Composite<T: Updateable + Clone + Debug> {
} }
vec vec
} }
}
/// Uses [`Shared`] to provide an ergonomic alternative to `Arc::new(RwLock::new(obj))`.
/// /// Uses [`Shared`] to provide an ergonomic alternative to `Arc::new(RwLock::new(obj))`.
/// [`Shared<Self>`] can then be observed using the [`Gateway`], turning the underlying ///
/// `dyn Composite<Self>` into a self-updating struct, which is a tracked variant of a chorus /// [`Shared<Self>`] can then be observed using the [`Gateway`], turning the underlying
/// entity struct, updating its' held information when new information concerning itself arrives /// `dyn Composite<Self>` into a self-updating struct, which is a tracked variant of a chorus
/// over the [`Gateway`] connection, reducing the need for expensive network-API calls. /// entity struct, updating its' held information when new information concerning itself arrives
fn into_shared(self) -> Shared<Self> /// over the [`Gateway`] connection, reducing the need for expensive network-API calls.
where pub fn into_shared<T: Composite<T> + Updateable + Clone + Debug + Sized>(
Self: Sized, composite: T,
{ ) -> Shared<T> {
Arc::new(RwLock::new(self)) Arc::new(RwLock::new(composite))
}
} }

View File

@ -1,5 +1,5 @@
use chorus::gateway::{Gateway, Shared}; use chorus::gateway::{Gateway, Shared};
use chorus::types::Composite; use chorus::types::into_shared;
use chorus::{ use chorus::{
instance::{ChorusUser, Instance}, instance::{ChorusUser, Instance},
types::{ types::{
@ -118,9 +118,9 @@ pub(crate) async fn setup() -> TestBundle {
urls, urls,
user, user,
instance, instance,
guild: guild.into_shared(), guild: into_shared(guild),
role: role.into_shared(), role: into_shared(role),
channel: channel.into_shared(), channel: into_shared(channel),
} }
} }

View File

@ -2,7 +2,7 @@ mod common;
use chorus::errors::GatewayError; use chorus::errors::GatewayError;
use chorus::gateway::*; use chorus::gateway::*;
use chorus::types::{self, ChannelModifySchema, Composite, RoleCreateModifySchema, RoleObject}; use chorus::types::{self, into_shared, ChannelModifySchema, RoleCreateModifySchema, RoleObject};
#[cfg(target_arch = "wasm32")] #[cfg(target_arch = "wasm32")]
use wasm_bindgen_test::*; use wasm_bindgen_test::*;
#[cfg(target_arch = "wasm32")] #[cfg(target_arch = "wasm32")]
@ -95,7 +95,7 @@ async fn test_recursive_self_updating_structs() {
.await .await
.unwrap(); .unwrap();
// Watch role; // 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 // Update Guild and check for Guild
let inner_guild = guild.read().unwrap().clone(); let inner_guild = guild.read().unwrap().clone();
assert!(inner_guild.roles.is_some()); assert!(inner_guild.roles.is_some());
@ -107,7 +107,7 @@ async fn test_recursive_self_updating_structs() {
let role_inner = bundle let role_inner = bundle
.user .user
.gateway .gateway
.observe_and_into_inner(role.into_shared()) .observe_and_into_inner(into_shared(role.clone()))
.await; .await;
assert_eq!(role_inner.name, "yippieee"); assert_eq!(role_inner.name, "yippieee");
// Check if the change propagated // Check if the change propagated