konduto/types/orders/
status.rs1use crate::supports::enums;
2use serde::{Deserialize, Serialize};
3use std::fmt::Display;
4
5#[derive(Debug, Clone, Serialize, PartialEq, Eq)]
7#[serde(rename_all = "snake_case")]
8pub enum OrderStatus {
9 Approved,
12
13 Pending,
16
17 Declined,
20
21 NotAuthorized,
26
27 Canceled,
31
32 Fraud,
36
37 NotAnalyzed,
42}
43
44impl<'de> Deserialize<'de> for OrderStatus {
45 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
46 where
47 D: serde::Deserializer<'de>,
48 {
49 let s = String::deserialize(deserializer)?;
50 match s.to_lowercase().as_str() {
51 "approved" => Ok(OrderStatus::Approved),
52 "pending" => Ok(OrderStatus::Pending),
53 "declined" => Ok(OrderStatus::Declined),
54 "not_authorized" => Ok(OrderStatus::NotAuthorized),
55 "canceled" => Ok(OrderStatus::Canceled),
56 "fraud" => Ok(OrderStatus::Fraud),
57 "not_analyzed" => Ok(OrderStatus::NotAnalyzed),
58 _ => Err(serde::de::Error::custom(format!("Invalid status: {}", s))),
59 }
60 }
61}
62
63impl OrderStatus {
64 pub fn name(&self) -> String {
65 enums::to_string_infallible(self)
66 }
67}
68
69impl Display for OrderStatus {
70 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
71 write!(f, "{}", self.name())
72 }
73}
74
75#[cfg(test)]
76mod tests {
77 use super::*;
78 use serde_json::json;
79
80 #[test]
81 fn test_status_deserialization_case_insensitive() {
82 let status: OrderStatus = serde_json::from_value(json!("approved")).unwrap();
83 assert_eq!(status, OrderStatus::Approved);
84 let status: OrderStatus = serde_json::from_value(json!("APPROVED")).unwrap();
85 assert_eq!(status, OrderStatus::Approved);
86 let status: OrderStatus = serde_json::from_value(json!("Approved")).unwrap();
87 assert_eq!(status, OrderStatus::Approved);
88 }
89
90 #[test]
91 fn test_all_statuses() {
92 let test_cases = vec![
93 ("approved", OrderStatus::Approved),
94 ("pending", OrderStatus::Pending),
95 ("declined", OrderStatus::Declined),
96 ("not_authorized", OrderStatus::NotAuthorized),
97 ("canceled", OrderStatus::Canceled),
98 ("fraud", OrderStatus::Fraud),
99 ("not_analyzed", OrderStatus::NotAnalyzed),
100 ];
101
102 for (input, expected) in test_cases {
103 let status: OrderStatus = serde_json::from_value(json!(input)).unwrap();
104 assert_eq!(status, expected);
105 }
106 }
107
108 #[test]
109 fn test_status_serialization() {
110 let status = OrderStatus::Approved;
111 let json = serde_json::to_value(&status).unwrap();
112 assert_eq!(json, json!("approved"));
113
114 let status = OrderStatus::NotAuthorized;
115 let json = serde_json::to_value(&status).unwrap();
116 assert_eq!(json, json!("not_authorized"));
117 }
118
119 #[test]
120 fn test_invalid_status() {
121 let result: Result<OrderStatus, _> = serde_json::from_value(json!("invalid_status"));
122 assert!(result.is_err());
123 }
124}