use crate::{DatabaseError, Id};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SortOrder {
Asc,
Desc,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct EdgeCursor<'a> {
pub sort_key: &'a [u8],
pub destination: Id,
}
impl<'a> EdgeCursor<'a> {
pub fn new(sort_key: &'a [u8], destination: Id) -> Self {
Self {
sort_key,
destination,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Edge {
pub source: Id,
pub sort_key: Vec<u8>,
pub dest: Id,
}
impl Edge {
pub fn new(source: Id, sort_key: Vec<u8>, dest: Id) -> Self {
Self {
source,
sort_key,
dest,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct EdgeQueryResult {
pub edges: Vec<Edge>,
pub has_more: bool,
}
#[derive(Debug, Clone)]
pub struct EdgeQuery<'a> {
pub edge_names: &'a [&'a [u8]],
pub order: SortOrder,
pub cursor: Option<EdgeCursor<'a>>,
}
impl<'a> EdgeQuery<'a> {
pub fn asc(edge_names: &'a [&'a [u8]]) -> Self {
Self {
edge_names,
order: SortOrder::Asc,
cursor: None,
}
}
pub fn desc(edge_names: &'a [&'a [u8]]) -> Self {
Self {
edge_names,
order: SortOrder::Desc,
cursor: None,
}
}
pub fn with_cursor(mut self, cursor: EdgeCursor<'a>) -> Self {
self.cursor = Some(cursor);
self
}
pub fn with_cursor_opt(mut self, cursor: Option<EdgeCursor<'a>>) -> Self {
self.cursor = cursor;
self
}
}
pub trait QueryEdge {
fn find_edges(
&self,
source: Id,
query: EdgeQuery,
) -> Result<EdgeQueryResult, DatabaseError>;
}