1use serde::{Deserialize, Serialize};
2
3use crate::ApiResponse;
4
5#[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 {}