use axum::http::{HeaderMap, StatusCode};
use serde::de::DeserializeOwned;
use crate::{
ETag,
handler_error::{HandlerError, RfcOk},
};
use api_bones::bulk::BulkResponse;
use api_bones::pagination::{CursorPaginatedResponse, KeysetPaginatedResponse, PaginatedResponse};
fn deserialize_data<T: DeserializeOwned>(ok: RfcOk<T>) -> T {
serde_json::from_value(ok.body_json()["data"].clone())
.expect("RfcOk body did not contain a deserializable `data` field")
}
pub fn payload<T: DeserializeOwned>(ok: RfcOk<T>) -> T {
deserialize_data(ok)
}
pub fn list_payload<T: DeserializeOwned>(ok: RfcOk<PaginatedResponse<T>>) -> PaginatedResponse<T> {
deserialize_data(ok)
}
pub fn cursor_payload<T: DeserializeOwned>(
ok: RfcOk<CursorPaginatedResponse<T>>,
) -> CursorPaginatedResponse<T> {
deserialize_data(ok)
}
pub fn keyset_payload<T: DeserializeOwned>(
ok: RfcOk<KeysetPaginatedResponse<T>>,
) -> KeysetPaginatedResponse<T> {
deserialize_data(ok)
}
pub fn bulk_payload<T: DeserializeOwned>(ok: RfcOk<BulkResponse<T>>) -> BulkResponse<T> {
deserialize_data(ok)
}
pub fn status<T>(ok: &RfcOk<T>) -> StatusCode {
ok.status()
}
pub fn headers<T>(ok: &RfcOk<T>) -> &HeaderMap {
ok.headers()
}
pub fn etag_header<T>(ok: &RfcOk<T>) -> ETag {
let value = ok
.headers()
.get(axum::http::header::ETAG)
.expect("RfcOk did not contain an ETag header")
.to_str()
.expect("ETag header was not valid UTF-8");
value
.parse::<ETag>()
.expect("ETag header value could not be parsed as an ETag")
}
pub fn unwrap_ok<T: DeserializeOwned>(result: Result<RfcOk<T>, HandlerError>) -> T {
payload(result.expect("handler returned Err, expected Ok"))
}
pub fn unwrap_list<T: DeserializeOwned>(
result: Result<RfcOk<PaginatedResponse<T>>, HandlerError>,
) -> PaginatedResponse<T> {
list_payload(result.expect("handler returned Err, expected Ok"))
}
pub fn unwrap_cursor<T: DeserializeOwned>(
result: Result<RfcOk<CursorPaginatedResponse<T>>, HandlerError>,
) -> CursorPaginatedResponse<T> {
cursor_payload(result.expect("handler returned Err, expected Ok"))
}
pub fn unwrap_keyset<T: DeserializeOwned>(
result: Result<RfcOk<KeysetPaginatedResponse<T>>, HandlerError>,
) -> KeysetPaginatedResponse<T> {
keyset_payload(result.expect("handler returned Err, expected Ok"))
}
pub fn unwrap_bulk<T: DeserializeOwned>(
result: Result<RfcOk<BulkResponse<T>>, HandlerError>,
) -> BulkResponse<T> {
bulk_payload(result.expect("handler returned Err, expected Ok"))
}
pub fn unwrap_status<T: DeserializeOwned>(
result: Result<RfcOk<T>, HandlerError>,
) -> (StatusCode, T) {
let ok = result.expect("handler returned Err, expected Ok");
let s = ok.status();
(s, payload(ok))
}
pub fn unwrap_created<T: DeserializeOwned>(
result: Result<RfcOk<T>, HandlerError>,
) -> (StatusCode, HeaderMap, T) {
let ok = result.expect("handler returned Err, expected Ok");
let s = ok.status();
let h = ok.headers().clone();
(s, h, payload(ok))
}
pub fn unwrap_err<T>(result: Result<RfcOk<T>, HandlerError>) -> HandlerError {
match result {
Err(e) => e,
Ok(_) => panic!("handler returned Ok, expected Err"),
}
}
pub fn unwrap_err_status<T>(result: Result<RfcOk<T>, HandlerError>) -> u16 {
unwrap_err(result).0.status_code()
}