use errors::{ErrorKind, Result};
use models;
use serde_json::value::Value as JsonValue;
use std::vec::Vec;
use uuid::Uuid;
pub trait Datastore<T: Transaction> {
fn transaction(&self) -> Result<T>;
}
pub trait Transaction {
fn create_vertex(&self, vertex: &models::Vertex) -> Result<bool>;
fn create_vertex_from_type(&self, t: models::Type) -> Result<Uuid> {
let v = models::Vertex::new(t);
if !self.create_vertex(&v)? {
Err(ErrorKind::UuidConflict.into())
} else {
Ok(v.id)
}
}
fn get_vertices(&self, q: &models::VertexQuery) -> Result<Vec<models::Vertex>>;
fn delete_vertices(&self, q: &models::VertexQuery) -> Result<()>;
fn get_vertex_count(&self) -> Result<u64>;
fn create_edge(&self, key: &models::EdgeKey) -> Result<bool>;
fn get_edges(&self, q: &models::EdgeQuery) -> Result<Vec<models::Edge>>;
fn delete_edges(&self, q: &models::EdgeQuery) -> Result<()>;
fn get_edge_count(
&self,
id: Uuid,
type_filter: Option<&models::Type>,
direction: models::EdgeDirection,
) -> Result<u64>;
fn get_vertex_metadata(&self, q: &models::VertexQuery, name: &str) -> Result<Vec<models::VertexMetadata>>;
fn set_vertex_metadata(&self, q: &models::VertexQuery, name: &str, value: &JsonValue) -> Result<()>;
fn delete_vertex_metadata(&self, q: &models::VertexQuery, name: &str) -> Result<()>;
fn get_edge_metadata(&self, q: &models::EdgeQuery, name: &str) -> Result<Vec<models::EdgeMetadata>>;
fn set_edge_metadata(&self, q: &models::EdgeQuery, name: &str, value: &JsonValue) -> Result<()>;
fn delete_edge_metadata(&self, q: &models::EdgeQuery, name: &str) -> Result<()>;
}