systemprompt_extension/traits/
extension.rs1use std::sync::Arc;
8
9use serde_json::Value as JsonValue;
10use systemprompt_provider_contracts::{
11 ComponentRenderer, ConfigPlane, ContentDataProvider, FrontmatterProcessor, Job,
12 PageDataProvider, PagePrerenderer, RssFeedProvider, SitemapProvider, TemplateDataExtender,
13 TemplateProvider, ToolProvider,
14};
15use systemprompt_traits::RunnerService;
16
17use crate::asset::{AssetDefinition, AssetPaths};
18use crate::context::ExtensionContext;
19use crate::error::ExtensionConfigError;
20use crate::health::{MetricDescriptor, ReadinessCheck};
21use crate::metadata::{ExtensionMetadata, ExtensionRole, SchemaDefinition};
22use crate::migration::Migration;
23use crate::router::{ExtensionRouter, ExtensionRouterConfig, SiteAuthConfig};
24use crate::seed::Seed;
25
26pub trait Extension: Send + Sync + 'static {
27 fn metadata(&self) -> ExtensionMetadata;
28
29 fn schemas(&self) -> Vec<SchemaDefinition> {
30 vec![]
31 }
32
33 fn router(&self, _ctx: &dyn ExtensionContext) -> Option<ExtensionRouter> {
34 None
35 }
36
37 fn router_config(&self) -> Option<ExtensionRouterConfig> {
38 None
39 }
40
41 fn site_auth(&self) -> Option<SiteAuthConfig> {
42 None
43 }
44
45 fn jobs(&self) -> Vec<Arc<dyn Job>> {
46 vec![]
47 }
48
49 fn config_planes(&self) -> Vec<Arc<dyn ConfigPlane>> {
50 vec![]
51 }
52
53 fn runner_services(&self) -> Vec<Arc<dyn RunnerService>> {
54 vec![]
55 }
56
57 fn readiness(&self, _ctx: &dyn ExtensionContext) -> Vec<Arc<dyn ReadinessCheck>> {
58 vec![]
59 }
60
61 fn metrics(&self) -> Vec<MetricDescriptor> {
62 vec![]
63 }
64
65 fn config_prefix(&self) -> Option<&str> {
66 None
67 }
68
69 fn config_schema(&self) -> Option<JsonValue> {
71 None
72 }
73
74 fn validate_config(&self, _config: &JsonValue) -> Result<(), ExtensionConfigError> {
76 Ok(())
77 }
78
79 fn tool_providers(&self) -> Vec<Arc<dyn ToolProvider>> {
80 vec![]
81 }
82
83 fn template_providers(&self) -> Vec<Arc<dyn TemplateProvider>> {
84 vec![]
85 }
86
87 fn component_renderers(&self) -> Vec<Arc<dyn ComponentRenderer>> {
88 vec![]
89 }
90
91 fn template_data_extenders(&self) -> Vec<Arc<dyn TemplateDataExtender>> {
92 vec![]
93 }
94
95 fn page_data_providers(&self) -> Vec<Arc<dyn PageDataProvider>> {
96 vec![]
97 }
98
99 fn page_prerenderers(&self) -> Vec<Arc<dyn PagePrerenderer>> {
100 vec![]
101 }
102
103 fn frontmatter_processors(&self) -> Vec<Arc<dyn FrontmatterProcessor>> {
104 vec![]
105 }
106
107 fn content_data_providers(&self) -> Vec<Arc<dyn ContentDataProvider>> {
108 vec![]
109 }
110
111 fn rss_feed_providers(&self) -> Vec<Arc<dyn RssFeedProvider>> {
112 vec![]
113 }
114
115 fn sitemap_providers(&self) -> Vec<Arc<dyn SitemapProvider>> {
116 vec![]
117 }
118
119 fn required_storage_paths(&self) -> Vec<&'static str> {
120 vec![]
121 }
122
123 fn dependencies(&self) -> Vec<&'static str> {
124 vec![]
125 }
126
127 fn is_required(&self) -> bool {
128 false
129 }
130
131 fn migrations(&self) -> Vec<Migration> {
132 vec![]
133 }
134
135 fn seeds(&self) -> Vec<Seed> {
136 Vec::new()
137 }
138
139 fn retirements(&self) -> Vec<SchemaDefinition> {
140 Vec::new()
141 }
142
143 fn cross_extension_tables(&self) -> Vec<&'static str> {
144 Vec::new()
145 }
146
147 fn roles(&self) -> Vec<ExtensionRole> {
148 vec![]
149 }
150
151 fn priority(&self) -> u32 {
152 100
153 }
154
155 fn id(&self) -> &'static str {
156 self.metadata().id
157 }
158
159 fn name(&self) -> &'static str {
160 self.metadata().name
161 }
162
163 fn version(&self) -> &'static str {
164 self.metadata().version
165 }
166
167 fn has_schemas(&self) -> bool {
168 !self.schemas().is_empty()
169 }
170
171 fn has_jobs(&self) -> bool {
172 !self.jobs().is_empty()
173 }
174
175 fn has_config(&self) -> bool {
176 self.config_prefix().is_some()
177 }
178
179 fn has_tool_providers(&self) -> bool {
180 !self.tool_providers().is_empty()
181 }
182
183 fn has_template_providers(&self) -> bool {
184 !self.template_providers().is_empty()
185 }
186
187 fn has_storage_paths(&self) -> bool {
188 !self.required_storage_paths().is_empty()
189 }
190
191 fn has_roles(&self) -> bool {
192 !self.roles().is_empty()
193 }
194
195 fn has_migrations(&self) -> bool {
196 !self.migrations().is_empty()
197 }
198
199 fn declares_assets(&self) -> bool {
200 false
201 }
202
203 fn required_assets(&self, _paths: &dyn AssetPaths) -> Vec<AssetDefinition> {
204 vec![]
205 }
206}