pub trait Operators<F> {
// Required methods
fn or<FN: Fn(F) -> F>(self, builder: FN) -> Self;
fn and<FN: Fn(F) -> F>(self, builder: FN) -> Self;
fn not<FN: Fn(F) -> F>(self, builder: FN) -> Self;
}
Expand description
And/Or/Not Operators
Example
use structsy::{ Structsy, StructsyTx, StructsyError, Operators};
use structsy_derive::{queries, Persistent};
#[derive(Persistent)]
struct Basic {
name: String,
}
impl Basic {
fn new(name: &str) -> Basic {
Basic { name: name.to_string() }
}
}
#[queries(Basic)]
trait BasicQuery {
fn by_name(self, name: String) -> Self;
}
fn basic_query() -> Result<(), StructsyError> {
let structsy = Structsy::open("file.structsy")?;
structsy.define::<Basic>()?;
let mut tx = structsy.begin()?;
tx.insert(&Basic::new("aaa"))?;
tx.insert(&Basic::new("bbb"))?;
tx.commit()?;
let count = structsy.query::<Basic>().or(|or| {
or.by_name("aaa".to_string()).by_name("bbb".to_string())
}).fetch().count();
assert_eq!(count, 2);
let count = structsy.query::<Basic>().not(|not| {
not.by_name("aaa".to_string())
}).fetch().count();
assert_eq!(count, 1);
let count = structsy.query::<Basic>().and(|and| {
and.by_name("aaa".to_string()).by_name("bbb".to_string())
}).fetch().count();
assert_eq!(count, 0);
Ok(())
}