Some checks failed
CI / Check typos (push) Successful in 8s
CI / Check links (push) Failing after 10s
CI / Clippy (push) Successful in 56s
CI / Build and test (push) Successful in 1m22s
CI / Build container (push) Successful in 1m4s
CI / Deploy on waypoint (push) Successful in 46s
65 lines
1.1 KiB
Rust
65 lines
1.1 KiB
Rust
use std::collections::BTreeMap;
|
|
|
|
use axum::http::HeaderMap;
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
|
pub struct RequestContext {
|
|
pub client_info: ClientInfo,
|
|
pub route: String,
|
|
pub query: BTreeMap<String, String>,
|
|
}
|
|
|
|
//
|
|
//
|
|
//
|
|
|
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
|
pub enum DeviceType {
|
|
Mobile,
|
|
Desktop,
|
|
}
|
|
|
|
impl Default for DeviceType {
|
|
fn default() -> Self {
|
|
Self::Desktop
|
|
}
|
|
}
|
|
|
|
//
|
|
// MARK: clientinfo
|
|
//
|
|
|
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
|
pub struct ClientInfo {
|
|
/// This is an estimate, but it's probably good enough.
|
|
pub device_type: DeviceType,
|
|
}
|
|
|
|
impl ClientInfo {
|
|
pub fn from_headers(headers: &HeaderMap) -> Self {
|
|
let ua = headers
|
|
.get("user-agent")
|
|
.and_then(|x| x.to_str().ok())
|
|
.unwrap_or("");
|
|
|
|
let ch_mobile = headers
|
|
.get("Sec-CH-UA-Mobile")
|
|
.and_then(|x| x.to_str().ok())
|
|
.unwrap_or("");
|
|
|
|
let mut device_type = None;
|
|
|
|
if device_type.is_none() && ch_mobile.contains("1") {
|
|
device_type = Some(DeviceType::Mobile);
|
|
}
|
|
|
|
if device_type.is_none() && ua.contains("Mobile") {
|
|
device_type = Some(DeviceType::Mobile);
|
|
}
|
|
|
|
Self {
|
|
device_type: device_type.unwrap_or_default(),
|
|
}
|
|
}
|
|
}
|