batch_mode_batch_schema/
batch_output_data.rs

1// ---------------- [ File: src/batch_output_data.rs ]
2crate::ix!();
3
4#[derive(Debug, Serialize, Deserialize)]
5pub struct BatchOutputData {
6    responses: Vec<BatchResponseRecord>,
7}
8
9unsafe impl Send for BatchOutputData {}
10unsafe impl Sync for BatchOutputData {}
11
12impl BatchOutputData {
13
14    pub fn len(&self) -> usize {
15        self.responses.len()
16    }
17
18    pub fn new(responses: Vec<BatchResponseRecord>) -> Self {
19        Self { responses }
20    }
21
22    pub fn responses(&self) -> &Vec<BatchResponseRecord> {
23        &self.responses
24    }
25
26    pub fn request_ids(&self) -> Vec<CustomRequestId> {
27        self.responses.iter().map(|r| r.custom_id().clone()).collect()
28    }
29
30    /// Returns an iterator over the BatchResponseRecord elements.
31    pub fn iter(&self) -> std::slice::Iter<BatchResponseRecord> {
32        self.responses.iter()
33    }
34}
35
36#[async_trait]
37impl LoadFromFile for BatchOutputData {
38
39    type Error = JsonParseError;
40
41    async fn load_from_file(
42        file_path: impl AsRef<Path> + Send,
43    ) -> Result<Self, Self::Error> {
44
45        let file   = File::open(file_path).await?;
46        let reader = BufReader::new(file);
47
48        let mut lines     = reader.lines();
49        let mut responses = Vec::new();
50
51        while let Some(line) = lines.next_line().await? {
52            let response_record: BatchResponseRecord = serde_json::from_str(&line)?;
53            responses.push(response_record);
54        }
55
56        Ok(BatchOutputData::new(responses))
57    }
58}
59
60impl From<Vec<BatchOutputData>> for BatchOutputData {
61    fn from(batch_outputs: Vec<BatchOutputData>) -> Self {
62        // Flatten the responses from all BatchOutputData instances into a single vector.
63        let aggregated_responses = batch_outputs
64            .into_iter()
65            .flat_map(|output_data| output_data.responses)
66            .collect();
67        BatchOutputData::new(aggregated_responses)
68    }
69}
70
71impl<'a> IntoIterator for &'a BatchOutputData {
72    type Item = &'a BatchResponseRecord;
73    type IntoIter = std::slice::Iter<'a, BatchResponseRecord>;
74
75    fn into_iter(self) -> Self::IntoIter {
76        self.responses.iter()
77    }
78}
79
80impl IntoIterator for BatchOutputData {
81    type Item = BatchResponseRecord;
82    type IntoIter = std::vec::IntoIter<BatchResponseRecord>;
83
84    fn into_iter(self) -> Self::IntoIter {
85        self.responses.into_iter()
86    }
87}