Deserialize a sidecar from bytes produced by [`Self::to_bytes`].
(bytes: &[u8])
| 86 | |
| 87 | /// Deserialize a sidecar from bytes produced by [`Self::to_bytes`]. |
| 88 | pub fn from_bytes(bytes: &[u8]) -> Result<Self, RerankError> { |
| 89 | if bytes.len() < 5 { |
| 90 | return Err(RerankError::BadInput( |
| 91 | "sidecar from_bytes: too short".into(), |
| 92 | )); |
| 93 | } |
| 94 | if bytes[..4] != SIDECAR_MAGIC { |
| 95 | return Err(RerankError::BadInput( |
| 96 | "sidecar from_bytes: bad magic".into(), |
| 97 | )); |
| 98 | } |
| 99 | let version = bytes[4]; |
| 100 | if version != SIDECAR_VERSION { |
| 101 | return Err(RerankError::BadInput(format!( |
| 102 | "sidecar from_bytes: unknown version {version}" |
| 103 | ))); |
| 104 | } |
| 105 | |
| 106 | #[derive( |
| 107 | serde::Serialize, serde::Deserialize, zerompk::ToMessagePack, zerompk::FromMessagePack, |
| 108 | )] |
| 109 | struct Payload { |
| 110 | codec_name: u8, |
| 111 | codec_bytes: Vec<u8>, |
| 112 | encoded: Vec<(u32, Vec<u8>)>, |
| 113 | } |
| 114 | |
| 115 | let payload: Payload = zerompk::from_msgpack(&bytes[5..]) |
| 116 | .map_err(|e| RerankError::BadInput(format!("sidecar deserialize: {e}")))?; |
| 117 | |
| 118 | let codec_name = codec_name_from_u8(payload.codec_name).ok_or_else(|| { |
| 119 | RerankError::BadInput(format!( |
| 120 | "sidecar from_bytes: unknown codec_name byte {}", |
| 121 | payload.codec_name |
| 122 | )) |
| 123 | })?; |
| 124 | let codec = super::codec::rerank_codec_from_bytes(codec_name, &payload.codec_bytes)?; |
| 125 | let encoded = payload.encoded.into_iter().collect(); |
| 126 | Ok(CodecSidecar { codec, encoded }) |
| 127 | } |
| 128 | |
| 129 | pub fn prepare_query(&self, query: &[f32]) -> Result<PreparedQuery, RerankError> { |
| 130 | self.codec.prepare_query(query) |
nothing calls this directly
no test coverage detected