Skip to main content

seam_server/build_loader/
types.rs

1/* src/server/core/rust/src/build_loader/types.rs */
2
3use std::collections::HashMap;
4
5use serde::Deserialize;
6
7#[derive(Deserialize)]
8#[allow(dead_code)]
9pub(super) struct RouteManifest {
10  #[serde(default)]
11  pub(super) layouts: HashMap<String, LayoutEntry>,
12  pub(super) routes: HashMap<String, RouteEntry>,
13  #[serde(default)]
14  pub(super) data_id: Option<String>,
15  #[serde(default)]
16  pub(super) i18n: Option<I18nManifest>,
17}
18
19#[derive(Deserialize)]
20pub(super) struct I18nManifest {
21  #[serde(default)]
22  pub(super) locales: Vec<String>,
23  #[serde(default)]
24  pub(super) default: String,
25  #[serde(default)]
26  pub(super) mode: Option<String>,
27  #[serde(default)]
28  pub(super) cache: bool,
29  #[serde(default)]
30  pub(super) route_hashes: HashMap<String, String>,
31  #[serde(default)]
32  pub(super) content_hashes: HashMap<String, HashMap<String, String>>,
33}
34
35#[derive(Deserialize)]
36pub(super) struct LayoutEntry {
37  pub(super) template: Option<String>,
38  #[serde(default)]
39  pub(super) templates: Option<HashMap<String, String>>,
40  #[serde(default)]
41  pub(super) loaders: serde_json::Value,
42  #[serde(default)]
43  pub(super) parent: Option<String>,
44  #[serde(default)]
45  pub(super) i18n_keys: Vec<String>,
46}
47
48#[derive(Deserialize)]
49pub(super) struct RouteEntry {
50  pub(super) template: Option<String>,
51  #[serde(default)]
52  pub(super) templates: Option<HashMap<String, String>>,
53  #[serde(default)]
54  pub(super) layout: Option<String>,
55  #[serde(default)]
56  pub(super) loaders: serde_json::Value,
57  #[serde(default)]
58  pub(super) head_meta: Option<String>,
59  #[serde(default)]
60  pub(super) i18n_keys: Vec<String>,
61  #[serde(default)]
62  pub(super) projections: Option<HashMap<String, Vec<String>>>,
63}
64
65/// Pick a template path: prefer singular `template`, fall back to default locale or first value.
66pub(super) fn pick_template(
67  single: &Option<String>,
68  multi: &Option<HashMap<String, String>>,
69  default_locale: Option<&str>,
70) -> Option<String> {
71  if let Some(t) = single {
72    return Some(t.clone());
73  }
74  if let Some(map) = multi {
75    // Prefer the default locale from manifest
76    if let Some(loc) = default_locale
77      && let Some(t) = map.get(loc)
78    {
79      return Some(t.clone());
80    }
81    return map.values().next().cloned();
82  }
83  None
84}
85
86#[derive(Deserialize)]
87pub(super) struct LoaderConfig {
88  pub(super) procedure: String,
89  #[serde(default)]
90  pub(super) params: HashMap<String, ParamConfig>,
91}
92
93#[derive(Deserialize)]
94pub(super) struct ParamConfig {
95  pub(super) from: String,
96  #[serde(rename = "type", default = "default_type")]
97  pub(super) param_type: String,
98}
99
100pub(super) fn default_type() -> String {
101  "string".to_string()
102}
103
104/// RPC hash map loaded from build output. Maps hashed names back to original procedure names.
105#[derive(Deserialize, Clone, Debug)]
106pub struct RpcHashMap {
107  pub salt: String,
108  pub batch: String,
109  pub procedures: HashMap<String, String>,
110}
111
112impl RpcHashMap {
113  /// Build a reverse lookup: hash -> original name
114  pub fn reverse_lookup(&self) -> HashMap<String, String> {
115    self.procedures.iter().map(|(name, hash)| (hash.clone(), name.clone())).collect()
116  }
117}