Zsombor Gegesy commited on
Commit
1e7805c
1 Parent(s): 76795c4

Rename features, make the memory-cache the default

Browse files
Files changed (4) hide show
  1. Cargo.toml +4 -3
  2. src/cache/cacher.rs +13 -12
  3. src/cache/error.rs +5 -3
  4. src/cache/mod.rs +1 -1
Cargo.toml CHANGED
@@ -67,7 +67,8 @@ rpath = false
67
  strip = "debuginfo"
68
 
69
  [features]
70
- default = ["in_memory_cache", "redis"]
71
  dhat-heap = ["dep:dhat"]
72
- in_memory_cache = ["dep:mini-moka"]
73
- redis = ["dep:redis"]
 
 
67
  strip = "debuginfo"
68
 
69
  [features]
70
+ default = ["memory-cache"]
71
  dhat-heap = ["dep:dhat"]
72
+ memory-cache = ["dep:mini-moka"]
73
+ redis-cache = ["dep:redis"]
74
+ hybrid-cache = ["memory-cache", "redis-cache"]
src/cache/cacher.rs CHANGED
@@ -2,15 +2,16 @@
2
  //! from the upstream search engines in a json format.
3
 
4
  use error_stack::Report;
5
- #[cfg(feature = "in_memory_cache")]
6
  use mini_moka::sync::Cache as MokaCache;
 
7
  use std::time::Duration;
8
  use tokio::sync::Mutex;
9
 
10
  use crate::{config::parser::Config, results::aggregation_models::SearchResults};
11
 
12
  use super::error::PoolError;
13
- #[cfg(feature = "redis")]
14
  use super::redis_cacher::RedisCache;
15
 
16
  /// Different implementations for caching, currently it is possible to cache in-memory or in Redis.
@@ -18,10 +19,10 @@ use super::redis_cacher::RedisCache;
18
  pub enum Cache {
19
  /// Caching is disabled
20
  Disabled,
21
- #[cfg(feature = "redis")]
22
  /// Encapsulates the Redis based cache
23
  Redis(RedisCache),
24
- #[cfg(feature = "in_memory_cache")]
25
  /// Contains the in-memory cache.
26
  InMemory(MokaCache<String, SearchResults>),
27
  }
@@ -29,7 +30,7 @@ pub enum Cache {
29
  impl Cache {
30
  /// Builds the cache from the given configuration.
31
  pub async fn build(config: &Config) -> Self {
32
- #[cfg(feature = "redis")]
33
  if let Some(url) = &config.redis_url {
34
  log::info!("Using Redis running at {} for caching", &url);
35
  return Cache::new(
@@ -38,7 +39,7 @@ impl Cache {
38
  .expect("Redis cache configured"),
39
  );
40
  }
41
- #[cfg(feature = "in_memory_cache")]
42
  if config.in_memory_cache {
43
  log::info!("Using an in-memory cache");
44
  return Cache::new_in_memory();
@@ -48,13 +49,13 @@ impl Cache {
48
  }
49
 
50
  /// Creates a new cache, which wraps the given RedisCache.
51
- #[cfg(feature = "redis")]
52
  pub fn new(redis_cache: RedisCache) -> Self {
53
  Cache::Redis(redis_cache)
54
  }
55
 
56
  /// Creates an in-memory cache
57
- #[cfg(feature = "in_memory_cache")]
58
  pub fn new_in_memory() -> Self {
59
  let cache = MokaCache::builder()
60
  .max_capacity(1000)
@@ -71,13 +72,13 @@ impl Cache {
71
  pub async fn cached_json(&mut self, url: &str) -> Result<SearchResults, Report<PoolError>> {
72
  match self {
73
  Cache::Disabled => Err(Report::new(PoolError::MissingValue)),
74
- #[cfg(feature = "redis")]
75
  Cache::Redis(redis_cache) => {
76
  let json = redis_cache.cached_json(url).await?;
77
  Ok(serde_json::from_str::<SearchResults>(&json)
78
  .map_err(|_| PoolError::SerializationError)?)
79
  }
80
- #[cfg(feature = "in_memory_cache")]
81
  Cache::InMemory(in_memory) => match in_memory.get(&url.to_string()) {
82
  Some(res) => Ok(res),
83
  None => Err(Report::new(PoolError::MissingValue)),
@@ -99,13 +100,13 @@ impl Cache {
99
  ) -> Result<(), Report<PoolError>> {
100
  match self {
101
  Cache::Disabled => Ok(()),
102
- #[cfg(feature = "redis")]
103
  Cache::Redis(redis_cache) => {
104
  let json = serde_json::to_string(search_results)
105
  .map_err(|_| PoolError::SerializationError)?;
106
  redis_cache.cache_results(&json, url).await
107
  }
108
- #[cfg(feature = "in_memory_cache")]
109
  Cache::InMemory(cache) => {
110
  cache.insert(url.to_string(), search_results.clone());
111
  Ok(())
 
2
  //! from the upstream search engines in a json format.
3
 
4
  use error_stack::Report;
5
+ #[cfg(feature = "memory-cache")]
6
  use mini_moka::sync::Cache as MokaCache;
7
+ #[cfg(feature = "memory-cache")]
8
  use std::time::Duration;
9
  use tokio::sync::Mutex;
10
 
11
  use crate::{config::parser::Config, results::aggregation_models::SearchResults};
12
 
13
  use super::error::PoolError;
14
+ #[cfg(feature = "redis-cache")]
15
  use super::redis_cacher::RedisCache;
16
 
17
  /// Different implementations for caching, currently it is possible to cache in-memory or in Redis.
 
19
  pub enum Cache {
20
  /// Caching is disabled
21
  Disabled,
22
+ #[cfg(feature = "redis-cache")]
23
  /// Encapsulates the Redis based cache
24
  Redis(RedisCache),
25
+ #[cfg(feature = "memory-cache")]
26
  /// Contains the in-memory cache.
27
  InMemory(MokaCache<String, SearchResults>),
28
  }
 
30
  impl Cache {
31
  /// Builds the cache from the given configuration.
32
  pub async fn build(config: &Config) -> Self {
33
+ #[cfg(feature = "redis-cache")]
34
  if let Some(url) = &config.redis_url {
35
  log::info!("Using Redis running at {} for caching", &url);
36
  return Cache::new(
 
39
  .expect("Redis cache configured"),
40
  );
41
  }
42
+ #[cfg(feature = "memory-cache")]
43
  if config.in_memory_cache {
44
  log::info!("Using an in-memory cache");
45
  return Cache::new_in_memory();
 
49
  }
50
 
51
  /// Creates a new cache, which wraps the given RedisCache.
52
+ #[cfg(feature = "redis-cache")]
53
  pub fn new(redis_cache: RedisCache) -> Self {
54
  Cache::Redis(redis_cache)
55
  }
56
 
57
  /// Creates an in-memory cache
58
+ #[cfg(feature = "memory-cache")]
59
  pub fn new_in_memory() -> Self {
60
  let cache = MokaCache::builder()
61
  .max_capacity(1000)
 
72
  pub async fn cached_json(&mut self, url: &str) -> Result<SearchResults, Report<PoolError>> {
73
  match self {
74
  Cache::Disabled => Err(Report::new(PoolError::MissingValue)),
75
+ #[cfg(feature = "redis-cache")]
76
  Cache::Redis(redis_cache) => {
77
  let json = redis_cache.cached_json(url).await?;
78
  Ok(serde_json::from_str::<SearchResults>(&json)
79
  .map_err(|_| PoolError::SerializationError)?)
80
  }
81
+ #[cfg(feature = "memory-cache")]
82
  Cache::InMemory(in_memory) => match in_memory.get(&url.to_string()) {
83
  Some(res) => Ok(res),
84
  None => Err(Report::new(PoolError::MissingValue)),
 
100
  ) -> Result<(), Report<PoolError>> {
101
  match self {
102
  Cache::Disabled => Ok(()),
103
+ #[cfg(feature = "redis-cache")]
104
  Cache::Redis(redis_cache) => {
105
  let json = serde_json::to_string(search_results)
106
  .map_err(|_| PoolError::SerializationError)?;
107
  redis_cache.cache_results(&json, url).await
108
  }
109
+ #[cfg(feature = "memory-cache")]
110
  Cache::InMemory(cache) => {
111
  cache.insert(url.to_string(), search_results.clone());
112
  Ok(())
src/cache/error.rs CHANGED
@@ -2,26 +2,28 @@
2
  //! the redis server using an async connection pool.
3
  use std::fmt;
4
 
5
- #[cfg(feature = "redis")]
6
  use redis::RedisError;
7
 
8
  /// A custom error type used for handling redis async pool associated errors.
9
  #[derive(Debug)]
10
  pub enum PoolError {
11
  /// This variant handles all errors related to `RedisError`,
12
- #[cfg(feature = "redis")]
13
  RedisError(RedisError),
14
  /// This variant handles the errors which occurs when all the connections
15
  /// in the connection pool return a connection dropped redis error.
16
  PoolExhaustionWithConnectionDropError,
 
17
  SerializationError,
 
18
  MissingValue,
19
  }
20
 
21
  impl fmt::Display for PoolError {
22
  fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
23
  match self {
24
- #[cfg(feature = "redis")]
25
  PoolError::RedisError(redis_error) => {
26
  if let Some(detail) = redis_error.detail() {
27
  write!(f, "{}", detail)
 
2
  //! the redis server using an async connection pool.
3
  use std::fmt;
4
 
5
+ #[cfg(feature = "redis-cache")]
6
  use redis::RedisError;
7
 
8
  /// A custom error type used for handling redis async pool associated errors.
9
  #[derive(Debug)]
10
  pub enum PoolError {
11
  /// This variant handles all errors related to `RedisError`,
12
+ #[cfg(feature = "redis-cache")]
13
  RedisError(RedisError),
14
  /// This variant handles the errors which occurs when all the connections
15
  /// in the connection pool return a connection dropped redis error.
16
  PoolExhaustionWithConnectionDropError,
17
+ /// Whenever serialization or deserialization fails during communication with the cache.
18
  SerializationError,
19
+ /// Returned when the value is missing.
20
  MissingValue,
21
  }
22
 
23
  impl fmt::Display for PoolError {
24
  fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
25
  match self {
26
+ #[cfg(feature = "redis-cache")]
27
  PoolError::RedisError(redis_error) => {
28
  if let Some(detail) = redis_error.detail() {
29
  write!(f, "{}", detail)
src/cache/mod.rs CHANGED
@@ -3,5 +3,5 @@
3
 
4
  pub mod cacher;
5
  pub mod error;
6
- #[cfg(feature = "redis")]
7
  pub mod redis_cacher;
 
3
 
4
  pub mod cacher;
5
  pub mod error;
6
+ #[cfg(feature = "redis-cache")]
7
  pub mod redis_cacher;