use std::marker::PhantomData;
use serde_json::Value;
use super::{Sort, SortOrder, exists_q, range_q, single};
use crate::query::{Query, Root};
#[derive(Debug, Clone)]
pub struct Bool<S = Root> {
path: String,
_scope: PhantomData<fn() -> S>,
}
impl<S> Bool<S> {
pub fn at(path: impl Into<String>) -> Self {
Self {
path: path.into(),
_scope: PhantomData,
}
}
pub fn eq(&self, value: bool) -> Query<S> {
single("term", &self.path, Value::Bool(value))
}
pub fn exists(&self) -> Query<S> {
exists_q(&self.path)
}
}
#[derive(Debug, Clone)]
pub struct Number<T, S = Root> {
path: String,
_marker: PhantomData<fn() -> (T, S)>,
}
impl<T, S> Number<T, S>
where
T: Into<Value> + Copy,
{
pub fn at(path: impl Into<String>) -> Self {
Self {
path: path.into(),
_marker: PhantomData,
}
}
pub fn eq(&self, value: T) -> Query<S> {
single("term", &self.path, value.into())
}
pub fn in_(&self, values: impl IntoIterator<Item = T>) -> Query<S> {
let array = values.into_iter().map(Into::into).collect();
single("terms", &self.path, Value::Array(array))
}
pub fn lt(&self, value: T) -> Query<S> {
range_q(&self.path, vec![("lt", value.into())])
}
pub fn lte(&self, value: T) -> Query<S> {
range_q(&self.path, vec![("lte", value.into())])
}
pub fn gt(&self, value: T) -> Query<S> {
range_q(&self.path, vec![("gt", value.into())])
}
pub fn gte(&self, value: T) -> Query<S> {
range_q(&self.path, vec![("gte", value.into())])
}
pub fn between(&self, low: T, high: T) -> Query<S> {
range_q(&self.path, vec![("gte", low.into()), ("lte", high.into())])
}
pub fn exists(&self) -> Query<S> {
exists_q(&self.path)
}
pub fn asc(&self) -> Sort {
Sort::new(&self.path, SortOrder::Asc)
}
pub fn desc(&self) -> Sort {
Sort::new(&self.path, SortOrder::Desc)
}
}
#[derive(Debug, Clone)]
pub struct Date<S = Root> {
path: String,
_scope: PhantomData<fn() -> S>,
}
impl<S> Date<S> {
pub fn at(path: impl Into<String>) -> Self {
Self {
path: path.into(),
_scope: PhantomData,
}
}
pub fn eq(&self, value: impl Into<String>) -> Query<S> {
single("term", &self.path, Value::String(value.into()))
}
pub fn lt(&self, value: impl Into<String>) -> Query<S> {
range_q(&self.path, vec![("lt", Value::String(value.into()))])
}
pub fn lte(&self, value: impl Into<String>) -> Query<S> {
range_q(&self.path, vec![("lte", Value::String(value.into()))])
}
pub fn gt(&self, value: impl Into<String>) -> Query<S> {
range_q(&self.path, vec![("gt", Value::String(value.into()))])
}
pub fn gte(&self, value: impl Into<String>) -> Query<S> {
range_q(&self.path, vec![("gte", Value::String(value.into()))])
}
pub fn between(&self, low: impl Into<String>, high: impl Into<String>) -> Query<S> {
range_q(
&self.path,
vec![
("gte", Value::String(low.into())),
("lte", Value::String(high.into())),
],
)
}
pub fn exists(&self) -> Query<S> {
exists_q(&self.path)
}
pub fn asc(&self) -> Sort {
Sort::new(&self.path, SortOrder::Asc)
}
pub fn desc(&self) -> Sort {
Sort::new(&self.path, SortOrder::Desc)
}
}