1use serde::{de::Visitor, Deserialize, Serialize};
6
7#[derive(Clone, Debug, Default, Hash, PartialOrd, Ord, PartialEq, Eq)]
13pub struct MultiBase(Vec<u8>);
14
15impl Serialize for MultiBase {
16 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
17 where
18 S: serde::Serializer,
19 {
20 serializer.serialize_str(&multibase::encode(multibase::Base::Base64, self.0.clone()))
21 }
22}
23
24impl Visitor<'_> for MultiBase {
25 type Value = MultiBase;
26
27 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
28 formatter.write_str("Expecting a multibase-formatted string representation")
29 }
30
31 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
32 where
33 E: serde::de::Error,
34 {
35 match multibase::decode(v) {
36 Ok((_, val)) => Ok(MultiBase(val)),
37 Err(e) => Err(E::custom(e)),
38 }
39 }
40}
41
42impl<'de> Deserialize<'de> for MultiBase {
43 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
44 where
45 D: serde::Deserializer<'de>,
46 {
47 deserializer.deserialize_str::<MultiBase>(Default::default())
48 }
49}