use super::{
super::{data::*, entities::*},
errors::*,
};
pub trait Store {
fn create_id(&self, id: &mut ID) -> Result<(), StoreError>;
fn get_class(&self, id: &ID) -> Result<Option<Class>, StoreError>;
fn add_class(&self, class: Class) -> Result<(), StoreError>;
fn get_vertex_template(&self, id: &ID) -> Result<Option<VertexTemplate>, StoreError>;
fn add_vertex_template(&self, vertex_template: VertexTemplate) -> Result<(), StoreError>;
fn get_edge_template(&self, id: &ID) -> Result<Option<EdgeTemplate>, StoreError>;
fn add_edge_template(&self, edge_template: EdgeTemplate) -> Result<(), StoreError>;
fn get_vertex(&self, id: &ID) -> Result<Option<Vertex>, StoreError>;
fn get_vertexes(&self, directories: Option<Vec<Directory>>) -> Result<Vec<Vertex>, StoreError>;
fn add_vertex(&self, vertex: Vertex) -> Result<(), StoreError>;
fn get_edge(&self, id: &ID) -> Result<Option<Edge>, StoreError>;
fn add_edge(&self, edge: Edge) -> Result<(), StoreError>;
}
pub trait StoreUtilities {
fn get_entity_as_expression(&self, id: &ID) -> Result<Option<Expression>, StoreError>;
}
impl<StoreT> StoreUtilities for StoreT
where
StoreT: Store,
{
fn get_entity_as_expression(&self, id: &ID) -> Result<Option<Expression>, StoreError> {
let variant = match id.kind {
EntityKind::Class => self.get_class(&id)?.map(|class| Ok(class.into())),
EntityKind::VertexTemplate => {
self.get_vertex_template(&id)?.map(|vertex_template| vertex_template.into_expression(false, self))
}
EntityKind::EdgeTemplate => {
self.get_edge_template(&id)?.map(|edge_template| edge_template.into_expression(false, self))
}
EntityKind::Vertex => self.get_vertex(&id)?.map(|vertex| vertex.into_expression(false, self)),
EntityKind::Edge => self.get_edge(&id)?.map(|edge| edge.into_expression(false, self)),
};
Ok(match variant {
Some(variant) => Some(variant?),
None => None,
})
}
}