use std::sync::Arc;
use crate::analytics::{AnalyticsProvider, FingerprintProvider};
use crate::auth::UserProvider;
pub trait AppContext: Send + Sync {
fn config(&self) -> Arc<dyn ConfigProvider>;
fn database_handle(&self) -> Arc<dyn DatabaseHandle>;
fn session_provider(&self) -> Option<Arc<dyn crate::SessionProvider>>;
fn analytics_provider(&self) -> Option<Arc<dyn AnalyticsProvider>>;
fn fingerprint_provider(&self) -> Option<Arc<dyn FingerprintProvider>>;
fn user_provider(&self) -> Option<Arc<dyn UserProvider>>;
}
pub trait InjectContextHeaders {
fn inject_headers(&self, headers: &mut http::HeaderMap);
}
pub type ContextPropagationResult<T> = Result<T, ContextPropagationError>;
#[derive(Debug, thiserror::Error)]
#[non_exhaustive]
pub enum ContextPropagationError {
#[error("missing header: {0}")]
MissingHeader(String),
#[error("invalid header {name}: {message}")]
InvalidHeader { name: String, message: String },
#[error("invalid context: {0}")]
Invalid(String),
}
pub trait ContextPropagation {
fn from_headers(headers: &http::HeaderMap) -> ContextPropagationResult<Self>
where
Self: Sized;
fn to_headers(&self) -> http::HeaderMap;
}
pub trait ConfigProvider: Send + Sync {
fn get(&self, key: &str) -> Option<String>;
fn database_url(&self) -> &str;
fn database_write_url(&self) -> Option<&str> {
None
}
fn system_path(&self) -> &str;
fn api_port(&self) -> u16;
fn as_any(&self) -> &dyn std::any::Any;
}
pub trait DatabaseHandle: Send + Sync {
fn is_connected(&self) -> bool;
fn as_any(&self) -> &dyn std::any::Any;
}