lib_humus/headers/
accept_language_header.rs1use std::str::FromStr;
6
7use axum::extract::OptionalFromRequestParts;
8
9use crate::headers::parser::HeaderParser;
10
11#[derive(Debug, Clone, PartialEq, Eq)]
13pub enum AcceptLanguageHeaderLanguage {
14 Wildcard,
16 Code(String),
18}
19
20#[derive(Debug, Clone, PartialEq)]
22pub struct AcceptLanguageHeader {
23 pub languages: Vec<(AcceptLanguageHeaderLanguage, f32)>,
25}
26
27impl AcceptLanguageHeader {
28 pub fn new(header_text: &str) -> Self {
30 HeaderParser::new(header_text).parse_accept_language()
31 }
32}
33
34impl FromStr for AcceptLanguageHeader {
35 type Err = ();
36
37 fn from_str(s: &str) -> Result<Self, Self::Err> {
38 Ok(HeaderParser::new(s).parse_accept_language())
39 }
40}
41
42impl<S> OptionalFromRequestParts<S> for AcceptLanguageHeader
43where
44 S: Sync,
45{
46 type Rejection = ();
47
48 async fn from_request_parts(
49 parts: &mut axum::http::request::Parts,
50 _state: &S,
51 ) -> Result<Option<Self>, Self::Rejection> {
52 Ok(parts
53 .headers
54 .get("accept-language")
55 .and_then(|v| Some(AcceptLanguageHeader::new(v.to_str().ok()?))))
56 }
57}