Skip to main content

systemprompt_extension/traits/
extension.rs

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