aboutsummaryrefslogtreecommitdiff
path: root/server/src/helper
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/helper')
-rw-r--r--server/src/helper/accept.rs68
-rw-r--r--server/src/helper/language.rs60
-rw-r--r--server/src/helper/mod.rs12
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,
+}