use crate::models::{ModelExtractPayload, ResponseStatus, ServerResponse};
use axum::{
body::{Body, Bytes},
http::StatusCode,
response::IntoResponse,
response::Response,
Json,
};
use tracing;
pub async fn extract_model_name(body: Body) -> Result<(String, Bytes), Box<Response>> {
let body_bytes = match axum::body::to_bytes(body, usize::MAX).await {
Ok(bytes) => bytes,
Err(e) => {
tracing::error!("Failed to read request body: {}", e);
return Err(Box::new(
(
StatusCode::BAD_REQUEST,
Json(ServerResponse {
status: ResponseStatus::Error,
message: "Failed to read request body".to_string(),
}),
)
.into_response(),
));
}
};
let model_payload: ModelExtractPayload = match serde_json::from_slice(&body_bytes) {
Ok(payload) => payload,
Err(e) => {
tracing::warn!("Failed to parse JSON body for model extraction: {}", e);
return Err(Box::new(
(
StatusCode::BAD_REQUEST,
Json(ServerResponse {
status: ResponseStatus::Error,
message: format!("Invalid JSON body: {}", e),
}),
)
.into_response(),
));
}
};
let model_name = match model_payload.model {
Some(name) if !name.trim().is_empty() => name.trim().to_string(),
_ => {
tracing::warn!("Model name missing or empty in request body.");
return Err(Box::new(
(
StatusCode::BAD_REQUEST,
Json(ServerResponse {
status: ResponseStatus::Error,
message: "Model name is required in the request body".to_string(),
}),
)
.into_response(),
));
}
};
tracing::debug!("Extracted model name: {model_name}");
Ok((model_name, body_bytes))
}