rive_cache_inmemory/
lib.rs

1#![doc = include_str!("../README.md")]
2
3mod builder;
4mod config;
5mod iter;
6mod patch;
7mod reference;
8mod remove;
9mod stats;
10mod update;
11mod util;
12
13pub use builder::InMemoryCacheBuilder;
14pub use config::Config;
15pub use iter::{InMemoryCacheIter, ResourceIter};
16pub use reference::IterReference;
17pub use reference::Reference;
18pub use stats::InMemoryCacheStats;
19
20use dashmap::DashMap;
21use rive_models::{
22    channel::Channel,
23    emoji::Emoji,
24    member::{Member, MemberCompositeKey},
25    message::Message,
26    server::Server,
27    user::User,
28};
29use update::CacheUpdate;
30
31/// An in-memory cache of Revolt data.
32///
33/// To use a cache instance in multiple tasks, consider wrapping it in an
34/// [`std::sync::Arc`] or [`std::rc::Rc`].
35#[derive(Debug, Default)]
36pub struct InMemoryCache {
37    config: Config,
38    users: DashMap<String, User>,
39    servers: DashMap<String, Server>,
40    channels: DashMap<String, Channel>,
41    messages: DashMap<String, Message>,
42    emojis: DashMap<String, Emoji>,
43    members: DashMap<MemberCompositeKey, Member>,
44}
45
46impl InMemoryCache {
47    /// Create new [`InMemoryCache`] instance with default [`Config`].
48    ///
49    /// [`InMemoryCache`]: crate::InMemoryCache
50    /// [`Config`]: crate::Config
51    pub fn new() -> Self {
52        Self::default()
53    }
54
55    /// Create new [`InMemoryCache`] instance with provided [`Config`].
56    ///
57    /// [`InMemoryCache`]: crate::InMemoryCache
58    /// [`Config`]: crate::Config
59    pub fn new_with_config(config: Config) -> Self {
60        Self {
61            config,
62            ..Default::default()
63        }
64    }
65
66    /// Create a new builder to configure and construct an in-memory cache.
67    pub const fn builder() -> InMemoryCacheBuilder {
68        InMemoryCacheBuilder::new()
69    }
70
71    /// Clear the cache.
72    pub fn clear(&self) {
73        self.users.clear();
74        self.servers.clear();
75        self.channels.clear();
76        self.messages.clear();
77        self.emojis.clear();
78        self.members.clear();
79    }
80
81    /// Create an interface for retrieving cache statistics.
82    ///
83    /// Example:
84    ///
85    /// ```no_run
86    /// use rive_cache_inmemory::InMemoryCache;
87    ///
88    /// let cache = InMemoryCache::new();
89    ///
90    /// // later in the code...
91    /// let messages = cache.stats().messages();
92    /// println!("messages count: {messages}");
93    /// ```
94    pub const fn stats(&self) -> InMemoryCacheStats {
95        InMemoryCacheStats::new(self)
96    }
97
98    /// Create an interface for iterating over the various resources in the
99    /// cache.
100    ///
101    /// Example:
102    ///
103    /// ```no_run
104    /// use rive_cache_inmemory::InMemoryCache;
105    ///
106    /// let cache = InMemoryCache::new();
107    ///
108    /// // later in the code...
109    /// for user in cache.iter().users() {
110    ///     println!("{}: {}#{}", user.id, user.username, user.discriminator);
111    /// }
112    /// ```
113    pub const fn iter(&self) -> InMemoryCacheIter {
114        InMemoryCacheIter::new(self)
115    }
116
117    /// Get a user by ID.
118    pub fn user(&self, id: &str) -> Option<Reference<String, User>> {
119        self.users.get(id).map(Reference::new)
120    }
121
122    /// Get a server by ID.
123    pub fn server(&self, id: &str) -> Option<Reference<String, Server>> {
124        self.servers.get(id).map(Reference::new)
125    }
126
127    /// Get a channel by ID.
128    pub fn channel(&self, id: &str) -> Option<Reference<String, Channel>> {
129        self.channels.get(id).map(Reference::new)
130    }
131
132    /// Get a message by ID.
133    pub fn message(&self, id: &str) -> Option<Reference<String, Message>> {
134        self.messages.get(id).map(Reference::new)
135    }
136
137    /// Get an emoji by ID.
138    pub fn emoji(&self, id: &str) -> Option<Reference<String, Emoji>> {
139        self.emojis.get(id).map(Reference::new)
140    }
141
142    /// Get a member by [`MemberCompositeKey`].
143    ///
144    /// [`MemberCompositeKey`]: rive_models::member::MemberCompositeKey
145    pub fn member(&self, id: &MemberCompositeKey) -> Option<Reference<MemberCompositeKey, Member>> {
146        self.members.get(id).map(Reference::new)
147    }
148
149    /// Update the cache with an incoming event.
150    pub fn update(&self, event: &impl CacheUpdate) {
151        event.update(self);
152    }
153}