Advertisement
Guest User

Untitled

a guest
Jul 21st, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.68 KB | None | 0 0
  1. /// use like `#[serde(with = "string")]` after bringing into scope
  2. pub mod string {
  3. use std::fmt::Display;
  4. use std::io::Write as _;
  5. use std::str::FromStr;
  6. use std::marker::PhantomData;
  7.  
  8. use serde::{de::Visitor, Deserializer, Serializer};
  9.  
  10. pub fn serialize<T, S>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
  11. where
  12. T: Display,
  13. S: Serializer,
  14. {
  15. let mut buf: smallvec::SmallVec<[u8; 64]> = smallvec::SmallVec::new();
  16. write!(buf, "{}", value).unwrap();
  17. let s = std::str::from_utf8(&buf).unwrap();
  18. serializer.serialize_str(s)
  19. }
  20.  
  21. struct ParsingVisitor<T>(std::marker::PhantomData<fn() -> T>);
  22.  
  23. impl<'de, T> Visitor<'de> for ParsingVisitor<T>
  24. where
  25. T: FromStr,
  26. T::Err: Display,
  27. {
  28. type Value = T;
  29.  
  30. fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
  31. formatter.write_str("a string")
  32. }
  33.  
  34. fn visit_str<E>(self, value: &str) -> Result<T, E>
  35. where
  36. E: serde::de::Error,
  37. {
  38. value.parse().map_err(E::custom)
  39. }
  40. }
  41.  
  42. pub fn deserialize<'de, T, D>(deserializer: D) -> Result<T, D::Error>
  43. where
  44. T: FromStr,
  45. T::Err: Display,
  46. D: Deserializer<'de>,
  47. {
  48. deserializer.deserialize_str(ParsingVisitor(PhantomData))
  49. }
  50. }
  51.  
  52. use serde_derive::{Serialize, Deserialize};
  53.  
  54. #[derive(Debug, Serialize, Deserialize)]
  55. struct Foobar {
  56. #[serde(with = "string")]
  57. something: i32,
  58. }
  59.  
  60.  
  61. fn main() {
  62. let s = serde_json::to_string(&Foobar { something: 3 }).unwrap();
  63. println!("json: {}", s);
  64. println!("unjson: {:?}", serde_json::from_str::<Foobar>(&s).unwrap());
  65.  
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement