serde.rs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. pub mod hex {
  2. use {
  3. hex::FromHex,
  4. serde::{de::IntoDeserializer, Deserialize, Deserializer, Serializer},
  5. };
  6. pub fn serialize<S, const N: usize>(b: &[u8; N], s: S) -> Result<S::Ok, S::Error>
  7. where
  8. S: Serializer,
  9. {
  10. s.serialize_str(hex::encode(b).as_str())
  11. }
  12. pub fn deserialize<'de, D, R>(d: D) -> Result<R, D::Error>
  13. where
  14. D: Deserializer<'de>,
  15. R: FromHex,
  16. <R as hex::FromHex>::Error: std::fmt::Display,
  17. {
  18. let full: String = Deserialize::deserialize(d)?;
  19. let hex = full
  20. .strip_prefix("0x")
  21. .or_else(|| full.strip_prefix("0X"))
  22. .unwrap_or(&full);
  23. hex::serde::deserialize(hex.into_deserializer())
  24. }
  25. #[cfg(test)]
  26. #[allow(clippy::unwrap_used, reason = "tests")]
  27. mod tests {
  28. use serde::Deserialize;
  29. #[derive(Debug, Deserialize, PartialEq)]
  30. struct H(#[serde(with = "super")] [u8; 32]);
  31. #[test]
  32. fn test_deserialize() {
  33. let e = H([
  34. 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab,
  35. 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67,
  36. 0x89, 0xab, 0xcd, 0xef,
  37. ]);
  38. let l = "\"0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\"";
  39. let u = "\"0x0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF\"";
  40. assert_eq!(serde_json::from_str::<H>(l).unwrap(), e);
  41. assert_eq!(serde_json::from_str::<H>(u).unwrap(), e);
  42. let l = "\"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\"";
  43. let u = "\"0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF\"";
  44. assert_eq!(serde_json::from_str::<H>(l).unwrap(), e);
  45. assert_eq!(serde_json::from_str::<H>(u).unwrap(), e);
  46. }
  47. #[test]
  48. fn test_deserialize_invalid_length() {
  49. let l = "\"0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcde\"";
  50. let u = "\"0X0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE\"";
  51. assert!(serde_json::from_str::<H>(l).is_err());
  52. assert!(serde_json::from_str::<H>(u).is_err());
  53. let l = "\"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcde\"";
  54. let u = "\"0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE\"";
  55. assert!(serde_json::from_str::<H>(l).is_err());
  56. assert!(serde_json::from_str::<H>(u).is_err());
  57. }
  58. #[test]
  59. fn test_deserialize_invalid_hex() {
  60. let l = "\"0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdeg\"";
  61. let u = "\"0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdeg\"";
  62. assert!(serde_json::from_str::<H>(l).is_err());
  63. assert!(serde_json::from_str::<H>(u).is_err());
  64. let l = "\"0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdeg\"";
  65. let u = "\"0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdeg\"";
  66. assert!(serde_json::from_str::<H>(l).is_err());
  67. assert!(serde_json::from_str::<H>(u).is_err());
  68. }
  69. }
  70. }