lenra_app/
manifest.rs

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}