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