gremlin_client/structure/
result.rs

1use crate::message::Response;
2use crate::pool::GremlinConnectionManager;
3use crate::structure::GValue;
4use crate::{GremlinClient, GremlinResult};
5use r2d2::PooledConnection;
6use std::collections::VecDeque;
7
8#[derive(Debug)]
9pub struct GResultSet {
10    client: GremlinClient,
11    results: VecDeque<GValue>,
12    response: Response,
13    conn: PooledConnection<GremlinConnectionManager>,
14}
15
16impl GResultSet {
17    pub(crate) fn new(
18        client: GremlinClient,
19        results: VecDeque<GValue>,
20        response: Response,
21        conn: PooledConnection<GremlinConnectionManager>,
22    ) -> GResultSet {
23        GResultSet {
24            client,
25            results,
26            response,
27            conn,
28        }
29    }
30
31    fn fetch(&mut self) -> GremlinResult<()> {
32        if self.results.is_empty() && self.response.status.code == 206 {
33            let (response, resuts) = self.client.read_response(&mut self.conn)?;
34            self.response = response;
35            self.results = resuts;
36        }
37        Ok(())
38    }
39}
40
41impl Iterator for GResultSet {
42    type Item = GremlinResult<GValue>;
43
44    fn next(&mut self) -> Option<Self::Item> {
45        match self.fetch() {
46            Ok(_) => self.results.pop_front().map(Ok),
47            Err(e) => Some(Err(e)),
48        }
49    }
50}