diff --git a/src/types/entities/mod.rs b/src/types/entities/mod.rs index aa52ab9..7a43496 100644 --- a/src/types/entities/mod.rs +++ b/src/types/entities/mod.rs @@ -22,7 +22,8 @@ pub use user_settings::*; pub use voice_state::*; pub use webhook::*; -use crate::gateway::Updateable; +use crate::gateway::{GatewayHandle, Updateable}; +use async_trait::async_trait; use std::sync::{Arc, RwLock}; mod application; @@ -49,25 +50,48 @@ mod user_settings; mod voice_state; mod webhook; -pub(crate) trait Composite { - fn watch_whole(self) -> Self; - fn option_observe_fn(value: Option>>) -> Option>> { - // Perform your logic here... - value +#[async_trait] +pub(crate) trait Composite { + async fn watch_whole(self, gateway: &GatewayHandle) -> Self; + + async fn option_observe_fn( + value: Option>>, + gateway: &GatewayHandle, + ) -> Option>> { + if let Some(value) = value { + Some(gateway.observe_and_get(value).await) + } else { + None + } } - fn option_vec_observe_fn(value: Option>>>) -> Option>>> { - // Perform your logic here... - value + async fn option_vec_observe_fn( + value: Option>>>, + gateway: &GatewayHandle, + ) -> Option>>> { + if let Some(value) = value { + let mut vec = Vec::new(); + for component in value.into_iter() { + vec.push(gateway.observe_and_get(component).await); + } + Some(vec) + } else { + None + } } - fn value_observe_fn(value: Arc>) -> Arc> { - // Perform your logic here... - value + async fn value_observe_fn(value: Arc>, gateway: &GatewayHandle) -> Arc> { + gateway.observe_and_get(value).await } - fn vec_observe_fn(value: Vec>>) -> Vec>> { - // Perform your logic here... - value + async fn vec_observe_fn( + value: Vec>>, + gateway: &GatewayHandle, + ) -> Vec>> { + let mut vec = Vec::new(); + for component in value.into_iter() { + vec.push(gateway.observe_and_get(component).await); + } + vec } }