mod printers;
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Default)]
pub struct Program {
pub predicates: Vec<Predicate>,
pub queries: Vec<Query>,
pub rules: Vec<Rule>,
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub struct NamedField<T> {
pub name: String,
pub val: T,
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub enum Fields<T> {
Ordered(Vec<T>),
Named(Vec<NamedField<T>>),
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub struct FieldType {
pub type_: String,
pub aggregator: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub struct Predicate {
pub name: String,
pub fields: Fields<FieldType>,
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub struct Query {
pub name: String,
pub clauses: Vec<Clause>,
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub struct Clause {
pub pred_name: String,
pub matches: Fields<Match>,
pub circumscribed: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub enum Match {
Var(String),
Const(String),
Unbound,
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub struct Rule {
pub name: String,
pub head: Clause,
pub body: Vec<Clause>,
pub func: Option<String>,
pub stage: Option<usize>,
}