use std::str::FromStr;
use axum::extract::OptionalFromRequestParts;
use crate::headers::parser::HeaderParser;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum AcceptLanguageHeaderLanguage {
Wildcard,
Code(String),
}
#[derive(Debug, Clone, PartialEq)]
pub struct AcceptLanguageHeader {
pub languages: Vec<(AcceptLanguageHeaderLanguage, f32)>,
}
impl AcceptLanguageHeader {
pub fn new(header_text: &str) -> Self {
HeaderParser::new(header_text).parse_accept_language()
}
}
impl FromStr for AcceptLanguageHeader {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(HeaderParser::new(s).parse_accept_language())
}
}
impl<S> OptionalFromRequestParts<S> for AcceptLanguageHeader
where
S: Sync,
{
type Rejection = ();
async fn from_request_parts(
parts: &mut axum::http::request::Parts,
_state: &S,
) -> Result<Option<Self>, Self::Rejection> {
Ok(parts
.headers
.get("accept-language")
.and_then(|v| Some(AcceptLanguageHeader::new(v.to_str().ok()?))))
}
}