use crate::*;
use std::any::Any;
use crate::error::CodecResult;
pub trait RawFixedBytes {
fn raw_bytes() -> Option<usize> {
None
}
fn raw_max_bytes() -> Option<usize> {
Self::raw_bytes()
}
fn raw_min_bytes() -> Option<usize> {
Self::raw_bytes()
}
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub enum RawEncodePurpose {
Serialize,
Hash,
}
#[derive(Debug, Clone)]
pub struct RawDecodeOption {
pub version: u8,
pub format: u8,
}
impl Default for RawDecodeOption {
fn default() -> Self {
Self {
version: 0,
format: OBJECT_CONTENT_CODEC_FORMAT_RAW,
}
}
}
pub trait RawEncode {
fn raw_measure(&self, purpose: &Option<RawEncodePurpose>) -> CodecResult<usize>;
fn raw_encode<'a>(
&self,
buf: &'a mut [u8],
purpose: &Option<RawEncodePurpose>,
) -> CodecResult<&'a mut [u8]>;
fn raw_tail_encode<'a>(
&self,
buf: &'a mut [u8],
purpose: &Option<RawEncodePurpose>,
) -> CodecResult<&'a [u8]> {
let remain_buf = self.raw_encode(buf, purpose)?;
let remain_len = remain_buf.len();
Ok(&buf[..(buf.len() - remain_len)])
}
fn raw_encode_to_buffer(&self) -> CodecResult<Vec<u8>> {
let size = self.raw_measure(&None)?;
let mut encode_buf = vec![0u8; size];
let buf = self.raw_encode(&mut encode_buf, &None)?;
assert_eq!(buf.len(), 0);
Ok(encode_buf)
}
fn raw_hash_encode(&self) -> CodecResult<Vec<u8>> {
let size = self.raw_measure(&Some(RawEncodePurpose::Hash))?;
let mut buf = vec![0u8; size];
let remain_buf = self.raw_encode(&mut buf, &Some(RawEncodePurpose::Hash))?;
assert!(remain_buf.len() == 0);
Ok(buf)
}
}
pub trait RawEncodeWithContext<Context> {
fn raw_measure_with_context(
&self,
_: &mut Context,
purpose: &Option<RawEncodePurpose>,
) -> CodecResult<usize>;
fn raw_encode_with_context<'a>(
&self,
buf: &'a mut [u8],
_: &mut Context,
purpose: &Option<RawEncodePurpose>,
) -> CodecResult<&'a mut [u8]>;
fn raw_tail_encode_with_context<'a>(
&self,
buf: &'a mut [u8],
context: &mut Context,
purpose: &Option<RawEncodePurpose>,
) -> CodecResult<&'a [u8]> {
let remain_buf = self.raw_encode_with_context(buf, context, purpose)?;
let remain_len = remain_buf.len();
Ok(&buf[..(buf.len() - remain_len)])
}
}
pub trait RawDecode<'de>: Sized {
fn raw_decode(buf: &'de [u8]) -> CodecResult<(Self, &'de [u8])>;
fn raw_decode_with_option(
buf: &'de [u8],
_opt: &RawDecodeOption,
) -> CodecResult<(Self, &'de [u8])> {
Self::raw_decode(buf)
}
}
pub trait RawDecodeWithContext<'de, Context>: Sized {
fn raw_decode_with_context(buf: &'de [u8], _: Context) -> CodecResult<(Self, &'de [u8])>;
}
pub trait RawMergable: Clone + Any {
fn raw_merge_ok(&self, other: &Self) -> bool;
}
impl<T: RawEncode + Eq + Clone + Any> RawMergable for T {
fn raw_merge_ok(&self, other: &Self) -> bool {
self.eq(other)
}
}