car-mirror 0.1.0

Rust implementation of the CAR Mirror protocol
Documentation
use std::str::FromStr;

use libipld::Cid;
use serde::{ser::SerializeSeq, Deserialize, Deserializer, Serializer};

pub(crate) fn deserialize<'de, D>(deserializer: D) -> Result<Vec<Cid>, D::Error>
where
    D: Deserializer<'de>,
{
    let strings: Vec<String> = Vec::<String>::deserialize(deserializer)?;
    let cids = strings
        .iter()
        .map(|s| Cid::from_str(s))
        .collect::<Result<Vec<Cid>, _>>()
        .map_err(serde::de::Error::custom)?;
    Ok(cids)
}

pub(crate) fn serialize<S>(cids: &Vec<Cid>, serializer: S) -> Result<S::Ok, S::Error>
where
    S: Serializer,
{
    let mut seq = serializer.serialize_seq(Some(cids.len()))?;
    for cid in cids {
        seq.serialize_element(&cid.to_string())?;
    }
    seq.end()
}