Trait serenity::cache::CacheUpdate [−][src]
pub trait CacheUpdate {
type Output;
fn update<'life0, 'life1, 'async_trait>(
&'life0 mut self,
__arg1: &'life1 Cache
) -> Pin<Box<dyn Future<Output = Option<Self::Output>> + Send + 'async_trait>>
where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait;
}
Expand description
Trait used for updating the cache with a type.
This may be implemented on a type and used to update the cache via
Cache::update
.
Info: You may not access the fields of the cache, as they are public for the crate only.
Examples
Creating a custom struct implementation to update the cache with:
ⓘ
use serde_json::json;
use serenity::{
cache::{Cache, CacheUpdate},
model::{
id::UserId,
user::User,
},
prelude::RwLock,
};
use std::{
collections::hash_map::Entry,
sync::Arc,
};
// For example, an update to the user's record in the database was
// published to a pubsub channel.
struct DatabaseUserUpdate {
user_avatar: Option<String>,
user_discriminator: u16,
user_id: UserId,
user_is_bot: bool,
user_name: String,
}
#[serenity::async_trait]
impl CacheUpdate for DatabaseUserUpdate {
// A copy of the old user's data, if it existed in the cache.
type Output = User;
async fn update(&mut self, cache: &Cache) -> Option<Self::Output> {
// If an entry for the user already exists, update its fields.
match cache.users.entry(self.user_id) {
Entry::Occupied(entry) => {
let user = entry.get();
let old_user = user.clone();
user.bot = self.user_is_bot;
user.discriminator = self.user_discriminator;
user.id = self.user_id;
if user.avatar != self.user_avatar {
user.avatar = self.user_avatar.clone();
}
if user.name != self.user_name {
user.name = self.user_name.clone();
}
// Return the old copy for the user's sake.
Some(old_user)
},
Entry::Vacant(entry) => {
// We can convert a [`serde_json::Value`] to a User for test
// purposes.
let user = serde_json::from_value::<User>(json!({
"id": self.user_id,
"avatar": self.user_avatar.clone(),
"bot": self.user_is_bot,
"discriminator": self.user_discriminator,
"username": self.user_name.clone(),
})).expect("Error making user");
entry.insert(user);
// There was no old copy, so return None.
None
},
}
}
}
// Create an instance of the cache.
let mut cache = Cache::new();
// This is a sample pubsub message that you might receive from your
// database.
let mut update_message = DatabaseUserUpdate {
user_avatar: None,
user_discriminator: 6082,
user_id: UserId(379740138303127564),
user_is_bot: true,
user_name: "TofuBot".to_owned(),
};
// Update the cache with the message.
cache.update(&mut update_message).await;