diff options
Diffstat (limited to 'server/src/helper')
-rw-r--r-- | server/src/helper/accept.rs | 68 | ||||
-rw-r--r-- | server/src/helper/language.rs | 60 | ||||
-rw-r--r-- | server/src/helper/mod.rs | 12 |
3 files changed, 140 insertions, 0 deletions
diff --git a/server/src/helper/accept.rs b/server/src/helper/accept.rs new file mode 100644 index 0000000..3ac53c8 --- /dev/null +++ b/server/src/helper/accept.rs @@ -0,0 +1,68 @@ +/* + This file is part of jellything (https://codeberg.org/metamuffin/jellything) + which is licensed under the GNU Affero General Public License (version 3); see /COPYING. + Copyright (C) 2025 metamuffin <metamuffin.org> +*/ +use rocket::{ + http::MediaType, + outcome::Outcome, + request::{self, FromRequest}, + Request, +}; +use std::ops::Deref; + +#[derive(Debug, Default)] +pub enum Accept { + #[default] + Other, + Json, + Image, + Media, + Html, +} +impl Accept { + pub fn from_request_ut(request: &Request) -> Self { + if let Some(a) = request.accept() { + if a.preferred().exact_eq(&MediaType::JSON) { + Accept::Json + } else { + Accept::Other + } + } else { + Accept::Other + } + } +} + +pub struct AcceptJson(bool); +impl Deref for AcceptJson { + type Target = bool; + fn deref(&self) -> &Self::Target { + &self.0 + } +} +impl<'r> FromRequest<'r> for AcceptJson { + type Error = (); + + fn from_request<'life0, 'async_trait>( + request: &'r Request<'life0>, + ) -> ::core::pin::Pin< + Box< + dyn ::core::future::Future<Output = request::Outcome<Self, Self::Error>> + + ::core::marker::Send + + 'async_trait, + >, + > + where + 'r: 'async_trait, + 'life0: 'async_trait, + Self: 'async_trait, + { + Box::pin(async move { + Outcome::Success(AcceptJson(matches!( + Accept::from_request_ut(request), + Accept::Json + ))) + }) + } +} diff --git a/server/src/helper/language.rs b/server/src/helper/language.rs new file mode 100644 index 0000000..a441919 --- /dev/null +++ b/server/src/helper/language.rs @@ -0,0 +1,60 @@ +/* + This file is part of jellything (https://codeberg.org/metamuffin/jellything) + which is licensed under the GNU Affero General Public License (version 3); see /COPYING. + Copyright (C) 2025 metamuffin <metamuffin.org> +*/ +use jellyui::locale::Language; +use rocket::{ + outcome::Outcome, + request::{self, FromRequest}, + Request, +}; +use std::ops::Deref; + +pub struct AcceptLanguage(pub Language); +impl Deref for AcceptLanguage { + type Target = Language; + fn deref(&self) -> &Self::Target { + &self.0 + } +} +impl<'r> FromRequest<'r> for AcceptLanguage { + type Error = (); + + fn from_request<'life0, 'async_trait>( + request: &'r Request<'life0>, + ) -> ::core::pin::Pin< + Box< + dyn ::core::future::Future<Output = request::Outcome<Self, Self::Error>> + + ::core::marker::Send + + 'async_trait, + >, + > + where + 'r: 'async_trait, + 'life0: 'async_trait, + Self: 'async_trait, + { + Box::pin(async move { Outcome::Success(AcceptLanguage(lang_from_request(request))) }) + } +} + +pub(crate) fn lang_from_request(request: &Request) -> Language { + request + .headers() + .get_one("accept-language") + .and_then(|h| { + h.split(",") + .filter_map(|e| { + let code = e.split(";").next()?; + let code = code.split_once("-").unwrap_or((code, "")).0; + match code { + "en" => Some(Language::English), + "de" => Some(Language::German), + _ => None, + } + }) + .next() + }) + .unwrap_or(Language::English) +} diff --git a/server/src/helper/mod.rs b/server/src/helper/mod.rs index f068cbc..4b0644c 100644 --- a/server/src/helper/mod.rs +++ b/server/src/helper/mod.rs @@ -3,11 +3,23 @@ which is licensed under the GNU Affero General Public License (version 3); see /COPYING. Copyright (C) 2025 metamuffin <metamuffin.org> */ +pub mod accept; pub mod cache; pub mod cors; pub mod filter_sort; +pub mod language; pub mod node_id; pub mod session; +use accept::Accept; +use jellylogic::session::Session; +use jellyui::locale::Language; + #[derive(Debug, Clone, Copy, Default)] pub struct A<T>(pub T); + +pub struct RequestInfo { + pub lang: Language, + pub accept: Accept, + pub session: Session, +} |