seam_server/build_loader/
types.rs1use std::collections::HashMap;
4
5use serde::Deserialize;
6
7#[derive(Deserialize)]
8pub(super) struct RouteManifest {
9 #[serde(default)]
10 pub(super) layouts: HashMap<String, LayoutEntry>,
11 pub(super) routes: HashMap<String, RouteEntry>,
12 #[serde(default)]
13 pub(super) data_id: Option<String>,
14 #[serde(default)]
15 pub(super) i18n: Option<I18nManifest>,
16}
17
18#[derive(Deserialize)]
19pub(super) struct I18nManifest {
20 #[serde(default)]
21 pub(super) locales: Vec<String>,
22 #[serde(default)]
23 pub(super) default: String,
24 #[serde(default)]
25 pub(super) mode: Option<String>,
26 #[serde(default)]
27 pub(super) cache: bool,
28 #[serde(default)]
29 pub(super) route_hashes: HashMap<String, String>,
30 #[serde(default)]
31 pub(super) content_hashes: HashMap<String, HashMap<String, String>>,
32}
33
34#[derive(Deserialize)]
35pub(super) struct LayoutEntry {
36 pub(super) template: Option<String>,
37 #[serde(default)]
38 pub(super) templates: Option<HashMap<String, String>>,
39 #[serde(default)]
40 pub(super) loaders: serde_json::Value,
41 #[serde(default)]
42 pub(super) parent: Option<String>,
43 #[serde(default)]
44 pub(super) i18n_keys: Vec<String>,
45}
46
47#[derive(Deserialize)]
48pub(super) struct RouteEntry {
49 pub(super) template: Option<String>,
50 #[serde(default)]
51 pub(super) templates: Option<HashMap<String, String>>,
52 #[serde(default)]
53 pub(super) layout: Option<String>,
54 #[serde(default)]
55 pub(super) loaders: serde_json::Value,
56 #[serde(default)]
57 pub(super) head_meta: Option<String>,
58 #[serde(default)]
59 pub(super) i18n_keys: Vec<String>,
60 #[serde(default)]
61 pub(super) projections: Option<HashMap<String, Vec<String>>>,
62}
63
64pub(super) fn pick_template(
66 single: &Option<String>,
67 multi: &Option<HashMap<String, String>>,
68 default_locale: Option<&str>,
69) -> Option<String> {
70 if let Some(t) = single {
71 return Some(t.clone());
72 }
73 if let Some(map) = multi {
74 if let Some(loc) = default_locale
76 && let Some(t) = map.get(loc)
77 {
78 return Some(t.clone());
79 }
80 return map.values().next().cloned();
81 }
82 None
83}
84
85#[derive(Deserialize)]
86pub(super) struct LoaderConfig {
87 pub(super) procedure: String,
88 #[serde(default)]
89 pub(super) params: HashMap<String, ParamConfig>,
90}
91
92pub(super) struct ParamConfig {
94 pub(super) from: String,
95 pub(super) param_type: String,
96}
97
98pub(super) fn default_type() -> String {
99 "string".to_string()
100}
101
102impl<'de> serde::Deserialize<'de> for ParamConfig {
103 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
104 where
105 D: serde::Deserializer<'de>,
106 {
107 let value = serde_json::Value::deserialize(deserializer)?;
108 match value {
109 serde_json::Value::String(s) => Ok(ParamConfig { from: s, param_type: default_type() }),
110 serde_json::Value::Object(map) => {
111 let from = map
112 .get("from")
113 .and_then(|v| v.as_str())
114 .ok_or_else(|| serde::de::Error::missing_field("from"))?
115 .to_string();
116 let param_type =
117 map.get("type").and_then(|v| v.as_str()).map(String::from).unwrap_or_else(default_type);
118 Ok(ParamConfig { from, param_type })
119 }
120 _ => Err(serde::de::Error::custom("expected string or object")),
121 }
122 }
123}
124
125#[derive(Deserialize, Clone, Debug)]
127pub struct RpcHashMap {
128 pub salt: String,
129 pub batch: String,
130 pub procedures: HashMap<String, String>,
131}
132
133impl RpcHashMap {
134 pub fn reverse_lookup(&self) -> HashMap<String, String> {
136 self.procedures.iter().map(|(name, hash)| (hash.clone(), name.clone())).collect()
137 }
138}