LCOV - code coverage report
Current view: top level - proxy/src/cache - common.rs (source / functions) Coverage Total Hit
Test: 02e8c57acd6e2b986849f552ca30280d54699b79.info Lines: 100.0 % 30 30
Test Date: 2024-06-26 17:13:54 Functions: 68.8 % 16 11

            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              :     /// Drop this entry from a cache if it's still there.
      57           10 :     pub fn invalidate(self) -> V {
      58           10 :         if let Some((cache, info)) = &self.token {
      59            8 :             cache.invalidate(info);
      60            8 :         }
      61           10 :         self.value
      62           10 :     }
      63              : 
      64              :     /// Tell if this entry is actually cached.
      65           36 :     pub fn cached(&self) -> bool {
      66           36 :         self.token.is_some()
      67           36 :     }
      68              : }
      69              : 
      70              : impl<C: Cache, V> Deref for Cached<C, V> {
      71              :     type Target = V;
      72              : 
      73            6 :     fn deref(&self) -> &Self::Target {
      74            6 :         &self.value
      75            6 :     }
      76              : }
      77              : 
      78              : impl<C: Cache, V> DerefMut for Cached<C, V> {
      79           52 :     fn deref_mut(&mut self) -> &mut Self::Target {
      80           52 :         &mut self.value
      81           52 :     }
      82              : }
        

Generated by: LCOV version 2.1-beta