use std::fmt;
use typed_builder::TypedBuilder;
#[derive(Debug, serde::Serialize, serde::Deserialize, TypedBuilder)]
pub struct R<T> {
pub code: u16,
pub message: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<T>,
}
impl<T: serde::Serialize> R<T> {
pub fn ok(data: T) -> Self {
R::<T> {
code: 200,
message: "Ok".to_string(),
data: Some(data),
}
}
pub fn success(data: T, message: impl Into<String>) -> Self {
R::<T> {
code: 200,
message: message.into(),
data: Some(data),
}
}
}
impl R<bool> {
pub fn failed(code: u16, message: impl Into<String>) -> R<bool> {
R::<bool> {
code,
message: message.into(),
data: None,
}
}
pub fn invalid(message: impl Into<String>) -> R<bool> {
R::<bool> {
code: 413,
message: message.into(),
data: None,
}
}
pub fn empty() -> R<Option<bool>> {
R::<Option<bool>>::ok(None)
}
}
impl<T> fmt::Display for R<T>
where
T: fmt::Display + fmt::Debug,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{:?}", self)
}
}