lexa_framework/view/interface.rs
1// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
2// ┃ Copyright: (c) 2023, Mike 'PhiSyX' S. (https://github.com/PhiSyX) ┃
3// ┃ SPDX-License-Identifier: MPL-2.0 ┃
4// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
5// ┃ ┃
6// ┃ This Source Code Form is subject to the terms of the Mozilla Public ┃
7// ┃ License, v. 2.0. If a copy of the MPL was not distributed with this ┃
8// ┃ file, You can obtain one at https://mozilla.org/MPL/2.0/. ┃
9// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
10
11// --------- //
12// Interface //
13// --------- //
14
15pub trait ViewInterface {
16 type Metadata: Default;
17 type Scripts: Default;
18 type Styles: Default;
19 type View;
20
21 /// Mise en page de la vue.
22 type Layout: ViewLayoutInterface<
23 Metadata = Self::Metadata,
24 Scripts = Self::Scripts,
25 Styles = Self::Styles,
26 View = Self::View,
27 >;
28
29 /// Les méta-données de la vue.
30 ///
31 /// NOTE: Dans la mise en page par défaut, les méta-données sont appliquées
32 /// à l'intérieur de la balise `<head> ici </head>`. Elles correspondent
33 /// généralement aux balises `<meta>`.
34 fn metadata(&self) -> Self::Metadata {
35 Default::default()
36 }
37
38 /// Les scripts de la vue.
39 ///
40 /// NOTE: Dans la mise en page par défaut, les scripts sont appliqués avant
41 /// la fermeture l'intérieur de la balise `</body>`.
42 fn scripts(&self) -> Self::Scripts {
43 Default::default()
44 }
45
46 /// Les styles de la vue.
47 ///
48 /// NOTE: Dans la mise en page par défaut, les styles sont appliqués à
49 /// l'intérieur de la balise `<head> ici </head>`, après les méta-données.
50 fn styles(&self) -> Self::Styles {
51 Default::default()
52 }
53
54 /// Le titre de la vue.
55 fn title(&self) -> String;
56
57 /// L'HTML de la vue.
58 fn view(&self) -> Self::View;
59
60 /// Le rendu de la mise en page + de la vue.
61 fn render(&self) -> Self::View {
62 let mut layout = <Self::Layout>::new();
63
64 layout.set_title(self.title());
65 layout.set_body(self.view());
66
67 layout.add_meta(self.metadata());
68 layout.add_script(self.scripts());
69 layout.add_style(self.styles());
70
71 layout.view()
72 }
73}
74
75pub trait ViewLayoutInterface {
76 type Metadata: Default;
77 type Scripts: Default;
78 type Styles: Default;
79 type View;
80
81 /// Crée une nouvelle instance de la [mise en page](Self).
82 fn new() -> Self
83 where
84 Self: Sized;
85
86 /// Applique un titre au document de la mise en page.
87 fn set_title(&mut self, title: impl ToString);
88 /// Applique un corps à la mise en page.
89 fn set_body(&mut self, body: Self::View);
90
91 /// Ajoute une méta-données au document de la mise en page.
92 fn add_meta(&mut self, meta: Self::Metadata);
93 /// Ajoute un script au document de la mise en page.
94 fn add_script(&mut self, script: Self::Scripts);
95 /// Ajoute un style au document de la mise en page.
96 fn add_style(&mut self, style: Self::Styles);
97
98 /// L'HTML du document de la mise en page.
99 fn view(&self) -> Self::View;
100}