webserver_rs/
lib.rs

1#![cfg_attr(docsrs, feature(doc_cfg))]
2
3pub mod route;
4pub mod web_core;
5
6pub use assets::MemoryStream;
7pub use web_core::config;
8pub use web_core::*;
9
10pub use web_core::http_error::*;
11
12use salvo::prelude::*;
13
14pub use config_file::FromConfigFile;
15pub use route::build_cros;
16
17pub use salvo;
18
19pub use anyhow;
20pub use chrono;
21pub use futures;
22pub use serde;
23pub use serde_json;
24pub use time;
25pub use tokio;
26
27#[cfg(feature = "http3")]
28use salvo::conn::rustls::{Keycert, RustlsConfig};
29
30pub async fn serve(config: config::Config, serve_route: Router) -> anyhow::Result<()> {
31    tokio::fs::create_dir_all(config.pub_dir.clone()).await?;
32    let config_provider = config::InjectConfig(config.clone());
33    let _log_guard = log::set_log(config.log);
34
35    #[cfg(any(feature = "mysql", feature = "sqlite", feature = "postgres"))]
36    if let Some(v) = config.database {
37        db::init_db_if_enable(v).await?;
38    }
39
40    let root_router = if config.route_root.is_empty() {
41        Router::new().hoop(config_provider)
42    } else {
43        Router::with_path(config.route_root).hoop(config_provider)
44    };
45    let root_router = root_router
46        .push(serve_route)
47        .push(assets::common_assets(config.pub_dir, config.assets_listing));
48    let root_router = Router::new()
49        .push(Router::with_path("favicon.ico").get(assets::favicon_ico))
50        .push(root_router);
51    #[cfg(feature = "http3")]
52    {
53        let cert_and_key = web_core::config::read_cert_and_key(config.http3).await?;
54        let tls_config = RustlsConfig::new(
55            Keycert::new()
56                .cert(cert_and_key.0.as_slice())
57                .key(cert_and_key.1.as_slice()),
58        );
59        let listener = TcpListener::new(config.host.clone()).rustls(tls_config.clone());
60        let acceptor = QuinnListener::new(tls_config, config.host)
61            .join(listener)
62            .bind()
63            .await;
64        Server::new(acceptor).serve(root_router).await;
65    }
66    #[cfg(not(feature = "http3"))]
67    {
68        let acceptor = TcpListener::new(config.host).bind().await;
69        Server::new(acceptor).serve(root_router).await;
70    }
71    Ok(())
72}
73
74pub mod prelude {
75    pub use crate::config::Config;
76    pub use crate::http_error::HttpResult;
77    pub use anyhow;
78    pub use chrono;
79    pub use config_file::FromConfigFile;
80    pub use salvo;
81    pub use serde;
82    pub use serde_json;
83    pub use time;
84    pub use tokio;
85}