1use crate::{components::lenra, from_value};
2
3include!("gen/manifest.rs");
4
5impl Default for Manifest {
6 fn default() -> Self {
7 Manifest::builder().try_into().unwrap()
8 }
9}
10
11impl Into<ComponentsView> for lenra::builder::View {
12 fn into(self) -> ComponentsView {
13 let view: lenra::View = self.try_into().unwrap();
14 ComponentsView {
15 context: view.context,
16 find: view.find.map(|find| find.into()),
17 name: view.name,
18 props: view.props.map(|props| props.into()),
19 type_: view.type_,
20 }
21 }
22}
23
24impl Into<DefsProps> for lenra::DefsProps {
25 fn into(self) -> DefsProps {
26 DefsProps(self.0)
27 }
28}
29
30impl Into<DataQuery> for lenra::DataQuery {
31 fn into(self) -> DataQuery {
32 DataQuery(self.0)
33 }
34}
35
36impl Into<DataProjection> for lenra::DataProjection {
37 fn into(self) -> DataProjection {
38 DataProjection(self.0)
39 }
40}
41
42impl Into<ComponentsViewDefinitionsFind> for lenra::ViewDefinitionsFind {
43 fn into(self) -> ComponentsViewDefinitionsFind {
44 ComponentsViewDefinitionsFind {
45 coll: self.coll,
46 query: self.query.into(),
47 projection: self.projection.map(|projection| projection.into()),
48 }
49 }
50}
51
52from_value!(DefsProps);
53from_value!(DataQuery);
54from_value!(DataProjection);
55
56#[cfg(test)]
57mod test {
58 use std::vec;
59
60 use serde_json::{json, Map, Value};
61
62 use crate::components::lenra::{self, view, ViewDefinitionsFind};
63
64 use super::*;
65
66 fn path_user_to_counter_route((path, user): (&str, &str)) -> Result<Route, String> {
67 let query: DataQuery =
68 Map::from_iter([("user".to_string(), Value::String(user.into()))]).into();
69 let find: ComponentsViewDefinitionsFind = ComponentsViewDefinitionsFind::builder()
70 .coll("counter")
71 .query(query)
72 .try_into()?;
73 Route::builder()
74 .path(path)
75 .view(
76 ComponentsView::builder()
77 .type_("view")
78 .name("counter")
79 .find(find),
80 )
81 .try_into()
82 }
83
84 #[test]
85 fn only_json_routes() -> Result<(), String> {
86 let manifest: Manifest = Manifest::builder()
87 .json(Some(
88 Exposer::builder()
89 .routes(
90 vec![("/counter/global", "global"), ("/counter/me", "@me")]
91 .iter()
92 .map(|&(path, user)| path_user_to_counter_route((path, user)))
93 .collect::<Result<Vec<Route>, String>>()?,
94 )
95 .try_into()?,
96 ))
97 .try_into()?;
98
99 assert_eq!(
100 format!(
101 "{}",
102 serde_json::to_string(&manifest).map_err(|er| er.to_string())?
103 ),
104 r#"{"json":{"routes":[{"path":"/counter/global","view":{"find":{"coll":"counter","query":{"user":"global"}},"name":"counter","_type":"view"}},{"path":"/counter/me","view":{"find":{"coll":"counter","query":{"user":"@me"}},"name":"counter","_type":"view"}}]}}"#
105 );
106 Ok(())
107 }
108
109 #[test]
110 fn from_lenra_view() -> Result<(), String> {
111 let manifest: Manifest = Manifest::builder()
112 .json(Some(
113 Exposer::builder()
114 .routes(vec![Route::builder()
115 .path("/counter/global")
116 .view(
117 view("counter").find(Some(
118 ViewDefinitionsFind::builder()
119 .coll("counter")
120 .query(lenra::DataQuery::from(Map::from_iter(vec![(
121 "user".to_string(),
122 Value::String("global".into()),
123 )])))
124 .try_into()
125 .unwrap(),
126 )),
127 )
128 .try_into()?])
129 .try_into()?,
130 ))
131 .try_into()?;
132
133 assert_eq!(
134 format!(
135 "{}",
136 serde_json::to_string(&manifest).map_err(|er| er.to_string())?
137 ),
138 r#"{"json":{"routes":[{"path":"/counter/global","view":{"find":{"coll":"counter","query":{"user":"global"}},"name":"counter","_type":"view"}}]}}"#
139 );
140 Ok(())
141 }
142
143 #[test]
144 fn from_string() -> Result<(), String> {
145 let manifest: Manifest = serde_json::from_str(
146 r#"{"json":{"routes":[{"path":"/counter/global","view":{"find":{"coll":"counter","query":{"user":"global"}},"name":"counter","_type":"view"}},{"path":"/counter/me","view":{"find":{"coll":"counter","query":{"user":"@me"}},"name":"counter","_type":"view"}}]}}"#,
147 ).map_err(|er| er.to_string())?;
148
149 assert_eq!(
150 format!(
151 "{}",
152 serde_json::to_string(&manifest).map_err(|er| er.to_string())?
153 ),
154 r#"{"json":{"routes":[{"path":"/counter/global","view":{"find":{"coll":"counter","query":{"user":"global"}},"name":"counter","_type":"view"}},{"path":"/counter/me","view":{"find":{"coll":"counter","query":{"user":"@me"}},"name":"counter","_type":"view"}}]}}"#
155 );
156 Ok(())
157 }
158
159 #[test]
160 fn from_json_definition() -> Result<(), String> {
161 let value: Value = json!(
162 {
163 "json": {
164 "routes": [
165 {
166 "path": "/counter/global",
167 "view": {
168 "_type": "view",
169 "name": "counter",
170 "find": {
171 "coll": "counter",
172 "query": {
173 "user": "global"
174 }
175 }
176 }
177 },
178 {
179 "path": "/counter/me",
180 "view": {
181 "_type": "view",
182 "name": "counter",
183 "find": {
184 "coll": "counter",
185 "query": {
186 "user": "@me"
187 }
188 }
189 }
190 }
191 ]
192 }
193 }
194 );
195 let manifest: Manifest = serde_json::from_value(value).map_err(|er| er.to_string())?;
196
197 assert_eq!(
198 format!(
199 "{}",
200 serde_json::to_string(&manifest).map_err(|er| er.to_string())?
201 ),
202 r#"{"json":{"routes":[{"path":"/counter/global","view":{"find":{"coll":"counter","query":{"user":"global"}},"name":"counter","_type":"view"}},{"path":"/counter/me","view":{"find":{"coll":"counter","query":{"user":"@me"}},"name":"counter","_type":"view"}}]}}"#
203 );
204 Ok(())
205 }
206}