Guest User

Untitled

a guest
Sep 21st, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.99 KB | None | 0 0
  1. #![allow(non_snake_case)]
  2. #[macro_use]
  3. extern crate serde_derive;
  4.  
  5. extern crate serde;
  6. extern crate serde_json;
  7. use serde::ser::{Serialize, SerializeStruct, SerializeTupleVariant, Serializer};
  8. use serde::{Deserialize, Deserializer};
  9.  
  10. #[derive(Serialize, Deserialize, Debug)]
  11. struct Foo {
  12. word: String,
  13. }
  14. #[derive(Serialize, Deserialize, Debug)]
  15. struct Bar {
  16. number: i64,
  17. }
  18.  
  19. #[derive(Deserialize, Debug)]
  20. #[serde(rename = "Payload", remote = "Self")]
  21. enum ClientPayload {
  22. Foo(Foo), //notice these are "real" structs nested in a tuple variant
  23. Bar(Bar),
  24. }
  25. impl<'de> Deserialize<'de> for ClientPayload {
  26. fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
  27. #[derive(Deserialize)]
  28. struct Wrapper {
  29. //#[serde(rename = "type")]
  30. //_ignore: String,
  31. #[serde(flatten, with = "ClientPayload")]
  32. inner: ClientPayload,
  33. }
  34. Wrapper::deserialize(deserializer).map(|w| w.inner)
  35. }
  36. }
  37.  
  38. impl Serialize for ClientPayload {
  39. fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
  40. where
  41. S: Serializer,
  42. {
  43. match *self {
  44. ClientPayload::Foo(ref a) => {
  45. let mut tv = serializer.serialize_tuple_variant("ClientPayload", 0, "Foo", 1)?;
  46. tv.serialize_field(a);
  47. tv.end()
  48. }
  49. ClientPayload::Bar(ref a) => {
  50. let mut tv = serializer.serialize_tuple_variant("ClientPayload", 1, "Bar", 1)?;
  51. tv.serialize_field(a);
  52. tv.end()
  53. }
  54. }
  55. }
  56. }
  57. #[derive(Deserialize, Debug)]
  58. struct ClientMessage {
  59. Msgtype: String, //ie a string that says "Foo" or "Bar" denoting the struct that the serializer will find
  60. Otherinfo: String,
  61. Payload: ClientPayload,
  62. }
  63. impl Serialize for ClientMessage {
  64. fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
  65. where
  66. S: Serializer,
  67. {
  68. let mut state = serializer.serialize_struct("ClientMessage", 3)?;
  69. state.serialize_field("Msgtype", &self.Msgtype)?;
  70. state.serialize_field("Otherinfo", &self.Otherinfo)?;
  71. state.serialize_field("Payload", &self.Payload)?;
  72. state.end()
  73. }
  74. }
  75. fn main() {
  76. let testmsg = r#"{"Msgtype":"Foo","Otherinfo":"oooka","Payload":{"word":"fooing"}"#;
  77. let _testenum: ClientPayload = ClientPayload::Foo(Foo {
  78. word: "foo".to_owned(),
  79. });
  80. let teststruct = ClientMessage {
  81. Msgtype: "Foo".to_owned(),
  82. Otherinfo: "ooooooka".to_owned(),
  83. Payload: ClientPayload::Foo(Foo {
  84. word: "fooooo".to_owned(),
  85. }),
  86. };
  87. let _teststruct2 = ClientMessage {
  88. Msgtype: "Bar".to_owned(),
  89. Otherinfo: "ooooooka".to_owned(),
  90. Payload: ClientPayload::Bar(Bar { number: 34 }),
  91. };
  92. let serialized = serde_json::to_string(&teststruct);
  93. println!("hmmm {:?}", serialized.unwrap());
  94. let msg: ClientMessage = serde_json::from_str(&testmsg).unwrap();
  95. println!("Hello, world! {:?}", msg);
  96. }
Add Comment
Please, Sign In to add comment