/ src / serde_utils.rs
serde_utils.rs
 1  
 2  use serde::{Deserialize, Deserializer, Serialize, Serializer};
 3  
 4  pub mod network_kind {
 5  	use super::*;
 6      use bitcoin::NetworkKind;
 7  
 8  	pub fn serialize<S: ::serde::Serializer>(network: &NetworkKind, s: S) -> Result<S::Ok, S::Error> {
 9  		match network {
10  			NetworkKind::Main => s.serialize_str("main"),
11  			NetworkKind::Test => s.serialize_str("test"),
12  		}
13  	}
14  
15  	pub fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<NetworkKind, D::Error> {
16  		use serde::de::Error;
17  
18  		match <&str>::deserialize(d)? {
19  			"main" => Ok(NetworkKind::Main),
20  			"test" => Ok(NetworkKind::Test),
21  			k => Err(D::Error::custom(format!("unknown network kind: {}", k))),
22  		}
23  	}
24  }
25  
26  /// Utility struct to serialize byte strings as hex.
27  #[derive(Clone, PartialEq, Eq, Debug, Hash)]
28  pub struct HexBytes(pub Vec<u8>);
29  
30  impl HexBytes {
31  	pub fn hex(&self) -> String {
32  		hex::encode(&self.0)
33  	}
34  
35  	pub fn bytes(&self) -> &[u8] {
36  		&self.0
37  	}
38  
39  	pub fn take_bytes(self) -> Vec<u8> {
40  		self.0
41  	}
42  }
43  
44  impl From<Vec<u8>> for HexBytes {
45  	fn from(vec: Vec<u8>) -> HexBytes {
46  		HexBytes(vec)
47  	}
48  }
49  
50  impl<'a> From<&'a [u8]> for HexBytes {
51  	fn from(slice: &'a [u8]) -> HexBytes {
52  		HexBytes(slice.to_vec())
53  	}
54  }
55  
56  impl Serialize for HexBytes {
57  	fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
58  		s.serialize_str(&hex::encode(&self.0))
59  	}
60  }
61  
62  impl<'de> Deserialize<'de> for HexBytes {
63  	fn deserialize<D: Deserializer<'de>>(d: D) -> Result<HexBytes, D::Error> {
64  		use serde::de::Error;
65  
66  		let hex_str = <&str>::deserialize(d)?;
67  		Ok(HexBytes(hex::decode(hex_str).map_err(D::Error::custom)?))
68  	}
69  }