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