1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
use rmp_serde::Serializer;
use serde::{Deserialize, Serialize};
use serde_bytes::ByteBuf;

use crate::{ObjectType, Record, RecordDescriptor};

pub struct Object(ByteBuf);

impl Object {
    fn serializer() -> Serializer<Vec<u8>> {
        rmp_serde::Serializer::new(Vec::new()).with_bytes(rmp_serde::config::BytesMode::ForceAll)
    }
    pub fn with_descriptor(descriptor: &RecordDescriptor) -> Self {
        let mut ser = Self::serializer();
        ObjectType::RecordPackTypeDescriptor.serialize(&mut ser, descriptor).unwrap();
        Self(ByteBuf::from(ser.into_inner()))
    }

    pub fn with_record<R>(record: &R) -> Self where R: Record {
        let mut ser = Self::serializer();
        let metadata = (
            R::name(),
            R::descriptor_hash(),
        );
        let ser_data = (
            metadata,
            record
        );
        ObjectType::RecordPackTypeRecord.serialize(&mut ser, &ser_data).unwrap();
        Self(ByteBuf::from(ser.into_inner()))
    }
}

impl Serialize for Object {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        SerializableExtType((ObjectType::RecordTypeExt as i8, self.0.clone())).serialize(serializer)
    }
}

#[derive(Debug, PartialEq, Serialize, Deserialize)]
#[serde(rename = "_ExtStruct")]
struct SerializableExtType((i8, serde_bytes::ByteBuf));