snix_castore_http/
router.rs

1use crate::app_state::{AppConfig, AppState};
2use crate::routes;
3
4use snix_castore::Node;
5use snix_castore::utils::ServiceUrlsGrpc;
6
7use axum::{Router, routing::get};
8use std::sync::Arc;
9use tokio_listener::ListenerAddressLFlag;
10use tracing::info;
11
12/// Runs the snix-castore-http server given the specified CLI arguments
13pub async fn gen_router(
14    listen_args: ListenerAddressLFlag,
15    service_addrs: ServiceUrlsGrpc,
16    root_node: Node,
17    index_names: &[String],
18    auto_index: bool,
19) -> anyhow::Result<()> {
20    let (blob_service, directory_service) = snix_castore::utils::construct_services(service_addrs)
21        .await
22        .expect("failed to construct services");
23
24    let app_state = Arc::new(AppConfig {
25        blob_service,
26        directory_service,
27        root_node,
28        index_names: index_names.to_vec(),
29        auto_index,
30    });
31
32    let app = app(app_state);
33
34    let listen_address = &listen_args.listen_address.unwrap_or_else(|| {
35        "[::]:9000"
36            .parse()
37            .expect("invalid fallback listen address")
38    });
39
40    let listener = tokio_listener::Listener::bind(
41        listen_address,
42        &Default::default(),
43        &listen_args.listener_options,
44    )
45    .await?;
46
47    info!(listen_address=%listen_address, "starting daemon");
48
49    tokio_listener::axum07::serve(
50        listener,
51        app.into_make_service_with_connect_info::<tokio_listener::SomeSocketAddrClonable>(),
52    )
53    .await?;
54    Ok(())
55}
56
57pub fn app(app_state: AppState) -> Router {
58    Router::new()
59        .route("/*path", get(routes::root_node_contents))
60        .route("/", get(routes::root_node_contents))
61        .with_state(app_state)
62}