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}