flow_record_common/
record_pack.rsuse std::io::Cursor;
use rmpv::Value;
use crate::{Error, ObjectType, FlowRecord};
pub struct RecordPack(Value);
impl RecordPack {
    pub fn with_descriptor(descriptor: Value) -> Self {
        Self(Value::Array(vec![
            ObjectType::RecordPackTypeDescriptor.into(),
            descriptor,
        ]))
    }
    pub fn with_record<R>(record: R) -> Self
    where
        R: FlowRecord,
    {
        Self(Value::Array(vec![
            ObjectType::RecordPackTypeRecord.into(),
            Value::Array(vec![
                Value::Array(vec![
                    Value::String(R::name().into()),
                    Value::Integer(R::descriptor_hash().into()),
                ]),
                record.into_value(),
            ]),
        ]))
    }
    pub fn inner(&self) -> &Value {
        &self.0
    }
}
impl TryFrom<RecordPack> for Value {
    type Error = rmpv::encode::Error;
    fn try_from(value: RecordPack) -> Result<Self, Self::Error> {
        let mut buffer = Vec::new();
        rmpv::encode::write_value(&mut buffer, &value.0)?;
        Ok(Value::Ext(ObjectType::RecordTypeExt as i8, buffer))
    }
}
impl TryFrom<Value> for RecordPack {
    type Error = crate::Error;
    fn try_from(value: Value) -> Result<Self, Self::Error> {
        match value {
            Value::Ext(type_id, vec) => {
                if type_id == ObjectType::RecordTypeExt as i8 {
                    let payload = rmpv::decode::read_value(&mut Cursor::new(vec))?;
                    Ok(Self(payload))
                } else {
                    Err(Error::InvalidExtTypeId(type_id))
                }
            }
            _ => Err(Error::ExpectedExtValue),
        }
    }
}