1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
use crate::message::Response;
use crate::pool::GremlinConnectionManager;
use crate::structure::GValue;
use crate::{GremlinClient, GremlinResult};
use r2d2::PooledConnection;
use std::collections::VecDeque;

#[derive(Debug)]
pub struct GResultSet {
    client: GremlinClient,
    results: VecDeque<GValue>,
    response: Response,
    conn: PooledConnection<GremlinConnectionManager>,
}

impl GResultSet {
    pub(crate) fn new(
        client: GremlinClient,
        results: VecDeque<GValue>,
        response: Response,
        conn: PooledConnection<GremlinConnectionManager>,
    ) -> GResultSet {
        GResultSet {
            client,
            results,
            response,
            conn,
        }
    }

    fn fetch(&mut self) -> GremlinResult<()> {
        if self.results.is_empty() && self.response.status.code == 206 {
            let (response, resuts) = self.client.read_response(&mut self.conn)?;
            self.response = response;
            self.results = resuts;
        }
        Ok(())
    }
}

impl Iterator for GResultSet {
    type Item = GremlinResult<GValue>;

    fn next(&mut self) -> Option<Self::Item> {
        match self.fetch() {
            Ok(_) => self.results.pop_front().map(Ok),
            Err(e) => Some(Err(e)),
        }
    }
}