use crate::graph::GraphStorage;
use crate::*;
struct StepTo<'g, S: GraphStorage + 'g> {
args: Option<Vec<String>>,
traversal: Option<AnonymousTraversal<'g, S>>,
}
impl<'g, S: GraphStorage + 'g> Clone for StepTo<'g, S> {
fn clone(&self) -> Self {
Self {
args: self.args.clone(),
traversal: self.traversal.clone(),
}
}
}
impl<'g, S: GraphStorage + 'g> fmt::Display for StepTo<'g, S> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match (&self.args, &self.traversal) {
(_, Some(traversal)) => write!(f, "to({traversal})"),
(Some(args), None) => write!(f, "to({})", crate::value::literal::rhai_strings(args)),
(None, None) => write!(f, "to()"),
}
}
}
impl<'g, S: GraphStorage + 'g> GraphTraversalSource<'g, S> {
pub fn to<T: Into<ArgStrings>>(self, args: T) -> Self {
let args = match args.into() {
ArgStrings::None => None,
ArgStrings::String(v) => Some(vec![v]),
ArgStrings::List(v) => Some(v),
};
self.push_step(GraphStep::Modulator(
"to",
Box::new(StepTo {
args,
traversal: None,
}),
))
}
}
impl<'g, S: GraphStorage + 'g> AnonymousTraversal<'g, S> {
pub fn to<T: Into<ArgStrings>>(self, args: T) -> Self {
let args = match args.into() {
ArgStrings::None => None,
ArgStrings::String(v) => Some(vec![v]),
ArgStrings::List(v) => Some(v),
};
let step = GraphStep::Modulator(
"to",
Box::new(StepTo {
args,
traversal: None,
}),
);
self.push_step(step)
}
}
impl<'g, S: GraphStorage + 'g> GraphTraversalSource<'g, S> {
pub fn to_by(self, traversal: AnonymousTraversal<'g, S>) -> Self {
self.push_step(GraphStep::Modulator(
"to",
Box::new(StepTo {
args: None,
traversal: Some(traversal),
}),
))
}
}
impl<'g, S: GraphStorage + 'g> AnonymousTraversal<'g, S> {
pub fn to_by(self, traversal: AnonymousTraversal<'g, S>) -> Self {
self.push_step(GraphStep::Modulator(
"to",
Box::new(StepTo {
args: None,
traversal: Some(traversal),
}),
))
}
}
impl<'g, S: GraphStorage + 'g> GraphStepModulator<'g, S> for StepTo<'g, S> {
fn get_args(&mut self) -> Option<Vec<String>> {
self.args.take()
}
fn get_traversal(&mut self) -> Option<AnonymousTraversal<'g, S>> {
self.traversal.take()
}
fn child_traversals_mut(&mut self) -> Vec<&mut crate::traversal::AnonymousTraversal<'g, S>> {
self.traversal.as_mut().into_iter().collect()
}
fn clone_box(&self) -> Box<dyn GraphStepModulator<'g, S> + 'g> {
Box::new(self.clone())
}
}