use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ApiResponse<T> {
#[serde(flatten)]
pub data: T,
pub code: Option<u32>,
pub message: Option<String>,
}
impl<T> ApiResponse<T> {
pub fn success(data: T) -> Self {
Self {
data,
code: None,
message: None,
}
}
pub fn error(code: u32, message: impl Into<String>) -> Self
where
T: Default,
{
Self {
data: T::default(),
code: Some(code),
message: Some(message.into()),
}
}
pub fn is_success(&self) -> bool {
self.code.is_none()
}
pub fn is_error(&self) -> bool {
self.code.is_some()
}
pub fn into_result(self) -> crate::Result<T> {
if let Some(code) = self.code {
let message = self.message.unwrap_or_else(|| format!("API error {code}"));
Err(crate::BotError::api(code, message))
} else {
Ok(self.data)
}
}
}