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}