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) versions: HashMap<String, String>,
27}
28
29#[derive(Deserialize)]
30pub(super) struct LayoutEntry {
31  pub(super) template: Option<String>,
32  #[serde(default)]
33  pub(super) templates: Option<HashMap<String, String>>,
34  #[serde(default)]
35  pub(super) loaders: serde_json::Value,
36  #[serde(default)]
37  pub(super) parent: Option<String>,
38  #[serde(default)]
39  pub(super) i18n_keys: Vec<String>,
40}
41
42#[derive(Deserialize)]
43pub(super) struct RouteEntry {
44  pub(super) template: Option<String>,
45  #[serde(default)]
46  pub(super) templates: Option<HashMap<String, String>>,
47  #[serde(default)]
48  pub(super) layout: Option<String>,
49  #[serde(default)]
50  pub(super) loaders: serde_json::Value,
51  #[serde(default)]
52  pub(super) head_meta: Option<String>,
53  #[serde(default)]
54  pub(super) i18n_keys: Vec<String>,
55}
56
57/// Pick a template path: prefer singular `template`, fall back to default locale or first value.
58pub(super) fn pick_template(
59  single: &Option<String>,
60  multi: &Option<HashMap<String, String>>,
61  default_locale: Option<&str>,
62) -> Option<String> {
63  if let Some(t) = single {
64    return Some(t.clone());
65  }
66  if let Some(map) = multi {
67    // Prefer the default locale from manifest
68    if let Some(loc) = default_locale {
69      if let Some(t) = map.get(loc) {
70        return Some(t.clone());
71      }
72    }
73    return map.values().next().cloned();
74  }
75  None
76}
77
78#[derive(Deserialize)]
79pub(super) struct LoaderConfig {
80  pub(super) procedure: String,
81  #[serde(default)]
82  pub(super) params: HashMap<String, ParamConfig>,
83}
84
85#[derive(Deserialize)]
86pub(super) struct ParamConfig {
87  pub(super) from: String,
88  #[serde(rename = "type", default = "default_type")]
89  pub(super) param_type: String,
90}
91
92pub(super) fn default_type() -> String {
93  "string".to_string()
94}
95
96/// RPC hash map loaded from build output. Maps hashed names back to original procedure names.
97#[derive(Deserialize, Clone, Debug)]
98pub struct RpcHashMap {
99  pub salt: String,
100  pub batch: String,
101  pub procedures: HashMap<String, String>,
102}
103
104impl RpcHashMap {
105  /// Build a reverse lookup: hash -> original name
106  pub fn reverse_lookup(&self) -> HashMap<String, String> {
107    self.procedures.iter().map(|(name, hash)| (hash.clone(), name.clone())).collect()
108  }
109}