use crate::codec::Codec;
use serde::{Deserialize, Serialize};
use std::io::{BufRead, Write};
use thiserror::Error;
#[repr(u64)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum Encoding {
#[cfg(feature = "dag_cbor")]
DagCbor = 0x71,
#[cfg(feature = "dag_json")]
DagJson = 0x0129,
#[cfg(feature = "jwt")]
Jwt = 0x6a77,
#[cfg(feature = "eip191")]
Eip191 = 0xe191,
}
impl<T: Serialize + for<'a> Deserialize<'a>> Codec<T> for Encoding {
type EncodingError = EncodingError;
type DecodingError = DecodingError;
fn multicodec_code(&self) -> u64 {
*self as u64
}
fn try_from_tags(code: &[u64]) -> Option<Self> {
if code.is_empty() {
return None;
}
if code.len() > 1 {
return None;
}
match code.first()? {
#[cfg(feature = "dag_cbor")]
0x71 => Some(Encoding::DagCbor),
#[cfg(feature = "dag_json")]
0x0129 => Some(Encoding::DagJson),
#[cfg(feature = "jwt")]
0x6a77 => Some(Encoding::Jwt),
#[cfg(feature = "eip191")]
0xe191 => Some(Encoding::Eip191),
_ => None,
}
}
fn encode_payload<W: Write>(
&self,
payload: &T,
buffer: &mut W,
) -> Result<(), Self::EncodingError> {
match self {
#[cfg(feature = "dag_cbor")]
Encoding::DagCbor => Ok(serde_ipld_dagcbor::to_writer(buffer, payload)?),
#[cfg(feature = "dag_json")]
Encoding::DagJson => Ok(serde_ipld_dagjson::to_writer(buffer, payload)?),
#[cfg(feature = "jwt")]
Encoding::Jwt => todo!(),
#[cfg(feature = "eip191")]
Encoding::Eip191 => todo!(),
}
}
fn decode_payload<R: BufRead>(&self, reader: &mut R) -> Result<T, Self::DecodingError> {
match self {
#[cfg(feature = "dag_cbor")]
Encoding::DagCbor => Ok(serde_ipld_dagcbor::from_reader(reader)?),
#[cfg(feature = "dag_json")]
Encoding::DagJson => Ok(serde_ipld_dagjson::from_reader(reader)?),
#[cfg(feature = "jwt")]
Encoding::Jwt => todo!(),
#[cfg(feature = "eip191")]
Encoding::Eip191 => todo!(),
}
}
}
#[derive(Debug, Error)]
pub enum EncodingError {
#[cfg(feature = "dag_cbor")]
#[error(transparent)]
CborError(#[from] serde_ipld_dagcbor::EncodeError<std::io::Error>),
#[cfg(feature = "dag_json")]
#[error(transparent)]
JsonError(#[from] serde_ipld_dagjson::error::EncodeError),
}
#[derive(Debug, Error)]
pub enum DecodingError {
#[cfg(feature = "dag_cbor")]
#[error(transparent)]
CborError(#[from] serde_ipld_dagcbor::DecodeError<std::io::Error>),
#[cfg(feature = "dag_json")]
#[error(transparent)]
JsonError(#[from] serde_ipld_dagjson::error::DecodeError),
}