use crate::error::{BoxedTraverserError, TraverserError, TraverserResult};
use crate::traversal::context::ProfileType;
use crate::traversal::metrics::TraversalMetrics;
use crate::value::ElementProperty;
#[derive(Debug, Clone, Default, PartialEq, Eq)]
#[non_exhaustive]
pub struct ExecOptions {
profile: Option<ProfileType>,
}
impl ExecOptions {
pub fn new() -> Self {
Self::default()
}
pub fn profile(types: ProfileType) -> Self {
Self::new().with_profile(types)
}
pub fn with_profile(mut self, types: ProfileType) -> Self {
self.profile = Some(types);
self
}
pub fn without_profile(mut self) -> Self {
self.profile = None;
self
}
pub fn profile_types(&self) -> Option<ProfileType> {
self.profile
}
}
#[derive(Debug)]
#[non_exhaustive]
pub struct Execution {
pub(crate) results: Vec<ElementProperty>,
pub(crate) error: Option<BoxedTraverserError>,
pub(crate) profile: Option<TraversalMetrics>,
pub(crate) mutated: bool,
pub(crate) changes: crate::graph::UnitChanges,
}
impl Execution {
pub fn results(&self) -> &[ElementProperty] {
&self.results
}
pub fn into_results(self) -> Vec<ElementProperty> {
self.results
}
pub fn error(&self) -> Option<&TraverserError> {
self.error.as_deref()
}
pub fn mutated(&self) -> bool {
self.mutated
}
pub fn changes(&self) -> crate::graph::UnitChanges {
self.changes
}
pub fn is_ok(&self) -> bool {
self.error.is_none()
}
pub fn profile(&self) -> Option<&TraversalMetrics> {
self.profile.as_ref()
}
pub fn into_profile(self) -> Option<TraversalMetrics> {
self.profile
}
pub fn into_result(self) -> TraverserResult<Vec<ElementProperty>> {
match self.error {
Some(err) => Err(err),
None => Ok(self.results),
}
}
}