use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApiResponse<T> {
pub success: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub result: Option<T>,
#[serde(default)]
pub errors: Vec<ApiErrorDetail>,
#[serde(default)]
pub messages: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub result_info: Option<ResultInfo>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApiErrorDetail {
pub code: i32,
pub message: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResultInfo {
pub page: u32,
pub per_page: u32,
pub total_pages: u32,
pub count: u32,
pub total_count: u32,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ChangeAction {
Create,
Update,
Delete,
NoChange,
}
impl ChangeAction {
pub fn is_mutating(&self) -> bool {
matches!(
self,
ChangeAction::Create | ChangeAction::Update | ChangeAction::Delete
)
}
}
#[derive(Debug, Clone)]
pub struct Change<T> {
pub action: ChangeAction,
pub current: Option<T>,
pub desired: Option<T>,
pub description: String,
}
impl<T> Change<T> {
pub fn create(desired: T, description: String) -> Self {
Self {
action: ChangeAction::Create,
current: None,
desired: Some(desired),
description,
}
}
pub fn update(current: T, desired: T, description: String) -> Self {
Self {
action: ChangeAction::Update,
current: Some(current),
desired: Some(desired),
description,
}
}
pub fn no_change(current: T, description: String) -> Self {
Self {
action: ChangeAction::NoChange,
current: Some(current),
desired: None,
description,
}
}
}