use axum::body::Body; use axum::http::Response; use axum::body::Bytes; use serde::de::DeserializeOwned; /// Parse a response body into a serde_json::Value pub async fn parse_response_value(resp: Response, limit: usize) -> serde_json::Value { let bytes: Bytes = axum::body::to_bytes(resp.into_body(), limit).await.unwrap(); serde_json::from_slice(&bytes).unwrap() } /// Parse a response body into a typed DTO pub async fn parse_response(resp: Response, limit: usize) -> T { let bytes: Bytes = axum::body::to_bytes(resp.into_body(), limit).await.unwrap(); serde_json::from_slice(&bytes).unwrap() } /// Convenience: parse and return the inner "data" field if the response uses the standard wrapper pub async fn parse_response_data(resp: Response, limit: usize) -> T { let v = parse_response_value(resp, limit).await; // If response uses { "data": ... } wrapper, extract it; otherwise try to parse the whole body as T if let Some(inner) = v.get("data") { serde_json::from_value(inner.clone()).unwrap() } else { serde_json::from_value(v).unwrap() } }