Skip to main content

ruest/
lib.rs

1//! # RUEST
2//!
3//! Backend framework for Rust — **Rust + NestJS** (NestJS DX, performance Rust, Axum).
4//!
5//! Un seul package framework : `cargo add ruest` (+ `ruest-macros` en dépendance transitive).
6//! Base de données optionnelle : `cargo add ruest-db`.
7
8mod bootstrap;
9
10pub mod config;
11pub mod core;
12pub mod di;
13pub mod http;
14pub mod logger;
15pub mod router;
16pub mod security;
17pub mod testing;
18pub mod validation;
19
20pub use async_trait;
21
22pub use bootstrap::{bootstrap_app, AppBuilder, ModuleWireRoutes};
23pub use ruest_macros::{
24    controller, delete, dto, get, guard, middleware, module, patch, post, put, routes, service,
25};
26
27pub use core::{bootstrap, CoreError, HttpModule, Module, RuestApplication, RuestFactory};
28pub use di::{Container, Inject, Scope};
29pub use http::{
30    serve, Body, Bytes, ConnectInfo, Form, Json, MatchedPath, Multipart, OriginalUri, Path, Query,
31    State, WebSocket, WebSocketUpgrade,
32};
33pub use http::{ws, Message as WebSocketMessage};
34pub use validation::{Validate, ValidatedJson};
35pub use http::{AppError, AppResult};
36pub use security::{
37    apply_jwt_layer, register_jwt_provider, AuthContext, AuthUser, Guard, JwtDevProvider,
38    JwtGuard, JwtService, RolesGuard, RuestClaims, SecurityConfig, SecurityConfigBuilder,
39    SecurityError,
40};
41
42/// Erreur HTTP lisible : `return Err(ruest_err!(BadRequest, "message"));`
43#[macro_export]
44macro_rules! ruest_err {
45    (BadRequest, $msg:expr) => {
46        $crate::AppError::bad_request($msg)
47    };
48    (NotFound, $msg:expr) => {
49        $crate::AppError::not_found($msg)
50    };
51    (Conflict, $msg:expr) => {
52        $crate::AppError::conflict($msg)
53    };
54    (Internal, $msg:expr) => {
55        $crate::AppError::internal($msg)
56    };
57    (Unauthorized, $msg:expr) => {
58        $crate::AppError::unauthorized($msg)
59    };
60    (Forbidden, $msg:expr) => {
61        $crate::AppError::forbidden($msg)
62    };
63}
64
65/// Prelude for application code.
66pub mod prelude {
67    pub use crate::{
68        apply_jwt_layer, bootstrap_app, controller, delete, get, guard, module, patch, post, put,
69        register_jwt_provider, routes, service, async_trait, ruest_err, AppBuilder, AppError,
70        AppResult, AuthContext, AuthUser, Body, Bytes, ConnectInfo, CoreError, Form, HttpModule,
71        Inject, Json, JwtDevProvider, JwtGuard, JwtService, MatchedPath, Module, ModuleWireRoutes,
72        Multipart, OriginalUri, Path, Query, RolesGuard, RuestApplication, RuestClaims,
73        SecurityConfig, SecurityConfigBuilder, SecurityError, State, Validate, ValidatedJson,
74        WebSocket, WebSocketMessage, WebSocketUpgrade, logger,
75    };
76}
77
78#[cfg(test)]
79mod tests {
80    use super::*;
81    use crate::core::ModuleMetadata;
82
83    struct EmptyModule;
84
85    impl Module for EmptyModule {
86        fn metadata(&self) -> ModuleMetadata {
87            ModuleMetadata::default()
88        }
89    }
90
91    impl ModuleWireRoutes for EmptyModule {
92        fn wire_routes(
93            router: http::axum::Router,
94            _container: &di::Container,
95        ) -> Result<http::axum::Router, di::DiError> {
96            Ok(router)
97        }
98    }
99
100    #[test]
101    fn bootstrap_empty_module() {
102        let _ = bootstrap_app(EmptyModule).expect("bootstrap");
103    }
104}