From 439467f7303c674f79da119aeef0e220b94bb8ff Mon Sep 17 00:00:00 2001 From: JMARyA Date: Sun, 29 Dec 2024 20:39:10 +0100 Subject: [PATCH] refactor --- build.rs | 4 ++-- src/auth/session.rs | 3 ++- src/auth/user.rs | 25 ++++++++++++++----------- src/format.rs | 7 +++++-- src/lib.rs | 2 +- src/page/mod.rs | 12 ++++++++---- src/request/api.rs | 2 ++ src/request/assets.rs | 10 +++++----- src/request/context.rs | 6 +----- src/request/mod.rs | 6 +++++- 10 files changed, 45 insertions(+), 32 deletions(-) diff --git a/build.rs b/build.rs index c1dd6fd..24382b4 100644 --- a/build.rs +++ b/build.rs @@ -5,7 +5,7 @@ fn main() { let url = "https://unpkg.com/htmx.org@2.0.4/dist/htmx.min.js"; let dest_path = Path::new("src/htmx.min.js"); - println!("Downloading htmx.min.js from {}", url); + println!("Downloading htmx.min.js from {url}"); let response = reqwest::blocking::get(url) .expect("Failed to send HTTP request") .error_for_status() @@ -13,7 +13,7 @@ fn main() { let content = response.bytes().expect("Failed to read response body"); - fs::write(&dest_path, &content).expect("Failed to write htmx.min.js to destination"); + fs::write(dest_path, &content).expect("Failed to write htmx.min.js to destination"); println!("cargo:rerun-if-changed=build.rs"); } diff --git a/src/auth/session.rs b/src/auth/session.rs index f7fa004..5ec5c1c 100644 --- a/src/auth/session.rs +++ b/src/auth/session.rs @@ -24,6 +24,7 @@ pub struct Session { pub kind: SessionKind, } +#[allow(clippy::upper_case_acronyms)] #[derive(Debug, Clone, Serialize, Deserialize, sqlx::Type)] #[sqlx(type_name = "session_kind", rename_all = "lowercase")] pub enum SessionKind { @@ -59,7 +60,7 @@ impl Sessions for User { } /// End a user session - async fn end_session(&self) -> () { + async fn end_session(&self) { sqlx::query("DELETE FROM user_session WHERE token = $1") .bind(&self.session) .execute(get_pg!()) diff --git a/src/auth/user.rs b/src/auth/user.rs index f5a5a00..8db3151 100644 --- a/src/auth/user.rs +++ b/src/auth/user.rs @@ -81,6 +81,7 @@ impl User { /// Change the password of a User /// /// Returns a Result indicating whether the password change was successful or not + #[must_use] pub async fn passwd(self, old: &str, new: &str) -> Result<(), ()> { if self.verify_pw(old) { sqlx::query("UPDATE users SET \"password\" = $1 WHERE username = $2;") @@ -97,6 +98,7 @@ impl User { } /// Find all users in the system + #[must_use] pub async fn find_all() -> Vec { sqlx::query_as("SELECT * FROM users") .fetch_all(get_pg!()) @@ -105,6 +107,7 @@ impl User { } /// Check if the user is an admin + #[must_use] pub const fn is_admin(&self) -> bool { matches!(self.user_role, UserRole::Admin) } @@ -112,6 +115,7 @@ impl User { /// Verify that a provided password matches the hashed password for the user /// /// Returns a boolean indicating whether the passwords match or not + #[must_use] pub fn verify_pw(&self, password: &str) -> bool { bcrypt::verify(password, &self.password).unwrap() } @@ -127,13 +131,12 @@ impl ToAPI for User { } /// extracts a user from a request with `session` cookie -async fn extract_user<'r>(request: &'r Request<'_>) -> Option { +async fn extract_user(request: &Request<'_>) -> Option { if let Some(session_id) = request.cookies().get("session") { if let Some(user) = User::from_session(session_id.value()).await { return Some(user); - } else { - return None; } + return None; } None @@ -146,9 +149,8 @@ impl<'r> FromRequest<'r> for User { async fn from_request(request: &'r Request<'_>) -> rocket::request::Outcome { if let Some(user) = extract_user(request).await { return Outcome::Success(user); - } else { - return Outcome::Error((Status::Unauthorized, ())); } + Outcome::Error((Status::Unauthorized, ())) } } @@ -164,9 +166,8 @@ impl<'r> FromRequest<'r> for APIUser { Some(key) => { if let Some(user) = User::from_session(key).await { return Outcome::Success(APIUser(user)); - } else { - return Outcome::Error((Status::Unauthorized, ())); } + return Outcome::Error((Status::Unauthorized, ())); } None => Outcome::Error((Status::Unauthorized, ())), } @@ -202,9 +203,9 @@ impl<'r> FromRequest<'r> for MaybeUser { async fn from_request(request: &'r Request<'_>) -> rocket::request::Outcome { if let Some(user) = extract_user(request).await { return Outcome::Success(MaybeUser::User(user)); - } else { - return Outcome::Success(MaybeUser::Anonymous); } + + Outcome::Success(MaybeUser::Anonymous) } } @@ -215,13 +216,15 @@ impl From for Option { } impl MaybeUser { - pub fn user(&self) -> Option<&User> { + #[must_use] + pub const fn user(&self) -> Option<&User> { match self { MaybeUser::User(user) => Some(user), MaybeUser::Anonymous => None, } } + #[must_use] pub fn take_user(self) -> Option { match self { MaybeUser::User(user) => Some(user), @@ -255,8 +258,8 @@ impl<'r> FromRequest<'r> for AdminUser { if user.is_admin() { return Outcome::Success(AdminUser(user)); } - } else { } + Outcome::Error((Status::Unauthorized, ())) } } diff --git a/src/format.rs b/src/format.rs index 68177a6..56415e0 100644 --- a/src/format.rs +++ b/src/format.rs @@ -16,6 +16,7 @@ /// let formatted = format_date(&date); /// assert_eq!(formatted, "2023-12-18"); /// ``` +#[must_use] pub fn format_date(date: &chrono::NaiveDate) -> String { // TODO : Implement custom formatting date.to_string() @@ -37,6 +38,7 @@ pub fn format_date(date: &chrono::NaiveDate) -> String { /// let formatted = format_number(number); /// assert_eq!(formatted, "12345"); /// ``` +#[must_use] pub fn format_number(num: i32) -> String { // TODO : Implement custom formatting num.to_string() @@ -66,14 +68,15 @@ pub fn format_number(num: i32) -> String { /// let formatted = format_seconds_to_hhmmss(short_duration); /// assert_eq!(formatted, "00:59"); /// ``` +#[must_use] pub fn format_seconds_to_hhmmss(seconds: f64) -> String { let total_seconds = seconds as u64; let hours = total_seconds / 3600; let minutes = (total_seconds % 3600) / 60; let seconds = total_seconds % 60; if hours != 0 { - format!("{:02}:{:02}:{:02}", hours, minutes, seconds) + format!("{hours:02}:{minutes:02}:{seconds:02}") } else { - format!("{:02}:{:02}", minutes, seconds) + format!("{minutes:02}:{seconds:02}") } } diff --git a/src/lib.rs b/src/lib.rs index 4a72137..ffdcff6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -15,7 +15,7 @@ pub mod result; pub static PG: OnceCell = OnceCell::const_new(); -/// A macro to retrieve or initialize the PostgreSQL connection pool. +/// A macro to retrieve or initialize the `PostgreSQL` connection pool. /// /// This macro provides a convenient way to access the `PgPool`. If the pool is not already initialized, /// it creates a new pool using the connection string from the `$DATABASE_URL` environment variable. diff --git a/src/page/mod.rs b/src/page/mod.rs index 2ada00d..45e216f 100644 --- a/src/page/mod.rs +++ b/src/page/mod.rs @@ -26,7 +26,8 @@ impl Shell { /// /// # Returns /// A `Shell` instance encapsulating the provided HTML content and attributes. - pub fn new( + #[must_use] + pub const fn new( head: PreEscaped, body_content: PreEscaped, body_class: Option, @@ -46,6 +47,7 @@ impl Shell { /// /// # Returns /// A `PreEscaped` containing the full HTML page content. + #[must_use] pub fn render(&self, content: PreEscaped, title: &str) -> PreEscaped { html! { html { @@ -94,7 +96,9 @@ pub async fn render_page( ctx: RequestContext, shell: &Shell, ) -> StringResponse { - if !ctx.is_htmx { + if ctx.is_htmx { + (Status::Ok, (ContentType::HTML, content.into_string())) + } else { ( Status::Ok, ( @@ -102,8 +106,6 @@ pub async fn render_page( shell.render(content, title).into_string(), ), ) - } else { - (Status::Ok, (ContentType::HTML, content.into_string())) } } @@ -119,6 +121,7 @@ pub async fn render_page( /// /// # Returns /// A `PreEscaped` containing the rendered HTML link element. +#[must_use] pub fn htmx_link( url: &str, class: &str, @@ -142,6 +145,7 @@ pub fn htmx_link( /// /// # Returns /// A `PreEscaped` containing the rendered `