serde_ipld_dagcbor/
codec.rs1use 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#[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}