LCOV - code coverage report
Current view: top level - proxy/src/cache - common.rs (source / functions) Coverage Total Hit
Test: 42f947419473a288706e86ecdf7c2863d760d5d7.info Lines: 100.0 % 36 36
Test Date: 2024-08-02 21:34:27 Functions: 57.1 % 21 12

            Line data    Source code
       1              : use std::ops::{Deref, DerefMut};
       2              : 
       3              : /// A generic trait which exposes types of cache's key and value,
       4              : /// as well as the notion of cache entry invalidation.
       5              : /// This is useful for [`Cached`].
       6              : pub trait Cache {
       7              :     /// Entry's key.
       8              :     type Key;
       9              : 
      10              :     /// Entry's value.
      11              :     type Value;
      12              : 
      13              :     /// Used for entry invalidation.
      14              :     type LookupInfo<Key>;
      15              : 
      16              :     /// Invalidate an entry using a lookup info.
      17              :     /// We don't have an empty default impl because it's error-prone.
      18              :     fn invalidate(&self, _: &Self::LookupInfo<Self::Key>);
      19              : }
      20              : 
      21              : impl<C: Cache> Cache for &C {
      22              :     type Key = C::Key;
      23              :     type Value = C::Value;
      24              :     type LookupInfo<Key> = C::LookupInfo<Key>;
      25              : 
      26            8 :     fn invalidate(&self, info: &Self::LookupInfo<Self::Key>) {
      27            8 :         C::invalidate(self, info)
      28            8 :     }
      29              : }
      30              : 
      31              : /// Wrapper for convenient entry invalidation.
      32              : pub struct Cached<C: Cache, V = <C as Cache>::Value> {
      33              :     /// Cache + lookup info.
      34              :     pub token: Option<(C, C::LookupInfo<C::Key>)>,
      35              : 
      36              :     /// The value itself.
      37              :     pub value: V,
      38              : }
      39              : 
      40              : impl<C: Cache, V> Cached<C, V> {
      41              :     /// Place any entry into this wrapper; invalidation will be a no-op.
      42           24 :     pub fn new_uncached(value: V) -> Self {
      43           24 :         Self { token: None, value }
      44           24 :     }
      45              : 
      46            6 :     pub fn take_value(self) -> (Cached<C, ()>, V) {
      47            6 :         (
      48            6 :             Cached {
      49            6 :                 token: self.token,
      50            6 :                 value: (),
      51            6 :             },
      52            6 :             self.value,
      53            6 :         )
      54            6 :     }
      55              : 
      56           20 :     pub fn map<U>(self, f: impl FnOnce(V) -> U) -> Cached<C, U> {
      57           20 :         Cached {
      58           20 :             token: self.token,
      59           20 :             value: f(self.value),
      60           20 :         }
      61           20 :     }
      62              : 
      63              :     /// Drop this entry from a cache if it's still there.
      64           10 :     pub fn invalidate(self) -> V {
      65           10 :         if let Some((cache, info)) = &self.token {
      66            8 :             cache.invalidate(info);
      67            8 :         }
      68           10 :         self.value
      69           10 :     }
      70              : 
      71              :     /// Tell if this entry is actually cached.
      72           36 :     pub fn cached(&self) -> bool {
      73           36 :         self.token.is_some()
      74           36 :     }
      75              : }
      76              : 
      77              : impl<C: Cache, V> Deref for Cached<C, V> {
      78              :     type Target = V;
      79              : 
      80            6 :     fn deref(&self) -> &Self::Target {
      81            6 :         &self.value
      82            6 :     }
      83              : }
      84              : 
      85              : impl<C: Cache, V> DerefMut for Cached<C, V> {
      86           52 :     fn deref_mut(&mut self) -> &mut Self::Target {
      87           52 :         &mut self.value
      88           52 :     }
      89              : }
        

Generated by: LCOV version 2.1-beta