Skip to content

Commit 65c12df

Browse files
committed
Improve Priority deserialization
Support both deserialization from `u8` and `String`. Signed-off-by: Yuki Kishimoto <yukikishimoto@protonmail.com>
1 parent 29601bb commit 65c12df

File tree

1 file changed

+67
-2
lines changed

1 file changed

+67
-2
lines changed

src/payload/priority.rs

+67-2
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,13 @@ impl FromStr for Priority {
7070
}
7171
}
7272

73+
#[derive(Deserialize)]
74+
#[serde(untagged)]
75+
enum NumberOrString {
76+
Number(u8),
77+
String(String),
78+
}
79+
7380
impl Serialize for Priority {
7481
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
7582
where
@@ -86,7 +93,65 @@ impl<'de> Deserialize<'de> for Priority {
8693
where
8794
D: Deserializer<'de>,
8895
{
89-
let priority: u8 = u8::deserialize(deserializer)?;
90-
Priority::from_u8(priority).map_err(de::Error::custom)
96+
match NumberOrString::deserialize(deserializer)? {
97+
NumberOrString::Number(priority) => {
98+
Priority::from_u8(priority).map_err(de::Error::custom)
99+
}
100+
NumberOrString::String(priority) => {
101+
Self::from_str(&priority).map_err(de::Error::custom)
102+
}
103+
}
104+
}
105+
}
106+
107+
#[cfg(test)]
108+
mod tests {
109+
use super::*;
110+
111+
#[test]
112+
fn test_deserialize() {
113+
let json = serde_json::json!(5);
114+
let priority: Priority = serde_json::from_value(json).unwrap();
115+
assert_eq!(priority, Priority::Max);
116+
117+
let json = serde_json::json!(4);
118+
let priority: Priority = serde_json::from_value(json).unwrap();
119+
assert_eq!(priority, Priority::High);
120+
121+
let json = serde_json::json!(3);
122+
let priority: Priority = serde_json::from_value(json).unwrap();
123+
assert_eq!(priority, Priority::Default);
124+
125+
let json = serde_json::json!(2);
126+
let priority: Priority = serde_json::from_value(json).unwrap();
127+
assert_eq!(priority, Priority::Low);
128+
129+
let json = serde_json::json!(1);
130+
let priority: Priority = serde_json::from_value(json).unwrap();
131+
assert_eq!(priority, Priority::Min);
132+
133+
let json = serde_json::json!("urgent");
134+
let priority: Priority = serde_json::from_value(json).unwrap();
135+
assert_eq!(priority, Priority::Max);
136+
137+
let json = serde_json::json!("max");
138+
let priority: Priority = serde_json::from_value(json).unwrap();
139+
assert_eq!(priority, Priority::Max);
140+
141+
let json = serde_json::json!("high");
142+
let priority: Priority = serde_json::from_value(json).unwrap();
143+
assert_eq!(priority, Priority::High);
144+
145+
let json = serde_json::json!("default");
146+
let priority: Priority = serde_json::from_value(json).unwrap();
147+
assert_eq!(priority, Priority::Default);
148+
149+
let json = serde_json::json!("low");
150+
let priority: Priority = serde_json::from_value(json).unwrap();
151+
assert_eq!(priority, Priority::Low);
152+
153+
let json = serde_json::json!("min");
154+
let priority: Priority = serde_json::from_value(json).unwrap();
155+
assert_eq!(priority, Priority::Min);
91156
}
92157
}

0 commit comments

Comments
 (0)