diff options
author | metamuffin <metamuffin@disroot.org> | 2025-05-13 14:57:19 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-05-13 14:57:19 +0200 |
commit | 09f86ee5b25fbddf667ef98a22eaa076cedba23c (patch) | |
tree | 2abca01286840cb918acbbdc3735f414fd26595e /server/src/helper/accept.rs | |
parent | 55434f87ff252c784e5e00b4775b9555da31ebb0 (diff) | |
download | jellything-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.rs | 68 |
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 + ))) + }) + } +} |