#![allow(clippy::module_name_repetitions)]
use crate::{varint, Result, buf::{TailReadBytes, TailWriteBytes}};
#[derive(Copy, Clone)]
pub enum Order {
Ascending,
Descending,
Unordered
}
#[derive(Copy, Clone)]
pub enum Endianness {
Little,
Big,
Native,
}
pub trait EncodingParams: Copy {
const ORDER: Order;
const ENDIANNESS: Endianness;
}
pub trait SerializerParams: EncodingParams {
type SeqLenEncoder: LengthEncoder<Value=usize>;
type DiscriminantEncoder: LengthEncoder<Value=u32>;
}
pub trait LengthEncoder {
type Value;
fn calc_size(value: Self::Value) -> usize;
fn read(reader: impl TailReadBytes) -> Result<Self::Value>;
fn write(writer: impl TailWriteBytes, value: Self::Value) -> Result;
}
impl<T> EncodingParams for &T where T: EncodingParams {
const ORDER: Order = T::ORDER;
const ENDIANNESS: Endianness = T::ENDIANNESS;
}
impl <T> SerializerParams for &T where T: SerializerParams {
type SeqLenEncoder = T::SeqLenEncoder;
type DiscriminantEncoder = T::DiscriminantEncoder;
}
#[derive(Copy, Clone, Default)]
pub struct AscendingOrder;
impl EncodingParams for AscendingOrder {
const ORDER: Order = Order::Ascending;
const ENDIANNESS: Endianness = Endianness::Big;
}
impl SerializerParams for AscendingOrder {
type SeqLenEncoder = varint::VarIntTailLenEncoder;
type DiscriminantEncoder = varint::VarIntDiscrEncoder;
}
#[derive(Copy, Clone, Default)]
pub struct DescendingOrder;
impl EncodingParams for DescendingOrder {
const ORDER: Order = Order::Descending;
const ENDIANNESS: Endianness = Endianness::Big;
}
#[derive(Copy, Clone, Default)]
pub struct PortableBinary;
impl EncodingParams for PortableBinary {
const ORDER: Order = Order::Ascending;
const ENDIANNESS: Endianness = Endianness::Big;
}
impl SerializerParams for PortableBinary {
type SeqLenEncoder = varint::VarIntLenEncoder;
type DiscriminantEncoder = varint::VarIntDiscrEncoder;
}
#[derive(Copy, Clone, Default)]
pub struct NativeBinary;
impl EncodingParams for NativeBinary {
const ORDER: Order = Order::Unordered;
const ENDIANNESS: Endianness = Endianness::Native;
}
impl SerializerParams for NativeBinary {
type SeqLenEncoder = varint::VarIntLenEncoder;
type DiscriminantEncoder = varint::VarIntDiscrEncoder;
}