#![forbid(unsafe_code)]
mod ast;
mod client;
mod diagnostic;
pub mod error;
mod evaluator;
mod parser;
mod plan;
mod prelude;
mod pretty;
mod storage;
mod substitution;
mod term;
mod unify;
mod universe;
mod value;
pub use ast::{Atom, Clause, Query};
pub use client::{
DatafoxClient, DatafoxConfig, DatafoxEnvironment, DatafoxEnvironmentBuilder,
InMemoryPreparedQueryStorage, PlanningCache, PreparedQueryKey, PreparedQueryStorage,
};
pub use diagnostic::{Diagnostic, Span};
pub use error::{Error, Result};
pub use evaluator::{Evaluation, EvaluationStrategy};
pub use parser::{parse_queries, parse_query};
pub use plan::{PREPARED_QUERY_FORMAT_VERSION, Plan, Planner, PreparedQuery};
pub use prelude::{BinaryOperator, BinaryRelation, OperatorOutcome, Prelude, RelationOutcome};
pub use pretty::{format_queries, format_query};
pub use storage::{
AtomRole, FactEstimate, FactRequest, FactRequestHints, FactRequestMode, FactScan, FactStore,
FactTuple, InMemoryStorage, PatternValue, Projection, SnapshotSelector, Storage, TupleStream,
matches_pattern,
};
pub use substitution::Substitution;
pub use term::Term;
pub use unify::Unifier;
pub use universe::Universe;
pub use value::Value;
#[macro_export]
macro_rules! atom {
($name:expr, $args:expr) => {{ $crate::Atom::new($name, $args).expect("invalid atom") }};
}
#[macro_export]
macro_rules! var {
($name:expr) => {{ $crate::Term::variable($name).expect("invalid variable") }};
}
#[macro_export]
macro_rules! lit {
($value:expr) => {{ $crate::Term::constant($value) }};
}
#[macro_export]
macro_rules! subst {
($(($name:expr, $value:expr)),* $(,)?) => {{
$crate::Substitution::from_bindings(vec![
$(($name.to_string(), $value)),*
])
}};
}
#[cfg(test)]
mod tests {
use crate::{Atom, Substitution, Term, Value};
#[test]
fn convenience_macros_build_terms_atoms_and_substitutions() {
let atom = atom!(
"spotify:displayName",
vec![crate::var!("Album"), crate::lit!(Value::string("2112"))]
);
let substitution = crate::subst![
("Album", Value::string("spotify:album:2112")),
("Name", Value::string("2112")),
];
assert_eq!(
atom,
Atom::new(
"spotify:displayName",
vec![
Term::variable("Album").expect("variable"),
Term::constant(Value::string("2112")),
],
)
.expect("atom"),
);
assert_eq!(
substitution,
Substitution::from_bindings(vec![
("Album".to_string(), Value::string("spotify:album:2112")),
("Name".to_string(), Value::string("2112")),
]),
);
}
}