api_response/
success.rs

1use serde::{Deserialize, Serialize};
2
3use crate::ApiResponse;
4
5/// Struct to represent a successful response
6#[cfg_attr(feature = "salvo", derive(salvo::prelude::ToSchema))]
7#[derive(Debug, Serialize, Deserialize)]
8#[non_exhaustive]
9pub struct SuccessResponse<Data, Meta> {
10    pub data: Data,
11    #[serde(skip_serializing_if = "Option::is_none")]
12    pub meta: Option<Meta>,
13}
14
15impl<Data, Meta> SuccessResponse<Data, Meta> {
16    #[inline(always)]
17    pub const fn new(data: Data, meta: Meta) -> Self {
18        SuccessResponse { data, meta: Some(meta) }
19    }
20    #[inline(always)]
21    pub const fn from_data(data: Data) -> Self {
22        SuccessResponse { data, meta: None }
23    }
24    #[inline(always)]
25    pub fn with_meta(mut self, meta: Meta) -> Self {
26        self.set_meta(meta);
27        self
28    }
29    #[inline(always)]
30    pub fn set_meta(&mut self, meta: Meta) -> &mut Self {
31        self.meta = Some(meta);
32        self
33    }
34}
35
36pub trait ApiSuccessResponse: Sized {
37    fn api_response<Meta>(self, meta: Option<Meta>) -> ApiResponse<Self, Meta> {
38        ApiResponse::Success(SuccessResponse { data: self, meta })
39    }
40    #[inline(always)]
41    fn api_response_without_meta<Meta>(self) -> ApiResponse<Self, Meta> {
42        self.api_response(None)
43    }
44    #[inline(always)]
45    fn api_response_with_meta<Meta>(self, meta: Meta) -> ApiResponse<Self, Meta> {
46        self.api_response(Some(meta))
47    }
48}
49
50impl<Data> ApiSuccessResponse for Data {}