Serialize the sidecar (codec state + all encoded vectors) to bytes. Format: `[NDCC (4 bytes)][version: u8 = 1][msgpack payload]`
(&self)
| 57 | /// |
| 58 | /// Format: `[NDCC (4 bytes)][version: u8 = 1][msgpack payload]` |
| 59 | pub fn to_bytes(&self) -> Result<Vec<u8>, RerankError> { |
| 60 | let codec_bytes = self.codec.to_bytes()?; |
| 61 | let codec_name_byte = codec_name_to_u8(self.codec.name()); |
| 62 | |
| 63 | #[derive( |
| 64 | serde::Serialize, serde::Deserialize, zerompk::ToMessagePack, zerompk::FromMessagePack, |
| 65 | )] |
| 66 | struct Payload { |
| 67 | codec_name: u8, |
| 68 | codec_bytes: Vec<u8>, |
| 69 | encoded: Vec<(u32, Vec<u8>)>, |
| 70 | } |
| 71 | |
| 72 | let payload = Payload { |
| 73 | codec_name: codec_name_byte, |
| 74 | codec_bytes, |
| 75 | encoded: self.encoded.iter().map(|(k, v)| (*k, v.clone())).collect(), |
| 76 | }; |
| 77 | |
| 78 | let body = zerompk::to_msgpack_vec(&payload) |
| 79 | .map_err(|e| RerankError::BadInput(format!("sidecar serialize: {e}")))?; |
| 80 | let mut buf = Vec::with_capacity(5 + body.len()); |
| 81 | buf.extend_from_slice(&SIDECAR_MAGIC); |
| 82 | buf.push(SIDECAR_VERSION); |
| 83 | buf.extend_from_slice(&body); |
| 84 | Ok(buf) |
| 85 | } |
| 86 | |
| 87 | /// Deserialize a sidecar from bytes produced by [`Self::to_bytes`]. |
| 88 | pub fn from_bytes(bytes: &[u8]) -> Result<Self, RerankError> { |