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