pub mod events; pub mod extensions; use crate::Result; use axum::{headers::Header, http::HeaderName}; use std::sync::OnceLock; pub use extensions::fetch_extensions_from_blob_store_periodically; pub struct CloudflareIpCountryHeader(String); impl Header for CloudflareIpCountryHeader { fn name() -> &'static HeaderName { static CLOUDFLARE_IP_COUNTRY_HEADER: OnceLock = OnceLock::new(); CLOUDFLARE_IP_COUNTRY_HEADER.get_or_init(|| HeaderName::from_static("cf-ipcountry")) } fn decode<'i, I>(values: &mut I) -> Result where Self: Sized, I: Iterator, { let country_code = values .next() .ok_or_else(axum::headers::Error::invalid)? .to_str() .map_err(|_| axum::headers::Error::invalid())?; Ok(Self(country_code.to_string())) } fn encode>(&self, _values: &mut E) { unimplemented!() } } impl std::fmt::Display for CloudflareIpCountryHeader { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}", self.0) } } pub struct SystemIdHeader(String); impl Header for SystemIdHeader { fn name() -> &'static HeaderName { static SYSTEM_ID_HEADER: OnceLock = OnceLock::new(); SYSTEM_ID_HEADER.get_or_init(|| HeaderName::from_static("x-zed-system-id")) } fn decode<'i, I>(values: &mut I) -> Result where Self: Sized, I: Iterator, { let system_id = values .next() .ok_or_else(axum::headers::Error::invalid)? .to_str() .map_err(|_| axum::headers::Error::invalid())?; Ok(Self(system_id.to_string())) } fn encode>(&self, _values: &mut E) { unimplemented!() } } impl std::fmt::Display for SystemIdHeader { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}", self.0) } }