seeding/
exchange_dataset.rs1use 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}