Skip to main content

systemprompt_traits/
context.rs

1use 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
15/// Context propagation traits for `RequestContext`
16pub trait InjectContextHeaders {
17    fn inject_headers(&self, headers: &mut http::HeaderMap);
18}
19
20pub trait ContextPropagation {
21    fn from_headers(headers: &http::HeaderMap) -> anyhow::Result<Self>
22    where
23        Self: Sized;
24
25    fn to_headers(&self) -> http::HeaderMap;
26}
27
28pub trait ConfigProvider: Send + Sync {
29    fn get(&self, key: &str) -> Option<String>;
30    fn database_url(&self) -> &str;
31    fn system_path(&self) -> &str;
32    fn api_port(&self) -> u16;
33    fn as_any(&self) -> &dyn std::any::Any;
34}
35
36/// Module registry trait
37pub trait ModuleRegistry: Send + Sync {
38    fn get_module(&self, name: &str) -> Option<Arc<dyn Module>>;
39    fn list_modules(&self) -> Vec<String>;
40}
41
42/// Database handle trait - opaque handle to database
43/// The actual Database implementation is in the database module
44pub trait DatabaseHandle: Send + Sync {
45    fn is_connected(&self) -> bool;
46    fn as_any(&self) -> &dyn std::any::Any;
47}
48
49/// Core module trait - minimal interface
50#[async_trait]
51pub trait Module: Send + Sync {
52    fn name(&self) -> &str;
53    fn version(&self) -> &str;
54    fn display_name(&self) -> &str;
55    async fn initialize(&self) -> Result<(), Box<dyn std::error::Error>>;
56}
57
58/// API module trait - for modules with REST APIs
59#[cfg(feature = "web")]
60#[async_trait]
61pub trait ApiModule: Module {
62    fn router(&self, ctx: Arc<dyn AppContext>) -> axum::Router;
63}