use crate::task_status::TaskStatus; use crate::task_type::TaskType; use chrono::NaiveDateTime; use serde::{Deserialize, Serialize}; use serde_json::Value as JsonValue; /// Mirrors Java `ReqTask`. /// /// `payload` is polymorphic in Java (`Optional`); stored in Redis as JSON per task type. #[derive(Debug, Clone, Serialize, Deserialize, Default)] pub struct ReqTask { #[serde(default, skip_serializing_if = "Option::is_none")] pub task_id: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub hty_id: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub created_by: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub created_at: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub updated_by: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub updated_at: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub task_type: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub task_status: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub duration: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub meta: Option, /// Raw JSON payload (task-type-specific struct on the wire). #[serde(default, skip_serializing_if = "Option::is_none")] pub payload: Option, } #[cfg(test)] mod tests { use super::*; #[test] fn serde_req_task_roundtrip() { let sample = ReqTask { task_id: Some("550e8400-e29b-41d4-a716-446655440000".into()), task_type: Some(TaskType::Noop), task_status: Some(TaskStatus::Pending), payload: None, hty_id: None, created_by: None, created_at: None, updated_by: None, updated_at: None, duration: None, meta: None, }; let json = serde_json::to_string(&sample).expect("serialize"); let back: ReqTask = serde_json::from_str(&json).expect("deserialize"); assert_eq!(back.task_id, sample.task_id); } }