gremlin-client 0.8.10

A Rust client for Apache TinkerPop™
Documentation
use crate::aio::result::GResultSet;
pub(crate) mod remote;
use crate::conversion::FromGValue;
use crate::structure::Traverser;
use crate::GremlinResult;
use core::task::Context;
use core::task::Poll;
use futures::Stream;
use std::marker::PhantomData;
use std::pin::Pin;

use pin_project_lite::pin_project;

pub use remote::AsyncTerminator;

pin_project! {
    pub struct RemoteTraversalStream<T> {
        phantom: PhantomData<T>,
        #[pin]
        stream: GResultSet,
    }
}

impl<T> RemoteTraversalStream<T> {
    fn new(stream: GResultSet) -> Self {
        RemoteTraversalStream {
            phantom: PhantomData,
            stream,
        }
    }
}
impl<T: FromGValue> Stream for RemoteTraversalStream<T> {
    type Item = GremlinResult<T>;

    fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
        let this = self.project();

        let item = futures::ready!(this.stream.poll_next(cx));

        Poll::Ready(item.map(|e| {
            e.expect("Failed to take an item from the result set")
                .take::<Traverser>()
                .expect("Failed to convert the item to a Traverser")
                .take::<T>()
        }))
    }
}