Skip to main content

seeding/
exchange_dataset.rs

1use serde::{Deserialize, Serialize};
2use std::fmt::Display;
3use std::fs::File;
4use std::iter::Zip;
5
6#[derive(Clone, Debug, Serialize, Deserialize)]
7pub struct ExchangeDataset {
8    pub requests: Vec<Vec<u8>>,
9    pub responses: Vec<Vec<u8>>,
10}
11
12impl Display for ExchangeDataset {
13    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
14        write!(f, "REQUEST\nRESPONSE\n\n")?;
15        self.clone()
16            .into_iter()
17            .try_for_each(|(req, res)| write!(f, "{:?}\n{:?}\n\n", req, res))
18    }
19}
20
21impl ExchangeDataset {
22    pub fn from_file(file_path: &str) -> Result<ExchangeDataset, String> {
23        let file = File::open(file_path)
24            .map_err(|e| format!("Unable to open file at {file_path}: {:?}", e))?;
25        let dataset: ExchangeDataset = rmp_serde::from_read(file)
26            .map_err(|e| format!("Unable to deserialize msgpack data: {:?}", e))?;
27        Ok(dataset)
28    }
29}
30
31impl IntoIterator for ExchangeDataset {
32    type Item = (Vec<u8>, Vec<u8>);
33    type IntoIter = Zip<std::vec::IntoIter<Vec<u8>>, std::vec::IntoIter<Vec<u8>>>;
34
35    fn into_iter(self) -> Self::IntoIter {
36        self.requests.into_iter().zip(self.responses)
37    }
38}