1pub mod body;
56pub mod competitive_analysis;
57pub mod enhanced_title;
58pub mod hashed_stylesheet;
59pub mod html;
60pub mod json_ld;
61pub mod macros;
62pub mod meta_tags;
63pub mod metadata;
64
65#[cfg(not(target_arch = "wasm32"))]
67pub mod og_image;
68
69#[cfg(not(target_arch = "wasm32"))]
70pub mod conventions;
71
72#[cfg(all(not(target_arch = "wasm32"), feature = "api-contracts"))]
73pub mod api;
74
75#[cfg(target_arch = "wasm32")]
77pub mod wasm;
78
79pub mod analytics;
80pub mod canvas_types;
81pub mod error;
82pub mod themes;
83pub mod utils;
84
85pub mod prelude {
87 pub use crate::metadata::{
88 AlternateLink, Article, Authors, CanonicalUrl, ColorScheme, Description, FormatDetection,
89 Keywords, Metadata, OpenGraph, Profile, ReferrerPolicy, Robots, ThemeColor, Title, Twitter,
90 TwitterCard, Viewport,
91 };
92
93 #[cfg(not(target_arch = "wasm32"))]
94 pub use crate::conventions::{ConventionScanner, FileConventions};
95 #[cfg(feature = "json-ld")]
96 pub use crate::json_ld::{JsonLd, SchemaOrg};
97 #[cfg(not(target_arch = "wasm32"))]
98 pub use crate::og_image::{GeneratedOgImage, OgImageGenerator, OgImageParams};
99
100 pub use crate::canvas_types::{
102 CanvasOgParams, GradientType, ImageLayer, LogoPosition, OgImageLayer, OgImageTemplate,
103 ShapeLayer, ShapeType, TextAlign, TextGradient, TextLayer, TextOutline, TextShadow,
104 };
105
106 pub use crate::themes::{
108 BorderEffects, BorderStyle, ColorPalette, ContentAlignment, FontWeights, GradientConfig,
109 Layout, LogoPosition as ThemeLogoPosition, PatternConfig, PatternType, QuickThemes,
110 TextAlignment, TextEffects, Theme, ThemeBuilder, ThemeCategory, ThemeHelpers, ThemeManager,
111 ThemeMetadata, VisualEffects,
112 };
113
114 #[cfg(feature = "macros")]
115 pub use crate::macros::{generate_metadata, metadata};
116
117 #[cfg(target_arch = "wasm32")]
119 pub use crate::wasm::browser_api::BrowserApi;
120 #[cfg(target_arch = "wasm32")]
121 pub use crate::wasm::canvas_og::{
122 CanvasOgGenerator, CanvasOgParams, CanvasOgResult, CanvasOgUtils, GradientType, ImageLayer,
123 LogoPosition, OgImageLayer, OgImageTemplate, ShapeLayer, ShapeType, TextAlign,
124 TextGradient, TextLayer, TextOutline, TextShadow,
125 };
126 #[cfg(target_arch = "wasm32")]
127 pub use crate::wasm::context::{StorageBackend, WasmContext};
128 #[cfg(target_arch = "wasm32")]
129 pub use crate::wasm::error_handler::{
130 QueueStatus, WasmErrorContext, WasmErrorHandler, WasmErrorReporter, WasmErrorUtils,
131 };
132 #[cfg(target_arch = "wasm32")]
133 pub use crate::wasm::feature_detection::FeatureDetection;
134 #[cfg(target_arch = "wasm32")]
135 pub use crate::wasm::performance::{
136 BrowserPerformanceInfo, BundleOptimizer, BundleRecommendations, BundleSavings,
137 MemoryOptimization, MemoryPressure, OptimizationStatus, PerformanceMonitor,
138 PerformanceSummary, PerformanceTip, RuntimeOptimizer, WasmProfiler,
139 };
140 #[cfg(target_arch = "wasm32")]
141 pub use crate::wasm::security::{
142 ComplianceStatus, CspConfig, SecureDefaults, SecurityAudit, SecurityCategory,
143 SecurityConfig, SecurityIssue, SecuritySeverity, SecurityUtils, SecurityValidator,
144 ValidationConfig, ValidationIssue, ValidationResult, ValidationSeverity,
145 };
146 #[cfg(target_arch = "wasm32")]
147 pub use crate::wasm::storage::{MetadataStorage, StorageFactory};
148 #[cfg(target_arch = "wasm32")]
149 pub use crate::wasm::worker_manager::{WasmWorkerManager, WorkerResult, WorkerTask};
150 #[cfg(target_arch = "wasm32")]
151 pub use crate::wasm::{WasmCapabilities, WasmMetadataContext, WasmStorage};
152
153 pub use crate::body::Body;
154 pub use crate::enhanced_title::EnhancedTitle;
155 pub use crate::hashed_stylesheet::HashedStylesheet;
156 pub use crate::html::Html;
157 pub use crate::meta_tags::MetaTags;
158 pub use crate::metadata::context::{
159 provide_metadata_context, MetadataContext, MetadataProvider,
160 };
161
162 pub use crate::competitive_analysis::{
164 BenchmarkReport, BenchmarkScenario, Capability, ClientValue, CompetitiveAnalysisService,
165 CompetitiveBenchmark, Competitor, CompetitorCategory, DemoCreator, ImplementationType,
166 PerformanceMetrics,
167 };
168
169 pub use crate::error::{
171 ErrorContext, ErrorContextBuilder, ErrorHandler, ErrorKind, ErrorReportingConfig,
172 ErrorSeverity, ErrorStats, ErrorUtils, MetadataError, MetadataResult,
173 };
174}
175
176pub use body::Body;
177#[cfg(not(target_arch = "wasm32"))]
178pub use conventions::{ConventionScanner, FileConventions};
179pub use enhanced_title::EnhancedTitle;
180pub use hashed_stylesheet::HashedStylesheet;
181pub use html::Html;
182#[cfg(feature = "json-ld")]
183pub use json_ld::{
184 Answer, Article, BlogPosting, BreadcrumbList, FAQPage, JsonLd, ListItem, Organization, Person,
185 Product, Question, SchemaOrg, WebPage,
186};
187pub use meta_tags::MetaTags;
188pub use metadata::{
190 Authors, CanonicalUrl, ColorScheme, Description, FormatDetection, Keywords, Metadata,
191 OpenGraph, ReferrerPolicy, Robots, ThemeColor, Title, Twitter, TwitterCard, Viewport,
192};
193#[cfg(not(target_arch = "wasm32"))]
194pub use og_image::{GeneratedOgImage, OgImageGenerator, OgImageParams};
195
196#[cfg(feature = "macros")]
197pub use macros::*;
198
199pub type Result<T> = std::result::Result<T, Error>;
201
202#[derive(Debug, thiserror::Error)]
204pub enum Error {
205 #[error("Metadata context not provided")]
206 ContextNotProvided,
207
208 #[error("Invalid metadata: {0}")]
209 InvalidMetadata(String),
210
211 #[error("Template error: {0}")]
212 TemplateError(String),
213
214 #[error("Image generation error: {0}")]
215 ImageError(String),
216
217 #[error("Performance limit exceeded: {0}")]
218 PerformanceLimitExceeded(String),
219
220 #[error("IO error: {0}")]
221 IoError(#[from] std::io::Error),
222
223 #[error("Serialization error: {0}")]
224 SerializationError(String),
225
226 #[error("URL error: {0}")]
227 UrlError(#[from] url::ParseError),
228
229 #[error("Configuration error: {0}")]
230 ConfigError(String),
231
232 #[error("Cache error: {0}")]
233 CacheError(String),
234
235 #[error("Validation error: {0}")]
236 ValidationError(String),
237}
238
239#[derive(Debug, Clone, Default)]
241pub struct MetadataConfig {
242 pub cache: CacheConfig,
244
245 pub og_image: OgImageConfig,
247
248 pub conventions: ConventionConfig,
250
251 pub debug: DebugConfig,
253
254 pub limits: LimitConfig,
256}
257
258#[derive(Debug, Clone)]
260pub struct CacheConfig {
261 pub memory_cache_enabled: bool,
263
264 pub memory_cache_size: usize,
266
267 pub memory_cache_ttl: u64,
269
270 pub disk_cache_enabled: bool,
272
273 pub disk_cache_path: String,
275
276 pub og_image_cache_size: usize,
278}
279
280#[derive(Debug, Clone)]
282pub struct OgImageConfig {
283 pub default_size: (u32, u32),
285
286 pub fonts: Vec<FontConfig>,
288
289 pub template_dir: String,
291
292 pub format: ImageFormat,
294
295 pub quality: u8,
297}
298
299#[derive(Debug, Clone)]
301pub struct FontConfig {
302 pub family: String,
304
305 pub weight: FontWeight,
307
308 pub data: Vec<u8>,
310}
311
312#[derive(Debug, Clone, Copy, PartialEq, Eq)]
314pub enum FontWeight {
315 Thin = 100,
316 ExtraLight = 200,
317 Light = 300,
318 Regular = 400,
319 Medium = 500,
320 SemiBold = 600,
321 Bold = 700,
322 ExtraBold = 800,
323 Black = 900,
324}
325
326#[derive(Debug, Clone, Copy, PartialEq, Eq)]
328pub enum ImageFormat {
329 PNG,
330 JPEG,
331 WebP,
332}
333
334#[derive(Debug, Clone)]
336pub struct ConventionConfig {
337 pub root_dir: String,
339
340 pub auto_detect: bool,
342
343 pub patterns: Vec<String>,
345}
346
347#[derive(Debug, Clone, Default)]
349pub struct DebugConfig {
350 pub log_metadata_resolution: bool,
352
353 pub log_cache_hits: bool,
355
356 pub log_generation_time: bool,
358
359 pub validate_output: bool,
361}
362
363#[derive(Debug, Clone)]
365pub struct LimitConfig {
366 pub max_og_image_size: usize,
368
369 pub max_template_size: usize,
371
372 pub max_cache_memory: usize,
374
375 pub max_generation_time: u64,
377}
378
379impl Default for CacheConfig {
380 fn default() -> Self {
381 Self {
382 memory_cache_enabled: true,
383 memory_cache_size: 1000,
384 memory_cache_ttl: 3600,
385 disk_cache_enabled: false,
386 disk_cache_path: "./cache".to_string(),
387 og_image_cache_size: 100,
388 }
389 }
390}
391
392impl Default for OgImageConfig {
393 fn default() -> Self {
394 Self {
395 default_size: (1200, 630),
396 fonts: Vec::new(),
397 template_dir: "./templates".to_string(),
398 format: ImageFormat::PNG,
399 quality: 90,
400 }
401 }
402}
403
404impl Default for ConventionConfig {
405 fn default() -> Self {
406 Self {
407 root_dir: "./app".to_string(),
408 auto_detect: true,
409 patterns: Vec::new(),
410 }
411 }
412}
413
414impl Default for LimitConfig {
415 fn default() -> Self {
416 Self {
417 max_og_image_size: 10_000_000, max_template_size: 1_000_000, max_cache_memory: 100_000_000, max_generation_time: 5000, }
422 }
423}