architect_sdk/
response.rs1use axum::{http::StatusCode, Json};
4use serde::Serialize;
5
6#[derive(Serialize)]
7pub struct SuccessOne<T> {
8 pub data: T,
9 #[serde(skip_serializing_if = "Option::is_none")]
10 pub meta: Option<serde_json::Value>,
11}
12
13#[derive(Serialize)]
14pub struct SuccessMany<T> {
15 pub data: Vec<T>,
16 pub meta: MetaCount,
17}
18
19#[derive(Serialize)]
20pub struct MetaCount {
21 pub count: u64,
22}
23
24pub fn success_one<T: Serialize>(data: T) -> (StatusCode, Json<SuccessOne<T>>) {
25 (StatusCode::CREATED, Json(SuccessOne { data, meta: None }))
26}
27
28pub fn success_one_ok<T: Serialize>(data: T) -> (StatusCode, Json<SuccessOne<T>>) {
29 (StatusCode::OK, Json(SuccessOne { data, meta: None }))
30}
31
32pub fn success_many<T: Serialize>(data: Vec<T>) -> (StatusCode, Json<SuccessMany<T>>) {
33 let count = data.len() as u64;
34 (
35 StatusCode::OK,
36 Json(SuccessMany {
37 data,
38 meta: MetaCount { count },
39 }),
40 )
41}
42
43pub fn success_many_created<T: Serialize>(data: Vec<T>) -> (StatusCode, Json<SuccessMany<T>>) {
44 let count = data.len() as u64;
45 (
46 StatusCode::CREATED,
47 Json(SuccessMany {
48 data,
49 meta: MetaCount { count },
50 }),
51 )
52}
53
54pub fn error_body(
55 code: &str,
56 message: String,
57 details: Option<serde_json::Value>,
58) -> serde_json::Value {
59 serde_json::json!({
60 "error": {
61 "code": code,
62 "message": message,
63 "details": details
64 }
65 })
66}