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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
//! This module contains the core components and traits for building a web
//! server application.
cfg_if!
use async_trait;
use crate::;
/// Represents the application context for a web server.
///
/// This struct encapsulates various components and configurations required by
/// the web server to operate. It is typically used to store and manage shared
/// resources and settings that are accessible throughout the application's
/// lifetime.
/// A trait that defines hooks for customizing and extending the behavior of a
/// web server application.
///
/// Users of the web server application should implement this trait to customize
/// the application's routing, worker connections, task registration, and
/// database actions according to their specific requirements and use cases.
///
/// # Example
///
/// ```rust
/// # #[cfg(feature = "with-db")] {
/// use loco_rs::{
/// app::{AppContext, Hooks},
/// controller::AppRoutes,
/// db::{self, truncate_table},
/// task::Tasks,
/// worker::{AppWorker, Processor},
/// Result,
/// };
/// use sea_orm::DatabaseConnection;
/// use std::path::Path;
/// use async_trait::async_trait;
///
/// pub struct App;
/// #[async_trait]
/// impl Hooks for App {
///
/// fn app_name() -> &'static str {
/// env!("CARGO_CRATE_NAME")
/// }
///
/// fn routes() -> AppRoutes {
/// AppRoutes::with_default_routes()
/// // .add_route(controllers::notes::routes())
/// // .add_route(controllers::auth::routes())
/// }
///
/// fn connect_workers<'a>(p: &'a mut Processor, ctx: &'a AppContext) {
/// // p.register(DownloadWorker::build(ctx));
/// }
///
/// fn register_tasks(tasks: &mut Tasks) {
/// // tasks.register(UserReport);
/// }
///
/// async fn truncate(db: &DatabaseConnection) -> Result<()> {
/// // truncate_table(db, users::Entity).await?;
/// // truncate_table(db, notes::Entity).await?;
/// Ok(())
/// }
///
/// async fn seed(db: &DatabaseConnection, base: &Path) -> Result<()> {
/// // db::seed::<users::ActiveModel>(db, &base.join("users.yaml").display().to_string()).await?;
/// Ok(())
/// }
/// }
/// }
/// ```