Skip to main content

fr_rust/server/
run.rs

1#[macro_export]
2macro_rules! run {
3    (
4        // addr is mandatory, the rest are wrapped in $(...)? to make them optional
5        addr: $addr:expr
6        $(, state: $state:expr )?
7        $(, config: $config:expr )?
8        $(, configure_app: |$app:ident| $app_body:expr )?
9        $(, configure_server: |$server:ident| $server_body:expr )?
10        $(,)? // Handles an optional trailing comma at the very end of the macro call
11    ) => {{
12        use actix_web::{web, App, HttpServer};
13        use std::net::SocketAddr;
14
15        let bind_addr: SocketAddr = $addr.parse()
16            .expect("Invalid socket address format");
17
18        let mut server = HttpServer::new(move || {
19            let mut app = App::new()
20                .wrap(actix_web::middleware::NormalizePath::new(actix_web::middleware::TrailingSlash::Trim))
21                .wrap(actix_web::middleware::Compress::default());
22            
23            // Evaluated at compile-time: Only included if state is passed
24            $(
25                app = app.app_data(web::Data::new($state.clone()));
26            )?
27
28            // Evaluated at compile-time: Only included if configure_app is passed
29            $(
30                let mut $app = app;
31                $app = $app_body;
32                app = $app;
33            )?
34
35            // Evaluated at compile-time: Only fallback to standard config if passed
36            $(
37                app = app.configure($config);
38            )?
39
40            app
41        })
42        .bind(bind_addr)?;
43
44        // Evaluated at compile-time: Only included if configure_server is passed
45        $(
46            let mut $server = server;
47            $server = $server_body;
48            server = $server;
49        )?
50
51        server.run().await
52    }};
53}