From 09f86ee5b25fbddf667ef98a22eaa076cedba23c Mon Sep 17 00:00:00 2001 From: metamuffin Date: Tue, 13 May 2025 14:57:19 +0200 Subject: move AcceptJson and AcceptLanguage guard in preperation to remove them --- server/src/helper/accept.rs | 68 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 server/src/helper/accept.rs (limited to 'server/src/helper/accept.rs') 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 +*/ +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> + + ::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 + ))) + }) + } +} -- cgit v1.2.3-70-g09d2