use crate::pagination::ResultPagination;
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ApiResult<T> {
pub success: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<T>,
#[serde(skip_serializing_if = "Option::is_none")]
pub list: Option<Vec<T>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub message: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub pagination: Option<ResultPagination>,
#[serde(skip_serializing_if = "Option::is_none")]
pub extra: Option<Value>,
}
impl<T> ApiResult<T> {
pub fn value(v: T) -> Self {
ApiResult {
success: true,
data: Some(v),
list: None,
message: None,
code: None,
pagination: None,
extra: None,
}
}
pub fn list(v: Vec<T>) -> Self {
ApiResult {
success: true,
data: None,
list: Some(v),
message: None,
code: None,
pagination: None,
extra: None,
}
}
pub fn fail(message: &str) -> Self {
Self::failure(message)
}
pub fn failure(message: &str) -> Self {
ApiResult {
success: false,
data: None,
list: None,
message: Some(message.to_string()),
code: None,
pagination: None,
extra: None,
}
}
pub fn success() -> Self {
ApiResult {
success: true,
data: None,
list: None,
message: None,
code: None,
pagination: None,
extra: None,
}
}
pub fn with_extra(mut self, key: &str, value: Value) -> Self {
match self.extra {
Some(ref mut v) => {
v[key] = value;
}
None => {
let mut v = serde_json::Map::new();
v.insert(key.to_string(), value);
self.extra = Some(v.into());
}
}
self
}
pub fn with_code(mut self, code: i32) -> Self {
self.code = Some(code);
self
}
pub fn with_pagination(mut self, pagination: ResultPagination) -> Self {
self.pagination = Some(pagination);
self
}
pub fn with_message(mut self, message: &str) -> Self {
self.message = Some(message.to_string());
self
}
}
impl<T, E> Into<Result<ApiResult<T>, E>> for ApiResult<T> {
fn into(self) -> Result<ApiResult<T>, E> {
Ok(self)
}
}
pub type DefaultResult<T> = Result<T, Box<dyn std::error::Error>>;
pub type AnyhowResult<T> = Result<T, anyhow::Error>;
pub type EmptyResult = ApiResult<()>;