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  pub mode: String,
44  pub cache: bool,
45  /// Route pattern -> route hash (8 hex)
46  pub route_hashes: HashMap<String, String>,
47  /// Route hash -> { locale -> content hash (4 hex) }
48  pub content_hashes: HashMap<String, HashMap<String, String>>,
49  /// Memory mode: locale -> routeHash -> messages
50  pub messages: HashMap<String, HashMap<String, serde_json::Value>>,
51  /// Paged mode: base directory for on-demand reads
52  pub dist_dir: Option<std::path::PathBuf>,
53}