ddotthomas commited on
Commit
80e950d
·
1 Parent(s): a47e285

refactor: changed Cookie to use Cow to facilitate using references when building

Browse files
src/models/server_models.rs CHANGED
@@ -1,5 +1,7 @@
1
  //! This module provides the models to parse cookies and search parameters from the search
2
  //! engine website.
 
 
3
  use serde::Deserialize;
4
 
5
  use super::parser_models::Style;
@@ -23,23 +25,23 @@ pub struct SearchParams {
23
  #[derive(Deserialize)]
24
  pub struct Cookie<'a> {
25
  /// It stores the theme name used in the website.
26
- pub theme: &'a str,
27
  /// It stores the colorscheme name used for the website theme.
28
- pub colorscheme: &'a str,
29
  /// It stores the user selected upstream search engines selected from the UI.
30
- pub engines: Vec<String>,
31
  /// It stores the user selected safe search level from the UI.
32
  pub safe_search_level: u8,
33
  }
34
 
35
  impl<'a> Cookie<'a> {
36
  /// server_models::Cookie contructor function
37
- pub fn build(style: &'a Style, mut engines: Vec<String>, safe_search_level: u8) -> Self {
38
  engines.sort();
39
  Self {
40
- theme: &style.theme,
41
- colorscheme: &style.colorscheme,
42
- engines,
43
  safe_search_level,
44
  }
45
  }
 
1
  //! This module provides the models to parse cookies and search parameters from the search
2
  //! engine website.
3
+ use std::borrow::Cow;
4
+
5
  use serde::Deserialize;
6
 
7
  use super::parser_models::Style;
 
25
  #[derive(Deserialize)]
26
  pub struct Cookie<'a> {
27
  /// It stores the theme name used in the website.
28
+ pub theme: Cow<'a, str>,
29
  /// It stores the colorscheme name used for the website theme.
30
+ pub colorscheme: Cow<'a, str>,
31
  /// It stores the user selected upstream search engines selected from the UI.
32
+ pub engines: Cow<'a, Vec<Cow<'a, str>>>,
33
  /// It stores the user selected safe search level from the UI.
34
  pub safe_search_level: u8,
35
  }
36
 
37
  impl<'a> Cookie<'a> {
38
  /// server_models::Cookie contructor function
39
+ pub fn build(style: &'a Style, mut engines: Vec<Cow<'a, str>>, safe_search_level: u8) -> Self {
40
  engines.sort();
41
  Self {
42
+ theme: Cow::Borrowed(&style.theme),
43
+ colorscheme: Cow::Borrowed(&style.colorscheme),
44
+ engines: Cow::Owned(engines),
45
  safe_search_level,
46
  }
47
  }
src/server/routes/search.rs CHANGED
@@ -14,6 +14,7 @@ use crate::{
14
  use actix_web::{get, http::header::ContentType, web, HttpRequest, HttpResponse};
15
  use regex::Regex;
16
  use std::{
 
17
  fs::File,
18
  io::{BufRead, BufReader, Read},
19
  };
@@ -48,37 +49,30 @@ pub async fn search(
48
  .finish());
49
  }
50
 
51
- // Closure to build a server_models::Cookie capturing local references
52
- let build_cookie = || {
53
- server_models::Cookie::build(
54
- &config.style,
55
- config
56
- .upstream_search_engines
57
- .clone()
58
- .into_iter()
59
- .filter_map(|engine_map| engine_map.1.then_some(engine_map.0))
60
- .collect(),
61
- config.safe_search,
62
- )
63
- };
64
-
65
  let cookie = req.cookie("appCookie");
66
 
67
  // Get search settings using the user's cookie or from the server's config
68
- let mut search_settings: server_models::Cookie<'_> = match cookie {
69
- Some(ref cookie_value) => {
70
- match serde_json::from_str(cookie_value.value()) {
71
- Ok(cookie) => cookie,
72
- // If there's an issue parsing the cookie's value, default to the config
73
- Err(_) => build_cookie(),
74
- }
75
- }
76
- // If there's no cookie saved, use the server's config
77
- None => build_cookie(),
78
- };
 
 
 
 
79
 
80
- search_settings.safe_search_level =
81
- get_safesearch_level(&params.safesearch, config.safe_search);
 
 
 
82
 
83
  // Closure wrapping the results function capturing local references
84
  let get_results = |page| results(&config, &cache, query, page, &search_settings);
@@ -178,8 +172,7 @@ async fn results(
178
  config.debug,
179
  &search_settings
180
  .engines
181
- .clone()
182
- .into_iter()
183
  .filter_map(|engine| EngineHandler::new(&engine).ok())
184
  .collect::<Vec<EngineHandler>>(),
185
  config.request_timeout,
@@ -233,23 +226,21 @@ fn is_match_from_filter_list(
233
  Ok(false)
234
  }
235
 
236
- /// A helper function which returns the safe search level based on the url params
237
- /// and cookie value.
 
238
  ///
239
  /// # Argurments
240
  ///
241
- /// * `safe_search` - Safe search level from the url.
242
- /// * `cookie` - User's cookie
243
- /// * `default` - Safe search level to fall back to
244
- fn get_safesearch_level(safe_search: &Option<u8>, default: u8) -> u8 {
245
- match safe_search {
246
- Some(ss) => {
247
- if *ss >= 3 {
248
- default
249
- } else {
250
- *ss
251
- }
252
  }
253
- None => default,
254
  }
255
  }
 
14
  use actix_web::{get, http::header::ContentType, web, HttpRequest, HttpResponse};
15
  use regex::Regex;
16
  use std::{
17
+ borrow::Cow,
18
  fs::File,
19
  io::{BufRead, BufReader, Read},
20
  };
 
49
  .finish());
50
  }
51
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52
  let cookie = req.cookie("appCookie");
53
 
54
  // Get search settings using the user's cookie or from the server's config
55
+ let mut search_settings: server_models::Cookie<'_> = cookie
56
+ .and_then(|cookie_value| serde_json::from_str(cookie_value.value()).ok())
57
+ .unwrap_or_else(|| {
58
+ server_models::Cookie::build(
59
+ &config.style,
60
+ config
61
+ .upstream_search_engines
62
+ .iter()
63
+ .filter_map(|(engine, enabled)| {
64
+ enabled.then_some(Cow::Borrowed(engine.as_str()))
65
+ })
66
+ .collect(),
67
+ config.safe_search,
68
+ )
69
+ });
70
 
71
+ get_safesearch_level(
72
+ &mut search_settings.safe_search_level,
73
+ &params.safesearch,
74
+ config.safe_search,
75
+ );
76
 
77
  // Closure wrapping the results function capturing local references
78
  let get_results = |page| results(&config, &cache, query, page, &search_settings);
 
172
  config.debug,
173
  &search_settings
174
  .engines
175
+ .iter()
 
176
  .filter_map(|engine| EngineHandler::new(&engine).ok())
177
  .collect::<Vec<EngineHandler>>(),
178
  config.request_timeout,
 
226
  Ok(false)
227
  }
228
 
229
+ /// A helper function to modify the safe search level based on the url params.
230
+ /// The `safe_search` is the one in the user's cookie or
231
+ /// the default set by the server config if the cookie was missing.
232
  ///
233
  /// # Argurments
234
  ///
235
+ /// * `url_level` - Safe search level from the url.
236
+ /// * `safe_search` - User's cookie, or the safe search level set by the server
237
+ /// * `config_level` - Safe search level to fall back to
238
+ fn get_safesearch_level(safe_search: &mut u8, url_level: &Option<u8>, config_level: u8) {
239
+ if let Some(search_level) = url_level {
240
+ if *search_level >= 3 {
241
+ *safe_search = config_level
242
+ } else {
243
+ *safe_search = *search_level;
 
 
244
  }
 
245
  }
246
  }