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//!
6//! Copyright (c) systemprompt.io — Business Source License 1.1.
7//! See <https://systemprompt.io> for licensing details.
8
9use 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}