deserialize.rs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. #![allow(clippy::unreadable_literal, dead_code)]
  2. use serde::{serde_if_integer128, Deserialize};
  3. use serde_derive::Deserialize;
  4. use std::collections::BTreeMap as Map;
  5. use std::fmt::Debug;
  6. fn test<'de, T>(json: &'de str, expected: &str)
  7. where
  8. T: Deserialize<'de> + Debug,
  9. {
  10. let de = &mut serde_json::Deserializer::from_str(json);
  11. let result: Result<T, _> = serde_path_to_error::deserialize(de);
  12. let path = result.unwrap_err().path().to_string();
  13. assert_eq!(path, expected);
  14. }
  15. #[test]
  16. fn test_struct() {
  17. #[derive(Deserialize, Debug)]
  18. struct Package {
  19. name: String,
  20. dependencies: Map<String, Dependency>,
  21. }
  22. #[derive(Deserialize, Debug)]
  23. struct Dependency {
  24. version: String,
  25. }
  26. let j = r#"{
  27. "name": "demo",
  28. "dependencies": {
  29. "serde": {
  30. "version": 1
  31. }
  32. }
  33. }"#;
  34. test::<Package>(j, "dependencies.serde.version");
  35. }
  36. #[test]
  37. fn test_vec() {
  38. #[derive(Deserialize, Debug)]
  39. struct Package {
  40. dependencies: Vec<Dependency>,
  41. }
  42. #[derive(Deserialize, Debug)]
  43. struct Dependency {
  44. name: String,
  45. version: String,
  46. }
  47. let j = r#"{
  48. "dependencies": [
  49. {
  50. "name": "serde",
  51. "version": "1.0"
  52. },
  53. {
  54. "name": "serde_json",
  55. "version": 1
  56. }
  57. }
  58. }"#;
  59. test::<Package>(j, "dependencies[1].version");
  60. }
  61. #[test]
  62. fn test_option() {
  63. #[derive(Deserialize, Debug)]
  64. struct Package {
  65. dependency: Option<Dependency>,
  66. }
  67. #[derive(Deserialize, Debug)]
  68. struct Dependency {
  69. version: String,
  70. }
  71. let j = r#"{
  72. "dependency": {
  73. "version": 1
  74. }
  75. }"#;
  76. test::<Package>(j, "dependency.version");
  77. }
  78. #[test]
  79. fn test_struct_variant() {
  80. #[derive(Deserialize, Debug)]
  81. struct Package {
  82. dependency: Dependency,
  83. }
  84. #[derive(Deserialize, Debug)]
  85. enum Dependency {
  86. Struct { version: String },
  87. }
  88. let j = r#"{
  89. "dependency": {
  90. "Struct": {
  91. "version": 1
  92. }
  93. }
  94. }"#;
  95. test::<Package>(j, "dependency.Struct.version");
  96. }
  97. #[test]
  98. fn test_tuple_variant() {
  99. #[derive(Deserialize, Debug)]
  100. struct Package {
  101. dependency: Dependency,
  102. }
  103. #[derive(Deserialize, Debug)]
  104. enum Dependency {
  105. Tuple(String, String),
  106. }
  107. let j = r#"{
  108. "dependency": {
  109. "Tuple": ["serde", 1]
  110. }
  111. }"#;
  112. test::<Package>(j, "dependency.Tuple[1]");
  113. }
  114. #[test]
  115. fn test_unknown_field() {
  116. #[derive(Deserialize, Debug)]
  117. struct Package {
  118. dependency: Dependency,
  119. }
  120. #[derive(Deserialize, Debug)]
  121. #[serde(deny_unknown_fields)]
  122. struct Dependency {
  123. version: String,
  124. }
  125. let j = r#"{
  126. "dependency": {
  127. "version": "1.0",
  128. "name": "serde"
  129. }
  130. }"#;
  131. test::<Package>(j, "dependency.name");
  132. }
  133. #[test]
  134. fn test_invalid_length() {
  135. #[derive(Deserialize, Debug)]
  136. struct Package {
  137. dependency: Dependency,
  138. }
  139. #[derive(Deserialize, Debug)]
  140. struct Dependency(String, String);
  141. let j = r#"{
  142. "dependency": ["serde"]
  143. }"#;
  144. test::<Package>(j, "dependency");
  145. }
  146. #[test]
  147. fn test_syntax_error() {
  148. #[derive(Deserialize, Debug)]
  149. struct Package {
  150. dependency: Dependency,
  151. }
  152. #[derive(Deserialize, Debug)]
  153. struct Dependency {
  154. version: String,
  155. }
  156. let j = r#"{
  157. "dependency": {
  158. "error": *
  159. }"#;
  160. test::<Package>(j, "dependency.error");
  161. }
  162. serde_if_integer128! {
  163. #[test]
  164. fn test_u128() {
  165. #[derive(Deserialize, Debug)]
  166. struct Container {
  167. n: u128,
  168. }
  169. let j = r#"{
  170. "n": 130033514578017493995102500318550798591
  171. }"#;
  172. let de = &mut serde_json::Deserializer::from_str(j);
  173. let container: Container =
  174. serde_path_to_error::deserialize(de).expect("failed to deserialize");
  175. assert_eq!(container.n, 130033514578017493995102500318550798591u128);
  176. }
  177. }