use errors::Result;
use std::vec::Vec;
use serde_json::value::Value as JsonValue;
use models;
use uuid::Uuid;
pub trait Datastore<T: Transaction> {
fn transaction(&self) -> Result<T>;
}
pub trait Transaction {
fn create_vertex(&self, t: &models::Type) -> Result<Uuid>;
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_global_metadata(&self, name: &str) -> Result<Option<JsonValue>>;
fn set_global_metadata(&self, name: &str, value: &JsonValue) -> Result<()>;
fn delete_global_metadata(&self, name: &str) -> Result<()>;
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<()>;
}