serde_utils.rs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. //! Utilities for serde
  2. pub mod serde_url {
  3. use serde::Deserialize;
  4. use url::Url;
  5. pub fn serialize<S>(url: &Url, serializer: S) -> Result<S::Ok, S::Error>
  6. where
  7. S: serde::Serializer,
  8. {
  9. serializer.serialize_str(url.to_string().trim_end_matches('/'))
  10. }
  11. pub fn deserialize<'de, D>(deserializer: D) -> Result<Url, D::Error>
  12. where
  13. D: serde::Deserializer<'de>,
  14. {
  15. let url_string = String::deserialize(deserializer)?;
  16. Url::parse(&url_string).map_err(serde::de::Error::custom)
  17. }
  18. }
  19. pub mod bytes_base64 {
  20. use base64::{engine::general_purpose, Engine as _};
  21. use serde::Deserialize;
  22. pub fn serialize<S>(my_bytes: &Vec<u8>, serializer: S) -> Result<S::Ok, S::Error>
  23. where
  24. S: serde::Serializer,
  25. {
  26. let encoded = general_purpose::STANDARD.encode(my_bytes);
  27. serializer.serialize_str(&encoded)
  28. }
  29. pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<u8>, D::Error>
  30. where
  31. D: serde::Deserializer<'de>,
  32. {
  33. let encoded = String::deserialize(deserializer)?;
  34. let decoded = general_purpose::STANDARD
  35. .decode(encoded)
  36. .map_err(serde::de::Error::custom)?;
  37. Ok(decoded)
  38. }
  39. }
  40. pub mod serde_public_key {
  41. use k256::PublicKey;
  42. use serde::Deserialize;
  43. pub fn serialize<S>(pubkey: &PublicKey, serializer: S) -> Result<S::Ok, S::Error>
  44. where
  45. S: serde::Serializer,
  46. {
  47. let encoded = hex::encode(pubkey.to_sec1_bytes());
  48. serializer.serialize_str(&encoded)
  49. }
  50. pub fn deserialize<'de, D>(deserializer: D) -> Result<PublicKey, D::Error>
  51. where
  52. D: serde::Deserializer<'de>,
  53. {
  54. let encoded = String::deserialize(deserializer)?;
  55. let decoded = hex::decode(encoded).map_err(serde::de::Error::custom)?;
  56. PublicKey::from_sec1_bytes(&decoded).map_err(serde::de::Error::custom)
  57. }
  58. pub mod opt {
  59. use k256::PublicKey;
  60. use serde::{Deserialize, Deserializer};
  61. pub fn serialize<S>(pubkey: &Option<PublicKey>, serializer: S) -> Result<S::Ok, S::Error>
  62. where
  63. S: serde::Serializer,
  64. {
  65. match pubkey {
  66. Some(pubkey) => {
  67. let encoded = hex::encode(pubkey.to_sec1_bytes());
  68. serializer.serialize_str(&encoded)
  69. }
  70. None => serializer.serialize_none(),
  71. }
  72. }
  73. pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<PublicKey>, D::Error>
  74. where
  75. D: Deserializer<'de>,
  76. {
  77. let option_str: Option<String> = Option::deserialize(deserializer)?;
  78. match option_str {
  79. Some(encoded) => {
  80. let bytes = hex::decode(encoded).map_err(serde::de::Error::custom)?;
  81. let pubkey =
  82. PublicKey::from_sec1_bytes(&bytes).map_err(serde::de::Error::custom)?;
  83. Ok(Some(pubkey))
  84. }
  85. None => Ok(None),
  86. }
  87. }
  88. }
  89. }