systemprompt_extension/traits/
extension.rs1use 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}