mirror of
https://github.com/neondatabase/neon.git
synced 2026-01-14 08:52:56 +00:00
Migrates the remaining crates to edition 2024. We like to stay on the latest edition if possible. There is no functional changes, however some code changes had to be done to accommodate the edition's breaking changes. Like the previous migration PRs, this is comprised of three commits: * the first does the edition update and makes `cargo check`/`cargo clippy` pass. we had to update bindgen to make its output [satisfy the requirements of edition 2024](https://doc.rust-lang.org/edition-guide/rust-2024/unsafe-extern.html) * the second commit does a `cargo fmt` for the new style edition. * the third commit reorders imports as a one-off change. As before, it is entirely optional. Part of #10918
66 lines
2.2 KiB
Rust
66 lines
2.2 KiB
Rust
use anyhow::Context;
|
|
use bytes::Buf;
|
|
use hyper::{Body, Request, Response, StatusCode, header};
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
use super::error::ApiError;
|
|
|
|
/// Parse a json request body and deserialize it to the type `T`.
|
|
pub async fn json_request<T: for<'de> Deserialize<'de>>(
|
|
request: &mut Request<Body>,
|
|
) -> Result<T, ApiError> {
|
|
let body = hyper::body::aggregate(request.body_mut())
|
|
.await
|
|
.context("Failed to read request body")
|
|
.map_err(ApiError::BadRequest)?;
|
|
|
|
if body.remaining() == 0 {
|
|
return Err(ApiError::BadRequest(anyhow::anyhow!(
|
|
"missing request body"
|
|
)));
|
|
}
|
|
|
|
let mut deser = serde_json::de::Deserializer::from_reader(body.reader());
|
|
|
|
serde_path_to_error::deserialize(&mut deser)
|
|
// intentionally stringify because the debug version is not helpful in python logs
|
|
.map_err(|e| anyhow::anyhow!("Failed to parse json request: {e}"))
|
|
.map_err(ApiError::BadRequest)
|
|
}
|
|
|
|
/// Parse a json request body and deserialize it to the type `T`. If the body is empty, return `T::default`.
|
|
pub async fn json_request_maybe<T: for<'de> Deserialize<'de> + Default>(
|
|
request: &mut Request<Body>,
|
|
) -> Result<T, ApiError> {
|
|
let body = hyper::body::aggregate(request.body_mut())
|
|
.await
|
|
.context("Failed to read request body")
|
|
.map_err(ApiError::BadRequest)?;
|
|
|
|
if body.remaining() == 0 {
|
|
return Ok(T::default());
|
|
}
|
|
|
|
let mut deser = serde_json::de::Deserializer::from_reader(body.reader());
|
|
|
|
serde_path_to_error::deserialize(&mut deser)
|
|
// intentionally stringify because the debug version is not helpful in python logs
|
|
.map_err(|e| anyhow::anyhow!("Failed to parse json request: {e}"))
|
|
.map_err(ApiError::BadRequest)
|
|
}
|
|
|
|
pub fn json_response<T: Serialize>(
|
|
status: StatusCode,
|
|
data: T,
|
|
) -> Result<Response<Body>, ApiError> {
|
|
let json = serde_json::to_string(&data)
|
|
.context("Failed to serialize JSON response")
|
|
.map_err(ApiError::InternalServerError)?;
|
|
let response = Response::builder()
|
|
.status(status)
|
|
.header(header::CONTENT_TYPE, "application/json")
|
|
.body(Body::from(json))
|
|
.map_err(|e| ApiError::InternalServerError(e.into()))?;
|
|
Ok(response)
|
|
}
|