Advertisement
Guest User

Untitled

a guest
Jul 18th, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.38 KB | None | 0 0
  1. use serde::{Deserialize, Deserializer};
  2. use std::collections::HashMap;
  3. use std::fmt;
  4.  
  5. /// Just try to serialize a `Foo`.
  6. fn main() {
  7. let s = "features = ['Jerry', 'Jerry']\n\n[aliases]\nfoo='Jerry'\n";
  8. let _: GoodHelper<'_> = dbg!(toml::from_str(s).unwrap());
  9. let _: BadHelper<'_> = dbg!(toml::from_str(s).unwrap());
  10. let _: Foo = dbg!(toml::from_str(s).unwrap());
  11. }
  12.  
  13. /// A container of `Jerry`. This can be created via `GoodHelper`, but not via
  14. /// `BadHelper`, for some reason.
  15. #[derive(Debug, Default, Deserialize)]
  16. #[serde(from = "BadHelper")] // <-- change this to GoodHelper
  17. struct Foo {
  18. everything: Vec<Jerry>,
  19. }
  20.  
  21. /// A `Foo` can be created from the helper by just collecting `Jerry`.
  22. impl From<GoodHelper<'_>> for Foo {
  23. fn from(helper: GoodHelper<'_>) -> Self {
  24. let mut res = Foo::default();
  25. res.everything.extend(helper.aliases.values());
  26. res
  27. }
  28. }
  29.  
  30. /// A `Foo` can be created from the helper by just collecting `Jerry`.
  31. impl From<BadHelper<'_>> for Foo {
  32. fn from(helper: BadHelper<'_>) -> Self {
  33. let mut res = Foo::default();
  34. res.everything.extend(helper.aliases.values().cloned());
  35. res
  36. }
  37. }
  38.  
  39. /// Creating `Foo` via this helper works.
  40. #[derive(Debug, Deserialize)]
  41. #[serde(rename = "foo")]
  42. struct GoodHelper<'a> {
  43. #[serde(borrow)]
  44. aliases: HashMap<&'a str, Jerry>,
  45. }
  46.  
  47. /// Creating `Foo` via this helper doesn't work.
  48. /// Creating the helper itself *does* work, however.
  49. #[derive(Debug, Deserialize)]
  50. #[serde(rename = "foo")]
  51. struct BadHelper<'a> {
  52. #[serde(borrow)]
  53. aliases: HashMap<&'a str, StaticJerry>,
  54. }
  55.  
  56. type StaticJerry = &'static Jerry;
  57.  
  58. /// Jerry.
  59. #[derive(Debug, Clone, Copy)]
  60. struct Jerry;
  61.  
  62. /// You can deserialize `Jerry` …
  63. impl<'de> Deserialize<'de> for Jerry {
  64. fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
  65. where
  66. D: Deserializer<'de>,
  67. {
  68. use serde::de::Error;
  69. use serde::de::Unexpected;
  70. struct Visitor;
  71. impl<'de> serde::de::Visitor<'de> for Visitor {
  72. type Value = Jerry;
  73. fn expecting(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
  74. f.write_str("Jerry")
  75. }
  76. fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
  77. where
  78. E: Error,
  79. {
  80. match v {
  81. "Jerry" => Ok(Jerry),
  82. _ => Err(Error::invalid_value(Unexpected::Str(v), &self)),
  83. }
  84. }
  85. }
  86. deserializer.deserialize_str(Visitor)
  87. }
  88. }
  89.  
  90. /// … but you can also deserialize `&'stati Jerry`.
  91. impl<'de> Deserialize<'de> for &'static Jerry {
  92. fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
  93. where
  94. D: Deserializer<'de>,
  95. {
  96. use serde::de::Error;
  97. use serde::de::Unexpected;
  98. struct Visitor;
  99. impl<'de> serde::de::Visitor<'de> for Visitor {
  100. type Value = &'static Jerry;
  101. fn expecting(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
  102. f.write_str("Jerry")
  103. }
  104. fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
  105. where
  106. E: Error,
  107. {
  108. match v {
  109. "Jerry" => Ok(&Jerry),
  110. _ => Err(Error::invalid_value(Unexpected::Str(v), &self)),
  111. }
  112. }
  113. }
  114. deserializer.deserialize_str(Visitor)
  115. }
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement