1use bitcode::__private::{
65 Buffer, Decoder, Encoder, Result, VariantDecoder, VariantEncoder, Vec, View,
66};
67use bitcode::{Decode, Encode};
68use core::num::NonZeroUsize;
69use smol_str::SmolStr;
70use std::fmt;
71use std::hash::{Hash, Hasher};
72use std::sync::Arc;
73
74#[derive(Debug, Eq, PartialEq, Hash, serde::Serialize)]
77struct CacheKeyInner {
78 parts: Vec<KeyPart>,
79 version: u32,
80 prefix: SmolStr,
81 #[serde(skip)]
84 content_size: usize,
85}
86
87#[derive(Clone, Debug, serde::Serialize)]
119#[serde(into = "CacheKeyInner")]
120pub struct CacheKey {
121 inner: Arc<CacheKeyInner>,
122}
123
124impl PartialEq for CacheKey {
125 fn eq(&self, other: &Self) -> bool {
126 Arc::ptr_eq(&self.inner, &other.inner) || self.inner == other.inner
128 }
129}
130
131impl Eq for CacheKey {}
132
133impl Hash for CacheKey {
134 fn hash<H: Hasher>(&self, state: &mut H) {
135 self.inner.hash(state);
136 }
137}
138
139impl From<CacheKey> for CacheKeyInner {
140 fn from(key: CacheKey) -> Self {
141 Arc::try_unwrap(key.inner).unwrap_or_else(|arc| (*arc).clone())
143 }
144}
145
146impl Clone for CacheKeyInner {
147 fn clone(&self) -> Self {
148 CacheKeyInner {
149 parts: self.parts.clone(),
150 version: self.version,
151 prefix: self.prefix.clone(),
152 content_size: self.content_size,
153 }
154 }
155}
156
157impl CacheKeyInner {
158 fn calculate_content_size(prefix: &SmolStr, parts: &[KeyPart]) -> usize {
163 let heap_size = |len: usize| len.saturating_sub(23);
164
165 heap_size(prefix.len())
166 + parts
167 .iter()
168 .map(|p| heap_size(p.key().len()) + p.value().map_or(0, |v| heap_size(v.len())))
169 .sum::<usize>()
170 }
171}
172
173impl fmt::Display for CacheKey {
174 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
175 if !self.inner.prefix.is_empty() {
177 write!(f, "{}:", self.inner.prefix)?;
178 }
179 if self.inner.version > 0 {
180 write!(f, "v{}:", self.inner.version)?;
181 }
182 for (i, part) in self.inner.parts.iter().enumerate() {
183 if i > 0 {
184 write!(f, "&")?;
185 }
186 write!(f, "{}", part)?;
187 }
188 Ok(())
189 }
190}
191
192impl Encode for CacheKey {
193 type Encoder = CacheKeyEncoder;
194}
195
196impl<'de> Decode<'de> for CacheKey {
197 type Decoder = CacheKeyDecoder<'de>;
198}
199
200#[doc(hidden)]
201#[derive(Default)]
202pub struct CacheKeyEncoder {
203 parts: <Vec<KeyPart> as Encode>::Encoder,
204 version: <u32 as Encode>::Encoder,
205 prefix: <str as Encode>::Encoder,
206}
207
208impl Encoder<CacheKey> for CacheKeyEncoder {
209 fn encode(&mut self, value: &CacheKey) {
210 self.parts.encode(&value.inner.parts);
211 self.version.encode(&value.inner.version);
212 self.prefix.encode(value.inner.prefix.as_str());
213 }
214}
215
216impl Buffer for CacheKeyEncoder {
217 fn collect_into(&mut self, out: &mut Vec<u8>) {
218 self.parts.collect_into(out);
219 self.version.collect_into(out);
220 self.prefix.collect_into(out);
221 }
222
223 fn reserve(&mut self, additional: NonZeroUsize) {
224 self.parts.reserve(additional);
225 self.version.reserve(additional);
226 self.prefix.reserve(additional);
227 }
228}
229
230#[doc(hidden)]
231#[derive(Default)]
232pub struct CacheKeyDecoder<'de> {
233 parts: <Vec<KeyPart> as Decode<'de>>::Decoder,
234 version: <u32 as Decode<'de>>::Decoder,
235 prefix: <&'de str as Decode<'de>>::Decoder,
236}
237
238impl<'de> View<'de> for CacheKeyDecoder<'de> {
239 fn populate(&mut self, input: &mut &'de [u8], length: usize) -> Result<()> {
240 self.parts.populate(input, length)?;
241 self.version.populate(input, length)?;
242 self.prefix.populate(input, length)?;
243 Ok(())
244 }
245}
246
247impl<'de> Decoder<'de, CacheKey> for CacheKeyDecoder<'de> {
248 fn decode(&mut self) -> CacheKey {
249 let prefix_str: &str = self.prefix.decode();
250 let prefix = SmolStr::new(prefix_str);
251 let parts: Vec<KeyPart> = self.parts.decode();
252 let content_size = CacheKeyInner::calculate_content_size(&prefix, &parts);
253 CacheKey {
254 inner: Arc::new(CacheKeyInner {
255 parts,
256 version: self.version.decode(),
257 prefix,
258 content_size,
259 }),
260 }
261 }
262}
263
264impl CacheKey {
265 pub fn parts(&self) -> impl Iterator<Item = &KeyPart> {
267 self.inner.parts.iter()
268 }
269
270 pub fn version(&self) -> u32 {
272 self.inner.version
273 }
274
275 pub fn prefix(&self) -> &str {
277 &self.inner.prefix
278 }
279
280 pub fn memory_size(&self) -> usize {
287 use std::mem::size_of;
288
289 let arc_overhead = 2 * size_of::<usize>() + size_of::<CacheKeyInner>();
291
292 let vec_overhead = self.inner.parts.len() * size_of::<KeyPart>();
294
295 let heap_strings = self.inner.content_size;
297
298 arc_overhead + vec_overhead + heap_strings
299 }
300
301 pub fn new(prefix: impl Into<SmolStr>, version: u32, parts: Vec<KeyPart>) -> Self {
309 let prefix = prefix.into();
310 let content_size = CacheKeyInner::calculate_content_size(&prefix, &parts);
311 CacheKey {
312 inner: Arc::new(CacheKeyInner {
313 parts,
314 version,
315 prefix,
316 content_size,
317 }),
318 }
319 }
320
321 pub fn from_str(key: &str, value: &str) -> Self {
325 let prefix = SmolStr::default();
326 let parts = vec![KeyPart::new(key, Some(value))];
327 let content_size = CacheKeyInner::calculate_content_size(&prefix, &parts);
328 CacheKey {
329 inner: Arc::new(CacheKeyInner {
330 parts,
331 version: 0,
332 prefix,
333 content_size,
334 }),
335 }
336 }
337
338 pub fn from_slice(parts: &[(&str, Option<&str>)]) -> Self {
342 let prefix = SmolStr::default();
343 let parts: Vec<KeyPart> = parts
344 .iter()
345 .map(|(key, value)| KeyPart::new(key, *value))
346 .collect();
347 let content_size = CacheKeyInner::calculate_content_size(&prefix, &parts);
348 CacheKey {
349 inner: Arc::new(CacheKeyInner {
350 parts,
351 version: 0,
352 prefix,
353 content_size,
354 }),
355 }
356 }
357}
358
359#[derive(Clone, Debug, Eq, PartialEq, Hash, serde::Serialize, serde::Deserialize)]
386pub struct KeyPart {
387 key: SmolStr,
388 value: Option<SmolStr>,
389}
390
391impl fmt::Display for KeyPart {
392 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
393 write!(f, "{}", self.key)?;
394 if let Some(ref value) = self.value {
395 write!(f, "={}", value)?;
396 }
397 Ok(())
398 }
399}
400
401impl Encode for KeyPart {
402 type Encoder = KeyPartEncoder;
403}
404
405impl<'de> Decode<'de> for KeyPart {
406 type Decoder = KeyPartDecoder<'de>;
407}
408
409#[doc(hidden)]
410#[derive(Default)]
411pub struct KeyPartEncoder {
412 key: <str as Encode>::Encoder,
413 value_variant: VariantEncoder<2>,
415 value_str: <str as Encode>::Encoder,
416}
417
418impl Encoder<KeyPart> for KeyPartEncoder {
419 fn encode(&mut self, value: &KeyPart) {
420 self.key.encode(value.key.as_str());
421 self.value_variant.encode(&(value.value.is_some() as u8));
423 if let Some(ref v) = value.value {
424 self.value_str.reserve(NonZeroUsize::MIN);
425 self.value_str.encode(v.as_str());
426 }
427 }
428}
429
430impl Buffer for KeyPartEncoder {
431 fn collect_into(&mut self, out: &mut Vec<u8>) {
432 self.key.collect_into(out);
433 self.value_variant.collect_into(out);
434 self.value_str.collect_into(out);
435 }
436
437 fn reserve(&mut self, additional: NonZeroUsize) {
438 self.key.reserve(additional);
439 self.value_variant.reserve(additional);
440 }
442}
443
444#[doc(hidden)]
445#[derive(Default)]
446pub struct KeyPartDecoder<'de> {
447 key: <&'de str as Decode<'de>>::Decoder,
448 value_variant: VariantDecoder<'de, 2, false>,
449 value_str: <&'de str as Decode<'de>>::Decoder,
450}
451
452impl<'de> View<'de> for KeyPartDecoder<'de> {
453 fn populate(&mut self, input: &mut &'de [u8], length: usize) -> Result<()> {
454 self.key.populate(input, length)?;
455 self.value_variant.populate(input, length)?;
456 let some_count = self.value_variant.length(1);
458 self.value_str.populate(input, some_count)?;
459 Ok(())
460 }
461}
462
463impl<'de> Decoder<'de, KeyPart> for KeyPartDecoder<'de> {
464 fn decode(&mut self) -> KeyPart {
465 let key_str: &str = self.key.decode();
466 let value = if self.value_variant.decode() != 0 {
467 let value_str: &str = self.value_str.decode();
468 Some(SmolStr::new(value_str))
469 } else {
470 None
471 };
472 KeyPart {
473 key: SmolStr::new(key_str),
474 value,
475 }
476 }
477}
478
479impl KeyPart {
480 pub fn new<K: AsRef<str>, V: AsRef<str>>(key: K, value: Option<V>) -> Self {
487 KeyPart {
488 key: SmolStr::new(key),
489 value: value.map(SmolStr::new),
490 }
491 }
492
493 pub fn key(&self) -> &str {
495 &self.key
496 }
497
498 pub fn value(&self) -> Option<&str> {
500 self.value.as_deref()
501 }
502}
503
504#[derive(Debug)]
520pub struct KeyParts<T: Sized> {
521 subject: T,
522 parts: Vec<KeyPart>,
523}
524
525impl<T> KeyParts<T> {
526 pub fn new(subject: T) -> Self {
528 KeyParts {
529 subject,
530 parts: Vec::new(),
531 }
532 }
533
534 pub fn push(&mut self, part: KeyPart) {
536 self.parts.push(part)
537 }
538
539 pub fn append(&mut self, parts: &mut Vec<KeyPart>) {
541 self.parts.append(parts)
542 }
543
544 pub fn into_cache_key(self) -> (T, CacheKey) {
548 let prefix = SmolStr::default();
549 let content_size = CacheKeyInner::calculate_content_size(&prefix, &self.parts);
550 (
551 self.subject,
552 CacheKey {
553 inner: Arc::new(CacheKeyInner {
554 version: 0,
555 prefix,
556 parts: self.parts,
557 content_size,
558 }),
559 },
560 )
561 }
562}