1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
// ┃ Copyright: (c) 2023, Mike 'PhiSyX' S. (https://github.com/PhiSyX)         ┃
// ┃ SPDX-License-Identifier: MPL-2.0                                          ┃
// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
// ┃                                                                           ┃
// ┃  This Source Code Form is subject to the terms of the Mozilla Public      ┃
// ┃  License, v. 2.0. If a copy of the MPL was not distributed with this      ┃
// ┃  file, You can obtain one at https://mozilla.org/MPL/2.0/.                ┃
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

mod interface;

pub use self::interface::StateInterface;

// --------- //
// Structure //
// --------- //

/// État de l'application.
#[derive(Clone)]
pub struct State<UserState> {
	#[cfg(feature = "cookies")]
	pub cookie_key: Option<tower_cookies::Key>,
	#[cfg(feature = "database-postgres")]
	pub database_postgres:
		Option<crate::database::services::postgres::PostgresService>,
	/// État utilisateur.
	pub user_state: Option<UserState>,
}

// -------------- //
// Implémentation // -> Interface
// -------------- //

#[cfg(feature = "cookies")]
impl<US> axum::extract::FromRef<State<US>> for tower_cookies::Key {
	fn from_ref(state: &State<US>) -> Self {
		state.cookie_key.clone().expect(
			"Veuillez définir une clé de cookie dans votre application. \
			 `your_app.server.define_encrypt_key(&key)`.",
		)
	}
}

#[cfg(feature = "database-postgres")]
impl<US> axum::extract::FromRef<State<US>>
	for crate::database::services::postgres::PostgresService
{
	fn from_ref(state: &State<US>) -> Self {
		state.database_postgres.clone().expect(
			"Veuillez définir la connexion à la base de données dans votre \
			 application. Utilisez: \
			 `your_app.server.using_database_postgres_service(&database_url)`.",
		)
	}
}

impl axum::extract::FromRef<State<()>> for () {
	fn from_ref(_: &State<()>) -> Self {}
}