use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApiResponse<T> {
pub success: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<T>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub message: Option<String>,
}
impl<T> ApiResponse<T> {
pub fn success(data: T) -> Self {
Self {
success: true,
data: Some(data),
code: None,
message: None,
}
}
pub fn error(code: impl Into<String>, message: impl Into<String>) -> Self {
Self {
success: false,
data: None,
code: Some(code.into()),
message: Some(message.into()),
}
}
pub fn is_success(&self) -> bool {
self.success
}
pub fn get_data(&self) -> Option<&T> {
self.data.as_ref()
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Pagination {
pub page: u32,
pub page_size: u32,
pub total: u32,
pub total_pages: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PaginatedResponse<T> {
pub success: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<Vec<T>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub pagination: Option<Pagination>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub message: Option<String>,
}
impl<T> PaginatedResponse<T> {
pub fn success(data: Vec<T>, pagination: Pagination) -> Self {
Self {
success: true,
data: Some(data),
pagination: Some(pagination),
code: None,
message: None,
}
}
pub fn error(code: impl Into<String>, message: impl Into<String>) -> Self {
Self {
success: false,
data: None,
pagination: None,
code: Some(code.into()),
message: Some(message.into()),
}
}
pub fn is_success(&self) -> bool {
self.success
}
pub fn get_data(&self) -> Option<&Vec<T>> {
self.data.as_ref()
}
pub fn get_pagination(&self) -> Option<&Pagination> {
self.pagination.as_ref()
}
}