cmr_core/
compressor_ipc.rs1use std::io::{Read, Write};
4
5use serde::{Deserialize, Serialize, de::DeserializeOwned};
6use thiserror::Error;
7
8pub const DEFAULT_MAX_FRAME_BYTES: usize = 8 * 1024 * 1024;
10
11#[derive(Clone, Debug, Serialize, Deserialize)]
13pub enum CompressorRequest {
14 Health,
16 CompressionDistance {
19 left: Vec<u8>,
21 right: Vec<u8>,
23 },
24 CompressionDistanceChain {
28 left_parts: Vec<Vec<u8>>,
30 right_parts: Vec<Vec<u8>>,
32 },
33 IntrinsicDependence {
35 data: Vec<u8>,
37 max_order: i64,
39 },
40 BatchCompressionDistance {
42 target: Vec<u8>,
44 candidates: Vec<Vec<u8>>,
46 },
47}
48
49#[derive(Clone, Debug, Serialize, Deserialize)]
51pub enum CompressorResponse {
52 Health { ok: bool },
54 CompressionDistance { value: f64 },
56 IntrinsicDependence { value: f64 },
58 BatchCompressionDistance { values: Vec<f64> },
60 Error { message: String },
62}
63
64#[derive(Debug, Error)]
66pub enum IpcError {
67 #[error("i/o error: {0}")]
69 Io(#[from] std::io::Error),
70 #[error("serde error: {0}")]
72 Serde(#[from] serde_json::Error),
73 #[error("frame exceeds max length")]
75 FrameTooLarge,
76}
77
78pub fn write_frame<T: Serialize>(writer: &mut impl Write, value: &T) -> Result<(), IpcError> {
80 let payload = serde_json::to_vec(value)?;
81 let len = u32::try_from(payload.len()).map_err(|_| IpcError::FrameTooLarge)?;
82 writer.write_all(&len.to_be_bytes())?;
83 writer.write_all(&payload)?;
84 writer.flush()?;
85 Ok(())
86}
87
88pub fn read_frame<T: DeserializeOwned>(
90 reader: &mut impl Read,
91 max_bytes: usize,
92) -> Result<T, IpcError> {
93 let mut len_buf = [0_u8; 4];
94 reader.read_exact(&mut len_buf)?;
95 let len = u32::from_be_bytes(len_buf) as usize;
96 if len > max_bytes {
97 return Err(IpcError::FrameTooLarge);
98 }
99 let mut payload = vec![0_u8; len];
100 reader.read_exact(&mut payload)?;
101 Ok(serde_json::from_slice(&payload)?)
102}