use super::traversal_model_error::TraversalModelError;
use crate::model::property::{edge::Edge, vertex::Vertex};
use crate::model::traversal::state::traversal_state::TraversalState;
pub trait TraversalModel: Send + Sync {
fn state_variable_names(&self) -> Vec<String>;
fn initial_state(&self) -> TraversalState;
fn traverse_edge(
&self,
src: &Vertex,
edge: &Edge,
dst: &Vertex,
state: &TraversalState,
) -> Result<TraversalState, TraversalModelError>;
fn access_edge(
&self,
v1: &Vertex,
src: &Edge,
v2: &Vertex,
dst: &Edge,
v3: &Vertex,
state: &TraversalState,
) -> Result<Option<TraversalState>, TraversalModelError>;
fn estimate_traversal(
&self,
src: &Vertex,
dst: &Vertex,
state: &TraversalState,
) -> Result<TraversalState, TraversalModelError>;
fn serialize_state(&self, _state: &TraversalState) -> serde_json::Value {
serde_json::json!({})
}
fn serialize_state_info(&self, _state: &TraversalState) -> serde_json::Value {
serde_json::json!({})
}
fn serialize_state_with_info(&self, state: &TraversalState) -> serde_json::Value {
use serde_json::Value as Json;
let mut summary = self.serialize_state(state);
let summary_info = match self.serialize_state_info(state) {
Json::Null => serde_json::Map::new().into_iter(),
Json::Object(m) => m.into_iter(),
other => {
let mut m = serde_json::Map::new();
m.insert(String::from("info"), other);
m.into_iter()
}
};
for (k, v) in summary_info {
summary[k] = v;
}
summary
}
}