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 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}