Skip to main content

seam_server/build_loader/
types.rs

1/* packages/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}
62
63/// Pick a template path: prefer singular `template`, fall back to default locale or first value.
64pub(super) fn pick_template(
65  single: &Option<String>,
66  multi: &Option<HashMap<String, String>>,
67  default_locale: Option<&str>,
68) -> Option<String> {
69  if let Some(t) = single {
70    return Some(t.clone());
71  }
72  if let Some(map) = multi {
73    // Prefer the default locale from manifest
74    if let Some(loc) = default_locale {
75      if let Some(t) = map.get(loc) {
76        return Some(t.clone());
77      }
78    }
79    return map.values().next().cloned();
80  }
81  None
82}
83
84#[derive(Deserialize)]
85pub(super) struct LoaderConfig {
86  pub(super) procedure: String,
87  #[serde(default)]
88  pub(super) params: HashMap<String, ParamConfig>,
89}
90
91#[derive(Deserialize)]
92pub(super) struct ParamConfig {
93  pub(super) from: String,
94  #[serde(rename = "type", default = "default_type")]
95  pub(super) param_type: String,
96}
97
98pub(super) fn default_type() -> String {
99  "string".to_string()
100}
101
102/// RPC hash map loaded from build output. Maps hashed names back to original procedure names.
103#[derive(Deserialize, Clone, Debug)]
104pub struct RpcHashMap {
105  pub salt: String,
106  pub batch: String,
107  pub procedures: HashMap<String, String>,
108}
109
110impl RpcHashMap {
111  /// Build a reverse lookup: hash -> original name
112  pub fn reverse_lookup(&self) -> HashMap<String, String> {
113    self.procedures.iter().map(|(name, hash)| (hash.clone(), name.clone())).collect()
114  }
115}