Skip to main content

jax_daemon/http_server/api/v0/mounts/
list.rs

1//! List mounts API endpoint
2
3use axum::extract::State;
4use axum::response::{IntoResponse, Response};
5use axum::Json;
6use reqwest::{Client, RequestBuilder, Url};
7use serde::{Deserialize, Serialize};
8
9use super::create::MountInfo;
10use crate::http_server::api::client::ApiRequest;
11use crate::ServiceState;
12
13/// Request to list all mount configurations
14#[derive(Debug, Clone, Default, Serialize, Deserialize)]
15pub struct ListMountsRequest {}
16
17/// Response containing all mount configurations
18#[derive(Debug, Clone, Serialize, Deserialize)]
19pub struct ListMountsResponse {
20    pub mounts: Vec<MountInfo>,
21}
22
23pub async fn handler(
24    State(state): State<ServiceState>,
25) -> Result<impl IntoResponse, ListMountsError> {
26    let mount_manager = state.mount_manager().read().await;
27    let mount_manager = mount_manager
28        .as_ref()
29        .ok_or(ListMountsError::MountManagerUnavailable)?;
30
31    let mounts = mount_manager.list().await?;
32    let mount_infos: Vec<MountInfo> = mounts.into_iter().map(Into::into).collect();
33
34    Ok((
35        http::StatusCode::OK,
36        Json(ListMountsResponse {
37            mounts: mount_infos,
38        }),
39    )
40        .into_response())
41}
42
43#[derive(Debug, thiserror::Error)]
44pub enum ListMountsError {
45    #[error("Mount manager unavailable")]
46    MountManagerUnavailable,
47    #[error("Mount error: {0}")]
48    Mount(#[from] crate::fuse::MountError),
49}
50
51impl IntoResponse for ListMountsError {
52    fn into_response(self) -> Response {
53        match self {
54            ListMountsError::MountManagerUnavailable => (
55                http::StatusCode::SERVICE_UNAVAILABLE,
56                "Mount manager not available",
57            )
58                .into_response(),
59            ListMountsError::Mount(e) => (
60                http::StatusCode::INTERNAL_SERVER_ERROR,
61                format!("Mount error: {}", e),
62            )
63                .into_response(),
64        }
65    }
66}
67
68impl ApiRequest for ListMountsRequest {
69    type Response = ListMountsResponse;
70
71    fn build_request(self, base_url: &Url, client: &Client) -> RequestBuilder {
72        let full_url = base_url.join("/api/v0/mounts/").unwrap();
73        client.get(full_url)
74    }
75}