1use crate::with::AsPubkey;
2use solana_pubkey::Pubkey;
3
4type Target = Pubkey;
5
6type As = AsPubkey;
7
8pub mod opt {
9 use serde_with::{DeserializeAs, SerializeAs};
10
11 pub fn serialize<S>(sig: &Option<super::Target>, s: S) -> Result<S::Ok, S::Error>
12 where
13 S: serde::Serializer,
14 {
15 Option::<super::As>::serialize_as(sig, s)
16 }
17
18 pub fn deserialize<'de, D>(d: D) -> Result<Option<super::Target>, D::Error>
19 where
20 D: serde::Deserializer<'de>,
21 {
22 Option::<super::As>::deserialize_as(d)
23 }
24}
25
26pub fn serialize<S>(p: &Target, s: S) -> Result<S::Ok, S::Error>
27where
28 S: serde::Serializer,
29{
30 As::serialize(p, s)
31}
32
33pub fn deserialize<'de, D>(d: D) -> Result<Target, D::Error>
34where
35 D: serde::Deserializer<'de>,
36{
37 As::deserialize(d)
38}
39
40#[cfg(test)]
41mod tests {
42 use super::*;
43 use crate::Value;
44 use solana_keypair::Keypair;
45 use solana_pubkey::Pubkey;
46 use solana_signer::Signer;
47
48 fn de<'de, D: serde::Deserializer<'de>>(d: D) -> Pubkey {
49 deserialize(d).unwrap()
50 }
51
52 #[test]
53 fn test_deserialize_value() {
54 let id = solana_pubkey::new_rand();
55 assert_eq!(de(Value::String(id.to_string())), id);
56 assert_eq!(de(Value::B32(id.to_bytes())), id);
57
58 let k = Keypair::new();
59 let pk = k.pubkey();
60 assert_eq!(de(Value::B64(k.to_bytes())), pk);
61 }
62
63 #[test]
64 fn test_serialize() {
65 let id = solana_pubkey::new_rand();
66 assert_eq!(
67 serialize(&id, crate::ser::Serializer).unwrap(),
68 Value::B32(id.to_bytes())
69 );
70 }
71}