Skip to content

Commit 36d4860

Browse files
committed
perf: derive filters from Preferences instead of parsing cookie twice
1 parent 28605cc commit 36d4860

4 files changed

Lines changed: 23 additions & 21 deletions

File tree

src/post.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@ use crate::config::get_setting;
66
use crate::server::RequestExt;
77
use crate::subreddit::{can_access_quarantine, quarantine};
88
use crate::utils::{
9-
error, format_num, get_filters, nsfw_landing, param, parse_post, rewrite_emotes, setting, template, time, val, Author, Awards, Comment, Flair, FlairPart, Post, Preferences,
9+
error, format_num, nsfw_landing, param, parse_post, rewrite_emotes, setting, template, time, val, Author, Awards, Comment, Flair, FlairPart, Post, Preferences,
1010
};
1111
use hyper::{Body, Request, Response};
1212

1313
use askama::Template;
1414
use regex::Regex;
15-
use std::collections::{HashMap, HashSet};
15+
use std::collections::HashSet;
1616
use std::sync::LazyLock;
1717

1818
// STRUCTS
@@ -79,13 +79,13 @@ pub async fn item(req: Request<Body>) -> Result<Response<Body>, String> {
7979
None => String::new(),
8080
};
8181

82-
let query_string = format!("q={query_body}&type=comment");
83-
let form = url::form_urlencoded::parse(query_string.as_bytes()).collect::<HashMap<_, _>>();
84-
let query = form.get("q").unwrap().clone().to_string();
82+
let query = query_body;
8583

84+
let prefs = Preferences::new(&req);
85+
let filters: HashSet<String> = prefs.filters.iter().cloned().collect();
8686
let comments = match query.as_str() {
87-
"" => parse_comments(&response[1], &post.permalink, &post.author.name, highlighted_comment, &get_filters(&req), &req),
88-
_ => query_comments(&response[1], &post.permalink, &post.author.name, highlighted_comment, &get_filters(&req), &query, &req),
87+
"" => parse_comments(&response[1], &post.permalink, &post.author.name, highlighted_comment, &filters, &req),
88+
_ => query_comments(&response[1], &post.permalink, &post.author.name, highlighted_comment, &filters, &query, &req),
8989
};
9090

9191
// Use the Post and Comment structs to generate a website to show users
@@ -94,7 +94,7 @@ pub async fn item(req: Request<Body>) -> Result<Response<Body>, String> {
9494
post,
9595
url_without_query: url.clone().trim_end_matches(&format!("?q={query}&type=comment")).to_string(),
9696
sort,
97-
prefs: Preferences::new(&req),
97+
prefs,
9898
single_thread,
9999
url: req_url,
100100
comment_query: query,

src/search.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#![allow(clippy::cmp_owned)]
22

33
// CRATES
4-
use crate::utils::{self, catch_random, error, filter_posts, format_num, format_url, get_filters, param, redirect, setting, template, val, Post, Preferences};
4+
use crate::utils::{self, catch_random, error, filter_posts, format_num, format_url, param, redirect, setting, template, val, Post, Preferences};
55
use crate::{
66
client::json,
77
server::RequestExt,
@@ -93,7 +93,8 @@ pub async fn find(req: Request<Body>) -> Result<Response<Body>, String> {
9393
let typed = param(&path, "type").unwrap_or_default();
9494

9595
let sort = param(&path, "sort").unwrap_or_else(|| "relevance".to_string());
96-
let filters = get_filters(&req);
96+
let prefs = Preferences::new(&req);
97+
let filters: std::collections::HashSet<String> = prefs.filters.iter().cloned().collect();
9798

9899
// If search is not restricted to this subreddit, show other subreddits in search results
99100
let subreddits = if param(&path, "restrict_sr").is_none() {
@@ -121,7 +122,7 @@ pub async fn find(req: Request<Body>) -> Result<Response<Body>, String> {
121122
restrict_sr: param(&path, "restrict_sr").unwrap_or_default(),
122123
typed,
123124
},
124-
prefs: Preferences::new(&req),
125+
prefs,
125126
url,
126127
is_filtered: true,
127128
all_posts_filtered: false,
@@ -147,7 +148,7 @@ pub async fn find(req: Request<Body>) -> Result<Response<Body>, String> {
147148
restrict_sr: param(&path, "restrict_sr").unwrap_or_default(),
148149
typed,
149150
},
150-
prefs: Preferences::new(&req),
151+
prefs,
151152
url,
152153
is_filtered: false,
153154
all_posts_filtered,

src/subreddit.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33
use crate::{config, utils};
44
// CRATES
55
use crate::utils::{
6-
catch_random, error, filter_posts, format_num, format_url, get_filters, info, nsfw_landing, param, redirect, rewrite_urls, setting, template, val, Post, Preferences,
7-
Subreddit,
6+
catch_random, error, filter_posts, format_num, format_url, info, nsfw_landing, param, redirect, rewrite_urls, setting, template, val, Post, Preferences, Subreddit,
87
};
98
use crate::{client::json, server::RequestExt, server::ResponseExt};
109
use askama::Template;
@@ -144,7 +143,8 @@ pub async fn community(req: Request<Body>) -> Result<Response<Body>, String> {
144143
let path = format!("/r/{}/{sort}.json?{}{params}", sub_name.replace('+', "%2B"), req.uri().query().unwrap_or_default());
145144
let url = String::from(req.uri().path_and_query().map_or("", |val| val.as_str()));
146145
let redirect_url = url[1..].replace('?', "%3F").replace('&', "%26").replace('+', "%2B");
147-
let filters = get_filters(&req);
146+
let prefs = Preferences::new(&req);
147+
let filters: std::collections::HashSet<String> = prefs.filters.iter().cloned().collect();
148148

149149
// If all requested subs are filtered, we don't need to fetch posts.
150150
if sub_name.split('+').all(|s| filters.contains(s)) {
@@ -153,7 +153,7 @@ pub async fn community(req: Request<Body>) -> Result<Response<Body>, String> {
153153
posts: Vec::new(),
154154
sort: (sort, param(&path, "t").unwrap_or_default()),
155155
ends: (param(&path, "after").unwrap_or_default(), String::new()),
156-
prefs: Preferences::new(&req),
156+
prefs,
157157
url,
158158
redirect_url,
159159
is_filtered: true,
@@ -176,7 +176,7 @@ pub async fn community(req: Request<Body>) -> Result<Response<Body>, String> {
176176
posts,
177177
sort: (sort, param(&path, "t").unwrap_or_default()),
178178
ends: (param(&path, "after").unwrap_or_default(), after),
179-
prefs: Preferences::new(&req),
179+
prefs,
180180
url,
181181
redirect_url,
182182
is_filtered: false,

src/user.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// CRATES
44
use crate::client::json;
55
use crate::server::RequestExt;
6-
use crate::utils::{error, filter_posts, format_url, get_filters, nsfw_landing, param, setting, template, Post, Preferences, User};
6+
use crate::utils::{error, filter_posts, format_url, nsfw_landing, param, setting, template, Post, Preferences, User};
77
use crate::{config, utils};
88
use askama::Template;
99
use chrono::DateTime;
@@ -62,15 +62,16 @@ pub async fn profile(req: Request<Body>) -> Result<Response<Body>, String> {
6262
return Ok(nsfw_landing(req, req_url).await.unwrap_or_default());
6363
}
6464

65-
let filters = get_filters(&req);
65+
let prefs = Preferences::new(&req);
66+
let filters: std::collections::HashSet<String> = prefs.filters.iter().cloned().collect();
6667
if filters.contains(&["u_", &username].concat()) {
6768
Ok(template(&UserTemplate {
6869
user,
6970
posts: Vec::new(),
7071
sort: (sort, param(&path, "t").unwrap_or_default()),
7172
ends: (param(&path, "after").unwrap_or_default(), String::new()),
7273
listing,
73-
prefs: Preferences::new(&req),
74+
prefs,
7475
url,
7576
redirect_url,
7677
is_filtered: true,
@@ -91,7 +92,7 @@ pub async fn profile(req: Request<Body>) -> Result<Response<Body>, String> {
9192
sort: (sort, param(&path, "t").unwrap_or_default()),
9293
ends: (param(&path, "after").unwrap_or_default(), after),
9394
listing,
94-
prefs: Preferences::new(&req),
95+
prefs,
9596
url,
9697
redirect_url,
9798
is_filtered: false,

0 commit comments

Comments
 (0)