Skip to main content

bitwarden_api_base/
status_code_serializer.rs

1//! Serde helpers for [`http::StatusCode`], used via `#[serde(with = ...)]`.
2
3use http::StatusCode;
4use serde::{Deserialize, Deserializer, Serializer, de::Error};
5
6pub fn serialize<S: Serializer>(status: &StatusCode, ser: S) -> Result<S::Ok, S::Error> {
7    ser.serialize_u16(status.as_u16())
8}
9
10pub fn deserialize<'de, D: Deserializer<'de>>(de: D) -> Result<StatusCode, D::Error> {
11    let value = u16::deserialize(de)?;
12    StatusCode::from_u16(value).map_err(D::Error::custom)
13}
14
15#[cfg(test)]
16mod tests {
17    use http::StatusCode;
18    use serde::{Deserialize, Serialize};
19
20    #[derive(Serialize, Deserialize, Debug, PartialEq)]
21    struct Wrapper {
22        #[serde(with = "super")]
23        status: StatusCode,
24    }
25
26    #[test]
27    fn serializes_as_u16() {
28        let json = serde_json::to_string(&Wrapper {
29            status: StatusCode::NOT_FOUND,
30        })
31        .unwrap();
32        assert_eq!(json, r#"{"status":404}"#);
33    }
34
35    #[test]
36    fn deserializes_from_u16() {
37        let wrapper: Wrapper = serde_json::from_str(r#"{"status":201}"#).unwrap();
38        assert_eq!(wrapper.status, StatusCode::CREATED);
39    }
40
41    #[test]
42    fn rejects_invalid_status() {
43        let err = serde_json::from_str::<Wrapper>(r#"{"status":99}"#).unwrap_err();
44        assert!(err.to_string().contains("invalid status code"));
45    }
46}