systemprompt_traits/
context.rs1use async_trait::async_trait;
2use std::sync::Arc;
3
4use crate::analytics::{AnalyticsProvider, FingerprintProvider};
5use crate::auth::UserProvider;
6
7pub trait AppContext: Send + Sync {
8 fn config(&self) -> Arc<dyn ConfigProvider>;
9 fn database_handle(&self) -> Arc<dyn DatabaseHandle>;
10 fn analytics_provider(&self) -> Option<Arc<dyn AnalyticsProvider>>;
11 fn fingerprint_provider(&self) -> Option<Arc<dyn FingerprintProvider>>;
12 fn user_provider(&self) -> Option<Arc<dyn UserProvider>>;
13}
14
15pub trait InjectContextHeaders {
16 fn inject_headers(&self, headers: &mut http::HeaderMap);
17}
18
19pub trait ContextPropagation {
20 fn from_headers(headers: &http::HeaderMap) -> anyhow::Result<Self>
21 where
22 Self: Sized;
23
24 fn to_headers(&self) -> http::HeaderMap;
25}
26
27pub trait ConfigProvider: Send + Sync {
28 fn get(&self, key: &str) -> Option<String>;
29 fn database_url(&self) -> &str;
30 fn database_write_url(&self) -> Option<&str> {
31 None
32 }
33 fn system_path(&self) -> &str;
34 fn api_port(&self) -> u16;
35 fn as_any(&self) -> &dyn std::any::Any;
36}
37
38pub trait ModuleRegistry: Send + Sync {
39 fn get_module(&self, name: &str) -> Option<Arc<dyn Module>>;
40 fn list_modules(&self) -> Vec<String>;
41}
42
43pub trait DatabaseHandle: Send + Sync {
44 fn is_connected(&self) -> bool;
45 fn as_any(&self) -> &dyn std::any::Any;
46}
47
48#[async_trait]
49pub trait Module: Send + Sync {
50 fn name(&self) -> &str;
51 fn version(&self) -> &str;
52 fn display_name(&self) -> &str;
53 async fn initialize(&self) -> Result<(), Box<dyn std::error::Error>>;
54}
55
56#[cfg(feature = "web")]
57#[async_trait]
58pub trait ApiModule: Module {
59 fn router(&self, ctx: Arc<dyn AppContext>) -> axum::Router;
60}