use std::convert::TryFrom;
use crate::format_code::EncodingCodes;
pub const OFFSET_LIST8: usize = 1;
pub const OFFSET_LIST32: usize = 4;
pub const OFFSET_MAP8: usize = 1;
pub const OFFSET_MAP32: usize = 4;
pub const OFFSET_ARRAY8: usize = 2;
pub const OFFSET_ARRAY32: usize = 5;
pub enum Category {
Fixed(usize),
Variable(usize),
Compound(usize),
Array(usize),
}
pub struct IsDescribed;
impl TryFrom<EncodingCodes> for Category {
type Error = IsDescribed;
fn try_from(value: EncodingCodes) -> Result<Self, Self::Error> {
let value = match value {
EncodingCodes::DescribedType => return Err(IsDescribed),
EncodingCodes::Null => Category::Fixed(0),
EncodingCodes::Boolean => Category::Fixed(1),
EncodingCodes::BooleanTrue => Category::Fixed(0),
EncodingCodes::BooleanFalse => Category::Fixed(0),
EncodingCodes::Ubyte => Category::Fixed(1),
EncodingCodes::Ushort => Category::Fixed(2),
EncodingCodes::Uint => Category::Fixed(4),
EncodingCodes::SmallUint => Category::Fixed(1),
EncodingCodes::Uint0 => Category::Fixed(0),
EncodingCodes::Ulong => Category::Fixed(8),
EncodingCodes::SmallUlong => Category::Fixed(1),
EncodingCodes::Ulong0 => Category::Fixed(0),
EncodingCodes::Byte => Category::Fixed(1),
EncodingCodes::Short => Category::Fixed(2),
EncodingCodes::Int => Category::Fixed(4),
EncodingCodes::SmallInt => Category::Fixed(1),
EncodingCodes::Long => Category::Fixed(8),
EncodingCodes::SmallLong => Category::Fixed(1),
EncodingCodes::Float => Category::Fixed(4),
EncodingCodes::Double => Category::Fixed(8),
EncodingCodes::Decimal32 => Category::Fixed(4),
EncodingCodes::Decimal64 => Category::Fixed(8),
EncodingCodes::Decimal128 => Category::Fixed(16),
EncodingCodes::Char => Category::Fixed(4),
EncodingCodes::Timestamp => Category::Fixed(8),
EncodingCodes::Uuid => Category::Fixed(16),
EncodingCodes::Vbin8 => Category::Variable(1),
EncodingCodes::Vbin32 => Category::Variable(4),
EncodingCodes::Str8 => Category::Variable(1),
EncodingCodes::Str32 => Category::Variable(4),
EncodingCodes::Sym8 => Category::Variable(1),
EncodingCodes::Sym32 => Category::Variable(4),
EncodingCodes::List0 => Category::Fixed(0),
EncodingCodes::List8 => Category::Compound(1),
EncodingCodes::List32 => Category::Compound(4),
EncodingCodes::Map8 => Category::Compound(1),
EncodingCodes::Map32 => Category::Compound(4),
EncodingCodes::Array8 => Category::Array(1),
EncodingCodes::Array32 => Category::Array(4),
};
Ok(value)
}
}