use std::sync::Arc;
use axum::{
Json,
extract::{Path as AxumPath, State},
response::IntoResponse,
};
use serde::Deserialize;
use tracing::warn;
use super::{parse_id, record_to_summary};
use crate::daemon::rpc::managed::outcome::RouteOutcome;
use crate::daemon::state::DaemonState;
use crate::session_manager::ManagedError;
#[derive(Debug, Deserialize)]
pub struct RenameRequest {
pub name: String,
}
pub async fn rename_managed_session(
State(state): State<Arc<DaemonState>>,
AxumPath(id_str): AxumPath<String>,
Json(body): Json<RenameRequest>,
) -> impl IntoResponse {
rename_core(&state, &id_str, body).await }
pub(crate) async fn rename_core(
state: &Arc<DaemonState>,
id_str: &str,
body: RenameRequest,
) -> RouteOutcome {
let id = match parse_id(id_str) {
Ok(id) => id,
Err((code, msg)) => return RouteOutcome::text(code.as_u16(), msg),
};
let mgr = state.session_manager().await;
match mgr.rename(&id, &body.name).await {
Ok(record) => RouteOutcome::ok(&record_to_summary(&record)),
Err(ManagedError::SessionNotFound(_)) => {
RouteOutcome::text(404, format!("session {id_str} not found"))
}
Err(e @ ManagedError::NameCollision(_)) => RouteOutcome::text(409, e.to_string()),
Err(ManagedError::InvalidState(_, reason)) => RouteOutcome::text(400, reason),
Err(e) => {
warn!(id = %id_str, error = %e, "rename failed with an unmapped error");
RouteOutcome::text(500, e.to_string())
}
}
}