mod iter;
pub use iter::QueryIterator;
mod sub;
pub(crate) use sub::SubHub;
pub use sub::Subscription;
use crate::{
record::RecordRef,
utils::{Id, Path, TagSet},
};
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Query {
Id(Id),
Path(Path),
Tag(SetQuery<TagSet>),
#[cfg(test)]
#[doc(hidden)]
Fake,
}
impl Query {
pub fn id(id: Id) -> Self {
Self::Id(id)
}
pub fn path<P: Into<Path>>(p: P) -> Self {
Self::Path(p.into())
}
pub fn tags() -> TagQuery {
TagQuery
}
}
pub struct TagQuery;
impl TagQuery {
pub fn intersect<T: Into<TagSet>>(&self, t: T) -> Query {
Query::Tag(SetQuery::Intersect(t.into()))
}
pub fn subset<T: Into<TagSet>>(&self, t: T) -> Query {
Query::Tag(SetQuery::Subset(t.into()))
}
pub fn equals<T: Into<TagSet>>(&self, t: T) -> Query {
Query::Tag(SetQuery::Equals(t.into()))
}
pub fn not<T: Into<TagSet>>(&self, t: T) -> Query {
Query::Tag(SetQuery::Not(t.into()))
}
}
#[derive(Clone, Debug)]
pub enum QueryResult {
Single(RecordRef),
Many(Vec<RecordRef>),
}
impl QueryResult {
pub fn single(&self) -> bool {
match self {
Self::Single(_) => true,
Self::Many(_) => false,
}
}
pub fn merge(self, o: QueryResult) -> Self {
use self::QueryResult::*;
match (self, o) {
(Single(r1), Single(r2)) => Self::Many(vec![r1, r2]),
(Single(r), Many(mut vec)) => {
vec.push(r);
Self::Many(vec)
}
(Many(mut vec), Single(r)) => {
vec.push(r);
Self::Many(vec)
}
(Many(mut vec1), Many(mut vec2)) => {
vec1.append(&mut vec2);
Self::Many(vec1)
}
}
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum SetQuery<T> {
Intersect(T),
Subset(T),
Equals(T),
Not(T),
}