Skip to main content

architect_sdk/
response.rs

1//! Standard response envelope helpers.
2
3use 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}