use serde::{Serialize, Deserialize};
use serde_tuple::{Deserialize_tuple, Serialize_tuple};
use serde_json::Value;
#[derive(Debug, Default, Serialize, Deserialize)]
pub struct Domain(Vec<DomainLeaf>);
#[derive(Debug, Serialize, Deserialize)]
#[serde(untagged)]
pub enum DomainLeaf {
Term(DomainTerm),
Operator(DomainOperator)
}
#[derive(Debug, Serialize_tuple, Deserialize_tuple)]
pub struct DomainTerm {
field_name: String,
operator: DomainTermOperator,
value: Value,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(untagged)]
pub enum DomainTermOperator {
#[serde(rename = "=")]
Eq,
#[serde(rename = "!=")]
Ne,
#[serde(rename = ">")]
Gt,
#[serde(rename = ">=")]
Ge,
#[serde(rename = "<")]
Lt,
#[serde(rename = "<=")]
Le,
#[serde(rename = "=?")]
EqOrUnset,
#[serde(rename = "like")]
Like,
#[serde(rename = "=like")]
LikeEq,
#[serde(rename = "not like")]
NotLike,
#[serde(rename = "ilike")]
ILike,
#[serde(rename = "=ilike")]
ILikeEq,
#[serde(rename = "not ilike")]
NotILike,
#[serde(rename = "in")]
In,
#[serde(rename = "not in")]
NotIn,
#[serde(rename = "child_of")]
ChildOf,
#[serde(rename = "parent_of")]
ParentOf,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum DomainOperator {
#[serde(rename = "!")]
Not,
#[serde(rename = "&")]
And,
#[serde(rename = "|")]
Or,
}
impl Domain {
pub fn new() -> Self {
Self(Vec::new())
}
pub fn push(&mut self, value: DomainLeaf) {
self.0.push(value)
}
pub fn insert(&mut self, index: usize, item: DomainLeaf) {
self.0.insert(index, item)
}
pub fn add(&mut self, field_name: &str, operator: DomainTermOperator, value: impl Into<Value>) -> &mut Self {
self.insert(0, DomainLeaf::new(field_name, operator, value));
self
}
pub fn and(&mut self, field_name: &str, operator: DomainTermOperator, value: impl Into<Value>) -> &mut Self {
self.insert(0, DomainLeaf::AND());
self.insert(0, DomainLeaf::new(field_name, operator, value));
self
}
pub fn or(&mut self, field_name: &str, operator: DomainTermOperator, value: impl Into<Value>) -> &mut Self {
self.insert(0, DomainLeaf::AND());
self.insert(0, DomainLeaf::new(field_name, operator, value));
self
}
pub fn normalize(self) -> Self {
self
}
}
impl DomainLeaf {
pub fn new(field_name: &str, operator: DomainTermOperator, value: impl Into<Value>) -> Self {
Self::Term(DomainTerm {
field_name: field_name.into(),
operator,
value: value.into()
})
}
#[allow(non_snake_case)]
pub fn AND() -> Self {
Self::Operator(DomainOperator::And)
}
#[allow(non_snake_case)]
pub fn OR() -> Self {
Self::Operator(DomainOperator::Or)
}
#[allow(non_snake_case)]
pub fn NOT() -> Self {
Self::Operator(DomainOperator::Not)
}
}
pub mod test {}