aboutsummaryrefslogtreecommitdiff
path: root/server/src/helper/accept.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-05-13 14:57:19 +0200
committermetamuffin <metamuffin@disroot.org>2025-05-13 14:57:19 +0200
commit09f86ee5b25fbddf667ef98a22eaa076cedba23c (patch)
tree2abca01286840cb918acbbdc3735f414fd26595e /server/src/helper/accept.rs
parent55434f87ff252c784e5e00b4775b9555da31ebb0 (diff)
downloadjellything-09f86ee5b25fbddf667ef98a22eaa076cedba23c.tar
jellything-09f86ee5b25fbddf667ef98a22eaa076cedba23c.tar.bz2
jellything-09f86ee5b25fbddf667ef98a22eaa076cedba23c.tar.zst
move AcceptJson and AcceptLanguage guard in preperation to remove them
Diffstat (limited to 'server/src/helper/accept.rs')
-rw-r--r--server/src/helper/accept.rs68
1 files changed, 68 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
+ )))
+ })
+ }
+}