use serde::{Deserialize, Serialize}; use time::OffsetDateTime; use super::settings::SettingsUpdate; #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(tag = "name")] pub enum UpdateType { ClearAll, Customs, DocumentsAddition { number: usize }, DocumentsPartial { number: usize }, DocumentsDeletion { number: usize }, Settings { settings: Box }, } #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ProcessedUpdateResult { pub update_id: u64, #[serde(rename = "type")] pub update_type: UpdateType, #[serde(skip_serializing_if = "Option::is_none")] pub error: Option, #[serde(skip_serializing_if = "Option::is_none")] pub error_type: Option, #[serde(skip_serializing_if = "Option::is_none")] pub error_code: Option, #[serde(skip_serializing_if = "Option::is_none")] pub error_link: Option, pub duration: f64, // in seconds #[serde(with = "time::serde::rfc3339")] pub enqueued_at: OffsetDateTime, #[serde(with = "time::serde::rfc3339")] pub processed_at: OffsetDateTime, } #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct EnqueuedUpdateResult { pub update_id: u64, #[serde(rename = "type")] pub update_type: UpdateType, #[serde(with = "time::serde::rfc3339")] pub enqueued_at: OffsetDateTime, } #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase", tag = "status")] pub enum UpdateStatus { Enqueued { #[serde(flatten)] content: EnqueuedUpdateResult, }, Failed { #[serde(flatten)] content: ProcessedUpdateResult, }, Processed { #[serde(flatten)] content: ProcessedUpdateResult, }, } impl UpdateStatus { pub fn enqueued_at(&self) -> &OffsetDateTime { match self { UpdateStatus::Enqueued { content } => &content.enqueued_at, UpdateStatus::Failed { content } | UpdateStatus::Processed { content } => { &content.enqueued_at } } } }