use crate::Cid;
use multi_trait::EncodeInto;
use serde::ser::{self, SerializeStruct};
impl ser::Serialize for Cid {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: ser::Serializer,
{
if serializer.is_human_readable() {
let mut ss = serializer.serialize_struct("cid", 3)?;
ss.serialize_field("version", &self.codec.code())?;
ss.serialize_field("encoding", &self.target_codec)?;
ss.serialize_field("hash", &self.hash)?;
ss.end()
} else {
#[cfg(feature = "dag_cbor")]
{
let identity: Vec<u8> = multi_codec::Codec::Identity.into();
let mut v = identity;
v.extend_from_slice(&self.encode_into());
let bytes = multi_cbor::value::Value::Bytes(v);
let tagged = multi_cbor::tags::Tagged::new(Some(42_u64), bytes);
tagged.serialize(serializer)
}
#[cfg(not(feature = "dag_cbor"))]
{
let v: Vec<u8> = self.encode_into();
serializer.serialize_bytes(v.as_slice())
}
}
}
}