serde_ipld_dagcbor/
codec.rs

1//! Implementation of ipld-core's `Codec` trait.
2
3use std::io::{BufRead, Write};
4
5use ipld_core::{
6    cid::Cid,
7    codec::{Codec, Links},
8    serde::ExtractLinks,
9};
10use serde::{de::Deserialize, ser::Serialize};
11
12use crate::{de::Deserializer, error::CodecError, DAG_CBOR_CODE};
13
14/// DAG-CBOR implementation of ipld-core's `Codec` trait.
15#[derive(Copy, Clone, Debug, PartialEq, Eq)]
16pub struct DagCborCodec;
17
18impl<T> Codec<T> for DagCborCodec
19where
20    T: for<'a> Deserialize<'a> + Serialize,
21{
22    const CODE: u64 = DAG_CBOR_CODE;
23    type Error = CodecError;
24
25    fn decode<R: BufRead>(reader: R) -> Result<T, Self::Error> {
26        Ok(crate::from_reader(reader)?)
27    }
28
29    fn encode<W: Write>(writer: W, data: &T) -> Result<(), Self::Error> {
30        Ok(crate::to_writer(writer, data)?)
31    }
32}
33
34impl Links for DagCborCodec {
35    type LinksError = CodecError;
36
37    fn links(data: &[u8]) -> Result<impl Iterator<Item = Cid>, Self::LinksError> {
38        let mut deserializer = Deserializer::from_slice(data);
39        Ok(ExtractLinks::deserialize(&mut deserializer)?
40            .into_vec()
41            .into_iter())
42    }
43}