1use axum::Json;
7use serde::Serialize;
8
9pub use ironflow_types::{ApiMeta, ApiResponse, ErrorEnvelope};
10
11pub fn ok<T: Serialize>(data: T) -> Json<ApiResponse<T>> {
25 Json(ApiResponse { data, meta: None })
26}
27
28pub fn ok_paged<T: Serialize>(
42 data: T,
43 page: u32,
44 per_page: u32,
45 total: u64,
46) -> Json<ApiResponse<T>> {
47 Json(ApiResponse {
48 data,
49 meta: Some(ApiMeta::paginated(page, per_page, total)),
50 })
51}
52
53#[cfg(test)]
54mod tests {
55 use super::*;
56 use serde_json::json;
57
58 #[test]
59 fn ok_wraps_data_without_meta() {
60 let Json(response) = ok(vec![1, 2, 3]);
61 let json_val = serde_json::to_value(&response).expect("serialize");
62 assert_eq!(json_val["data"], json!([1, 2, 3]));
63 assert_eq!(json_val["meta"], json!(null));
64 }
65
66 #[test]
67 fn ok_paged_wraps_data_with_pagination() {
68 let Json(response) = ok_paged(vec!["a", "b"], 2, 20, 100);
69 let json_val = serde_json::to_value(&response).expect("serialize");
70 assert_eq!(json_val["data"], json!(["a", "b"]));
71 assert_eq!(json_val["meta"]["page"], 2);
72 assert_eq!(json_val["meta"]["per_page"], 20);
73 assert_eq!(json_val["meta"]["total"], 100);
74 }
75}