rive_cache_inmemory/
lib.rs1#![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#[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 pub fn new() -> Self {
52 Self::default()
53 }
54
55 pub fn new_with_config(config: Config) -> Self {
60 Self {
61 config,
62 ..Default::default()
63 }
64 }
65
66 pub const fn builder() -> InMemoryCacheBuilder {
68 InMemoryCacheBuilder::new()
69 }
70
71 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 pub const fn stats(&self) -> InMemoryCacheStats {
95 InMemoryCacheStats::new(self)
96 }
97
98 pub const fn iter(&self) -> InMemoryCacheIter {
114 InMemoryCacheIter::new(self)
115 }
116
117 pub fn user(&self, id: &str) -> Option<Reference<String, User>> {
119 self.users.get(id).map(Reference::new)
120 }
121
122 pub fn server(&self, id: &str) -> Option<Reference<String, Server>> {
124 self.servers.get(id).map(Reference::new)
125 }
126
127 pub fn channel(&self, id: &str) -> Option<Reference<String, Channel>> {
129 self.channels.get(id).map(Reference::new)
130 }
131
132 pub fn message(&self, id: &str) -> Option<Reference<String, Message>> {
134 self.messages.get(id).map(Reference::new)
135 }
136
137 pub fn emoji(&self, id: &str) -> Option<Reference<String, Emoji>> {
139 self.emojis.get(id).map(Reference::new)
140 }
141
142 pub fn member(&self, id: &MemberCompositeKey) -> Option<Reference<MemberCompositeKey, Member>> {
146 self.members.get(id).map(Reference::new)
147 }
148
149 pub fn update(&self, event: &impl CacheUpdate) {
151 event.update(self);
152 }
153}