Skip to main content

systemprompt_runtime/
context_traits.rs

1//! Trait impls for [`crate::AppContext`].
2//!
3//! Split out of `context.rs` so the core type definition stays under
4//! the 300-line public-API ceiling.
5
6use std::sync::Arc;
7
8use systemprompt_analytics::{AnalyticsService, FingerprintRepository};
9use systemprompt_extension::{
10    Extension, ExtensionContext, HasAnalytics, HasFingerprint, HasRouteClassifier, HasUserService,
11};
12use systemprompt_models::RouteClassifier;
13use systemprompt_traits::{
14    AnalyticsProvider, AppContext as AppContextTrait, ConfigProvider, DatabaseHandle,
15    FingerprintProvider, UserProvider,
16};
17use systemprompt_users::UserService;
18
19use crate::AppContext;
20
21impl AppContextTrait for AppContext {
22    fn config(&self) -> Arc<dyn ConfigProvider> {
23        let concrete = Arc::clone(&self.config);
24        let provider: Arc<dyn ConfigProvider> = concrete;
25        provider
26    }
27
28    fn database_handle(&self) -> Arc<dyn DatabaseHandle> {
29        let concrete = Arc::clone(&self.database);
30        let handle: Arc<dyn DatabaseHandle> = concrete;
31        handle
32    }
33
34    fn analytics_provider(&self) -> Option<Arc<dyn AnalyticsProvider>> {
35        let concrete = Arc::clone(&self.analytics_service);
36        let provider: Arc<dyn AnalyticsProvider> = concrete;
37        Some(provider)
38    }
39
40    fn fingerprint_provider(&self) -> Option<Arc<dyn FingerprintProvider>> {
41        let concrete = Arc::clone(self.fingerprint_repo.as_ref()?);
42        let provider: Arc<dyn FingerprintProvider> = concrete;
43        Some(provider)
44    }
45
46    fn user_provider(&self) -> Option<Arc<dyn UserProvider>> {
47        let concrete = Arc::clone(self.user_service.as_ref()?);
48        let provider: Arc<dyn UserProvider> = concrete;
49        Some(provider)
50    }
51}
52
53impl ExtensionContext for AppContext {
54    fn config(&self) -> Arc<dyn ConfigProvider> {
55        let concrete = Arc::clone(&self.config);
56        let provider: Arc<dyn ConfigProvider> = concrete;
57        provider
58    }
59
60    fn database(&self) -> Arc<dyn DatabaseHandle> {
61        let concrete = Arc::clone(&self.database);
62        let handle: Arc<dyn DatabaseHandle> = concrete;
63        handle
64    }
65
66    fn get_extension(&self, id: &str) -> Option<Arc<dyn Extension>> {
67        self.extension_registry.get(id).cloned()
68    }
69}
70
71impl HasAnalytics for AppContext {
72    type Analytics = Arc<AnalyticsService>;
73
74    fn analytics(&self) -> &Self::Analytics {
75        &self.analytics_service
76    }
77}
78
79impl HasFingerprint for AppContext {
80    type Fingerprint = Arc<FingerprintRepository>;
81
82    fn fingerprint(&self) -> Option<&Self::Fingerprint> {
83        self.fingerprint_repo.as_ref()
84    }
85}
86
87impl HasUserService for AppContext {
88    type UserService = Arc<UserService>;
89
90    fn user_service(&self) -> Option<&Self::UserService> {
91        self.user_service.as_ref()
92    }
93}
94
95impl HasRouteClassifier for AppContext {
96    type RouteClassifier = Arc<RouteClassifier>;
97
98    fn route_classifier(&self) -> &Self::RouteClassifier {
99        &self.route_classifier
100    }
101}