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 session_provider(&self) -> Option<Arc<dyn systemprompt_traits::SessionProvider>> {
38 Some(self.data.analytics_repositories.sessions.owner())
39 }
40
41 fn analytics_provider(&self) -> Option<Arc<dyn AnalyticsProvider>> {
42 let concrete = Arc::clone(&self.data.analytics_service);
43 let provider: Arc<dyn AnalyticsProvider> = concrete;
44 Some(provider)
45 }
46
47 fn fingerprint_provider(&self) -> Option<Arc<dyn FingerprintProvider>> {
48 let concrete = Arc::clone(self.data.fingerprint_repo.as_ref()?);
49 let provider: Arc<dyn FingerprintProvider> = concrete;
50 Some(provider)
51 }
52
53 fn user_provider(&self) -> Option<Arc<dyn UserProvider>> {
54 let concrete = Arc::clone(self.data.user_service.as_ref()?);
55 let provider: Arc<dyn UserProvider> = concrete;
56 Some(provider)
57 }
58}
59
60impl ExtensionContext for AppContext {
61 fn system_owner_id(&self) -> systemprompt_identifiers::UserId {
62 self.system_admin().id().clone()
63 }
64
65 fn config(&self) -> Arc<dyn ConfigProvider> {
66 let concrete = Arc::clone(&self.cfg.config);
67 let provider: Arc<dyn ConfigProvider> = concrete;
68 provider
69 }
70
71 fn database(&self) -> Arc<dyn DatabaseHandle> {
72 let concrete = Arc::clone(&self.data.database);
73 let handle: Arc<dyn DatabaseHandle> = concrete;
74 handle
75 }
76
77 fn get_extension(&self, id: &str) -> Option<Arc<dyn Extension>> {
78 self.plugins.extension_registry.get(id).cloned()
79 }
80}
81
82impl HasAnalytics for AppContext {
83 type Analytics = Arc<AnalyticsService>;
84
85 fn analytics(&self) -> &Self::Analytics {
86 &self.data.analytics_service
87 }
88}
89
90impl HasFingerprint for AppContext {
91 type Fingerprint = Arc<FingerprintRepository>;
92
93 fn fingerprint(&self) -> Option<&Self::Fingerprint> {
94 self.data.fingerprint_repo.as_ref()
95 }
96}
97
98impl HasUserService for AppContext {
99 type UserService = Arc<UserService>;
100
101 fn user_service(&self) -> Option<&Self::UserService> {
102 self.data.user_service.as_ref()
103 }
104}
105
106impl HasRouteClassifier for AppContext {
107 type RouteClassifier = Arc<RouteClassifier>;
108
109 fn route_classifier(&self) -> &Self::RouteClassifier {
110 &self.cfg.route_classifier
111 }
112}