seam_server/page.rs
1/* packages/server/core/rust/src/page.rs */
2
3use std::collections::HashMap;
4use std::sync::Arc;
5
6pub type LoaderInputFn = Arc<dyn Fn(&HashMap<String, String>) -> serde_json::Value + Send + Sync>;
7
8pub struct LoaderDef {
9 pub data_key: String,
10 pub procedure: String,
11 pub input_fn: LoaderInputFn,
12}
13
14/// One entry in a layout chain (outer to inner order).
15/// Each layout owns a set of loader data keys.
16pub struct LayoutChainEntry {
17 pub id: String,
18 pub loader_keys: Vec<String>,
19}
20
21pub struct PageDef {
22 /// Axum route syntax, e.g. "/user/{id}"
23 pub route: String,
24 pub template: String,
25 /// Per-locale pre-resolved templates (layout chain already applied). Keyed by locale.
26 pub locale_templates: Option<HashMap<String, String>>,
27 pub loaders: Vec<LoaderDef>,
28 /// Script ID for the injected data JSON. Defaults to "__SEAM_DATA__".
29 pub data_id: String,
30 /// Layout chain from outer to inner. Each entry records which loader keys belong to that layout.
31 pub layout_chain: Vec<LayoutChainEntry>,
32 /// Data keys from page-level loaders (not layout). Used to split data in the data script.
33 pub page_loader_keys: Vec<String>,
34 /// Merged i18n keys from route + layout chain. Empty means include all keys.
35 pub i18n_keys: Vec<String>,
36}
37
38/// Runtime i18n configuration loaded from build output.
39#[derive(Clone)]
40pub struct I18nConfig {
41 pub locales: Vec<String>,
42 pub default: String,
43 /// Locale -> messages JSON value (read from locales/{locale}.json)
44 pub messages: HashMap<String, serde_json::Value>,
45 /// Per-locale content hash for cache invalidation
46 pub versions: HashMap<String, String>,
47}