gremlin-client 0.8.10

A Rust client for Apache TinkerPop™
Documentation
mod remote;
use crate::conversion::FromGValue;
use crate::process::traversal::remote::Terminator;
use crate::process::traversal::GraphTraversal;
use crate::process::traversal::RemoteTraversalIterator;
use crate::{GremlinError, GremlinResult};
pub use remote::RemoteStrategy;

#[derive(Clone)]
pub enum TraversalStrategy {
    Remote(RemoteStrategy),
}

impl TraversalStrategy {
    pub(crate) fn apply<S, E: FromGValue, A>(
        &self,
        traversal: &GraphTraversal<S, E, A>,
    ) -> GremlinResult<RemoteTraversalIterator<E>>
    where
        A: Terminator<E>,
    {
        match self {
            TraversalStrategy::Remote(x) => x.apply(traversal),
        }
    }
}

#[derive(Clone)]
pub struct TraversalStrategies {
    strategies: Vec<TraversalStrategy>,
}

impl TraversalStrategies {
    pub(crate) fn new(strategies: Vec<TraversalStrategy>) -> TraversalStrategies {
        TraversalStrategies { strategies }
    }
    pub(crate) fn add_strategy(&mut self, strategy: TraversalStrategy) {
        self.strategies.push(strategy);
    }

    pub(crate) fn apply<S, E: FromGValue, A>(
        &self,
        traversal: &GraphTraversal<S, E, A>,
    ) -> GremlinResult<RemoteTraversalIterator<E>>
    where
        A: Terminator<E>,
    {
        let mut iter = None;
        for strategy in self.strategies.iter() {
            iter = Some(strategy.apply(traversal)?);
        }

        iter.map(Ok)
            .unwrap_or_else(|| Err(GremlinError::Generic(String::from("Empty traversal"))))
    }
}