jax_daemon/http_server/api/v0/mounts/
list.rs1use 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#[derive(Debug, Clone, Default, Serialize, Deserialize)]
15pub struct ListMountsRequest {}
16
17#[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}