use serde::{Deserialize, Serialize};
use crate::types::Message;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MessageBatch {
pub id: String,
#[serde(rename = "type")]
pub batch_type: String,
pub processing_status: String,
pub request_counts: BatchRequestCounts,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct BatchRequestCounts {
pub processing: u32,
pub succeeded: u32,
pub errored: u32,
pub canceled: u32,
pub expired: u32,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct BatchResultItem {
pub custom_id: String,
pub result: BatchResult,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct BatchError {
#[serde(rename = "type")]
pub error_type: String,
pub message: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum BatchResult {
Succeeded {
message: Message,
},
Errored {
error: BatchError,
},
Canceled,
Expired,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct BatchRequest {
pub custom_id: String,
pub params: crate::types::MessageCreateParams,
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
#[test]
fn batch_request_counts_roundtrip() {
let counts = BatchRequestCounts {
processing: 5,
succeeded: 10,
errored: 2,
canceled: 1,
expired: 0,
};
let json = serde_json::to_value(&counts).unwrap();
let deserialized: BatchRequestCounts = serde_json::from_value(json).unwrap();
assert_eq!(counts, deserialized);
}
#[test]
fn batch_result_succeeded_serialization() {
let json = json!({"type": "canceled"});
let result: BatchResult = serde_json::from_value(json).unwrap();
assert!(matches!(result, BatchResult::Canceled));
}
#[test]
fn batch_result_errored_serialization() {
let json = json!({
"type": "errored",
"error": {"type": "invalid_request", "message": "bad input"}
});
let result: BatchResult = serde_json::from_value(json).unwrap();
match result {
BatchResult::Errored { error } => {
assert_eq!(error.error_type, "invalid_request");
assert_eq!(error.message, "bad input");
}
_ => panic!("Expected Errored variant"),
}
}
}