use crate::ro::ro_result::RoResult;
use chrono::Utc;
use derive_setters::Setters;
use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;
use std::fmt::Debug;
use typed_builder::TypedBuilder;
use utoipa::ToSchema;
use wheel_rs::serde::u64_serde;
#[skip_serializing_none]
#[derive(ToSchema, Debug, Serialize, Deserialize, Setters, TypedBuilder)]
#[builder]
pub struct Ro<E> {
pub result: RoResult,
pub message: String,
#[builder(default = Utc::now().timestamp_millis() as u64)]
#[serde(with = "u64_serde")]
pub timestamp: u64,
#[builder(default, setter(strip_option))]
pub extra: Option<E>,
#[builder(default, setter(strip_option))]
pub detail: Option<String>,
#[builder(default, setter(strip_option))]
pub code: Option<String>,
}
impl<E> Ro<E> {
pub fn is_ok(&self) -> bool {
self.result == RoResult::Success
}
pub fn is_err(&self) -> bool {
self.result != RoResult::Success
}
pub fn success(message: String) -> Self {
Self::builder()
.result(RoResult::Success)
.message(message)
.build()
}
pub fn illegal_argument(message: String) -> Self {
Self::builder()
.result(RoResult::IllegalArgument)
.message(message)
.build()
}
pub fn warn(message: String) -> Self {
Self::builder()
.result(RoResult::Warn)
.message(message)
.build()
}
pub fn fail(message: String) -> Self {
Self::builder()
.result(RoResult::Fail)
.message(message)
.build()
}
}