use axum::extract::Query;
use axum::{body::Body, http::Request};
use crate::headers::AcceptHeader;
use crate::templating::FormatChooser;
use crate::templating::HumusFormatIdentifier;
#[derive(serde::Deserialize)]
struct FormatQuery {
format: Option<HumusFormatIdentifier>,
}
pub fn extract_format_from_request_uri(req: &Request<Body>) -> Option<HumusFormatIdentifier> {
match Query::<FormatQuery>::try_from_uri(req.uri()) {
Ok(Query(format_query)) => {
format_query.format
}
Err(_e) => {
None }
}
}
pub fn extract_format_from_request_accept_header(
req: &Request<Body>,
media_type_based_format_chooser: &FormatChooser,
) -> Option<HumusFormatIdentifier> {
let accept_header = req.headers().get("accept")?.to_str().ok()?;
let accept_header = AcceptHeader::new(accept_header);
media_type_based_format_chooser.choose_from_accept_header(&accept_header)
}
pub fn extract_format_from_request_user_agent_header(
req: &Request<Body>,
media_type_based_format_chooser: &FormatChooser,
) -> Option<HumusFormatIdentifier> {
let user_agent_header = req.headers().get("user-agent")?.to_str().ok()?;
media_type_based_format_chooser.choose_from_user_agent(user_agent_header)
}