[][src]Trait serenity::cache::CacheUpdate

pub trait CacheUpdate {
    type Output;
    fn update(&mut self, _: &mut Cache) -> Option<Self::Output>;
}

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.

Examples

Creating a custom struct implementation to update the cache with:

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,
}

impl CacheUpdate for DatabaseUserUpdate {
    // A copy of the old user's data, if it existed in the cache.
    type Output = User;

    fn update(&mut self, cache: &mut 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 mut writer = user.write();
                let old = writer.clone();

                writer.bot = self.user_is_bot;
                writer.discriminator = self.user_discriminator;
                writer.id = self.user_id;

                if writer.avatar != self.user_avatar {
                    writer.avatar = self.user_avatar.clone();
                }

                if writer.name != self.user_name {
                    writer.name = self.user_name.clone();
                }

                // Return the old copy for the user's sake.
                Some(old)
            },
            Entry::Vacant(entry) => {
                entry.insert(Arc::new(RwLock::new(User {
                    id: self.user_id,
                    avatar: self.user_avatar.clone(),
                    bot: self.user_is_bot,
                    discriminator: self.user_discriminator,
                    name: self.user_name.clone(),
                })));

                // 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);

Associated Types

The return type of an update.

If there is nothing to return, specify this type as an unit (()).

Required Methods

Updates the cache with the implementation.

Implementors

impl CacheUpdate for ChannelCreateEvent
[src]

impl CacheUpdate for ChannelDeleteEvent
[src]

impl CacheUpdate for ChannelPinsUpdateEvent
[src]

impl CacheUpdate for ChannelRecipientAddEvent
[src]

impl CacheUpdate for ChannelRecipientRemoveEvent
[src]

impl CacheUpdate for ChannelUpdateEvent
[src]

impl CacheUpdate for GuildCreateEvent
[src]

impl CacheUpdate for GuildDeleteEvent
[src]

impl CacheUpdate for GuildEmojisUpdateEvent
[src]

impl CacheUpdate for GuildMemberAddEvent
[src]

impl CacheUpdate for GuildMemberRemoveEvent
[src]

impl CacheUpdate for GuildMemberUpdateEvent
[src]

impl CacheUpdate for GuildMembersChunkEvent
[src]

impl CacheUpdate for GuildRoleCreateEvent
[src]

impl CacheUpdate for GuildRoleDeleteEvent
[src]

impl CacheUpdate for GuildRoleUpdateEvent
[src]

impl CacheUpdate for GuildUnavailableEvent
[src]

impl CacheUpdate for GuildUpdateEvent
[src]

impl CacheUpdate for MessageCreateEvent
[src]

The oldest message, if the channel's message cache was already full.

impl CacheUpdate for MessageUpdateEvent
[src]

impl CacheUpdate for PresenceUpdateEvent
[src]

impl CacheUpdate for PresencesReplaceEvent
[src]

impl CacheUpdate for ReadyEvent
[src]

impl CacheUpdate for UserUpdateEvent
[src]

impl CacheUpdate for VoiceStateUpdateEvent
[src]