Skip to main content

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}