use crate::protocol::util;
use byteorder::{LittleEndian, ReadBytesExt};
#[derive(Debug)]
#[allow(dead_code)]
pub struct PartitionInformation {
partition_method: PartitionMethod,
parameter_descriptor: Vec<ParameterDescriptor>,
partitions: Vec<Partitions>,
}
#[derive(Debug, Clone, Copy)]
enum PartitionMethod {
Invalid,
RoundRobin,
Hash,
}
impl PartitionMethod {
pub fn from_i8(val: i8) -> std::io::Result<Self> {
match val {
0 => Ok(Self::Invalid),
1 => Ok(Self::RoundRobin),
2 => Ok(Self::Hash),
_ => Err(util::io_error(format!(
"PartitionMethod {} not implemented",
val
))),
}
}
}
#[derive(Debug, Clone, Copy)]
enum ParameterFunction {
Invalid,
Year,
Month,
}
impl ParameterFunction {
pub fn from_i8(val: i8) -> std::io::Result<Self> {
match val {
0 => Ok(Self::Invalid),
1 => Ok(Self::Year),
2 => Ok(Self::Month),
_ => Err(util::io_error(format!(
"ParameterFunction {} not implemented",
val
))),
}
}
}
#[allow(dead_code)]
#[derive(Debug, Clone, Copy)]
pub struct ParameterDescriptor {
parameter_index: i32,
parameter_function: ParameterFunction,
attribute_type: i8,
}
#[allow(dead_code)]
#[derive(Debug, Clone, Copy)]
pub struct Partitions {
val1: i32,
val2: i32,
}
impl PartitionInformation {
pub fn parse(rdr: &mut dyn std::io::Read) -> std::io::Result<Self> {
let partition_method = PartitionMethod::from_i8(rdr.read_i8()?)?; util::skip_bytes(7, rdr)?;
let num_parameters = rdr.read_i32::<LittleEndian>()?;
let num_partitions = rdr.read_i32::<LittleEndian>()?;
let mut parameter_descriptor = vec![];
for _ in 0..num_parameters {
let desc = ParameterDescriptor {
parameter_index: rdr.read_i32::<LittleEndian>()?,
parameter_function: ParameterFunction::from_i8(rdr.read_i8()?)?,
attribute_type: rdr.read_i8()?,
};
util::skip_bytes(2, rdr)?;
parameter_descriptor.push(desc);
}
let mut partitions = vec![];
for _ in 0..num_partitions {
partitions.push({
Partitions {
val1: rdr.read_i32::<LittleEndian>()?,
val2: rdr.read_i32::<LittleEndian>()?,
}
});
}
Ok(Self {
partition_method,
parameter_descriptor,
partitions,
})
}
}