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::metadata::{ExtensionMetadata, ExtensionRole, SchemaDefinition};
21use crate::migration::Migration;
22use crate::router::{ExtensionRouter, ExtensionRouterConfig, SiteAuthConfig};
23use crate::seed::Seed;
24
25pub trait Extension: Send + Sync + 'static {
26 fn metadata(&self) -> ExtensionMetadata;
27
28 fn schemas(&self) -> Vec<SchemaDefinition> {
29 vec![]
30 }
31
32 fn router(&self, _ctx: &dyn ExtensionContext) -> Option<ExtensionRouter> {
33 None
34 }
35
36 fn router_config(&self) -> Option<ExtensionRouterConfig> {
37 None
38 }
39
40 fn site_auth(&self) -> Option<SiteAuthConfig> {
41 None
42 }
43
44 fn jobs(&self) -> Vec<Arc<dyn Job>> {
45 vec![]
46 }
47
48 fn config_planes(&self) -> Vec<Arc<dyn ConfigPlane>> {
49 vec![]
50 }
51
52 fn runner_services(&self) -> Vec<Arc<dyn RunnerService>> {
53 vec![]
54 }
55
56 fn config_prefix(&self) -> Option<&str> {
57 None
58 }
59
60 fn config_schema(&self) -> Option<JsonValue> {
62 None
63 }
64
65 fn validate_config(&self, _config: &JsonValue) -> Result<(), ExtensionConfigError> {
67 Ok(())
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 retirements(&self) -> Vec<SchemaDefinition> {
131 Vec::new()
132 }
133
134 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_jobs(&self) -> bool {
163 !self.jobs().is_empty()
164 }
165
166 fn has_config(&self) -> bool {
167 self.config_prefix().is_some()
168 }
169
170 fn has_tool_providers(&self) -> bool {
171 !self.tool_providers().is_empty()
172 }
173
174 fn has_template_providers(&self) -> bool {
175 !self.template_providers().is_empty()
176 }
177
178 fn has_storage_paths(&self) -> bool {
179 !self.required_storage_paths().is_empty()
180 }
181
182 fn has_roles(&self) -> bool {
183 !self.roles().is_empty()
184 }
185
186 fn has_migrations(&self) -> bool {
187 !self.migrations().is_empty()
188 }
189
190 fn declares_assets(&self) -> bool {
191 false
192 }
193
194 fn required_assets(&self, _paths: &dyn AssetPaths) -> Vec<AssetDefinition> {
195 vec![]
196 }
197}