Guest User

Untitled

a guest
Apr 27th, 2018
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.90 KB | None | 0 0
  1. #[macro_use]
  2. extern crate serde_derive;
  3.  
  4. extern crate serde;
  5. extern crate serde_json;
  6.  
  7. use serde::de::{self, Deserialize, Deserializer};
  8. use serde_json::Value;
  9.  
  10. #[derive(Debug)]
  11. enum ConnectRequest {
  12. Unspecified(UnspecifiedSecurity),
  13. Wpa2(Wpa2Security),
  14. }
  15.  
  16. #[derive(Deserialize, Debug)]
  17. struct UnspecifiedSecurity {
  18. ssid: String,
  19. psk: Option<String>,
  20. }
  21.  
  22. #[derive(Deserialize, Debug)]
  23. struct Wpa2Security {
  24. ssid: String,
  25. psk: String,
  26. }
  27.  
  28. impl<'de> Deserialize<'de> for ConnectRequest {
  29. fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
  30. where
  31. D: Deserializer<'de>,
  32. {
  33. #[derive(Deserialize)]
  34. #[serde(field_identifier, rename_all = "lowercase")]
  35. enum Tag {
  36. Wpa2,
  37. Other(String),
  38. }
  39.  
  40. let v = Value::deserialize(deserializer)?;
  41. match Option::deserialize(&v["security"]).map_err(de::Error::custom)? {
  42. Some(Tag::Wpa2) => {
  43. let inner = Wpa2Security::deserialize(v).map_err(de::Error::custom)?;
  44. Ok(ConnectRequest::Wpa2(inner))
  45. }
  46. None => {
  47. let inner = UnspecifiedSecurity::deserialize(v).map_err(de::Error::custom)?;
  48. Ok(ConnectRequest::Unspecified(inner))
  49. }
  50. Some(Tag::Other(other)) => {
  51. const VARIANTS: &[&str] = &["wpa2"];
  52. Err(de::Error::unknown_variant(&other, VARIANTS))
  53. }
  54. }
  55. }
  56. }
  57.  
  58. fn main() {
  59. let present = r#"{"ssid": "foo", "psk": "bar", "security": "wpa2"}"#;
  60. println!("{:?}", serde_json::from_str::<ConnectRequest>(&present).unwrap());
  61.  
  62. let missing = r#"{"ssid": "foo", "psk": "bar"}"#;
  63. println!("{:?}", serde_json::from_str::<ConnectRequest>(&missing).unwrap());
  64.  
  65. let unknown = r#"{"ssid": "foo", "psk": "bar", "security": "unrecognized"}"#;
  66. println!("{}", serde_json::from_str::<ConnectRequest>(&unknown).unwrap_err());
  67. }
Add Comment
Please, Sign In to add comment