use crate::metadata::IrMetadata;
use crate::term::IrTerm;
#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
pub struct IrQuery {
pub goal: IrTerm,
pub metadata: Option<IrMetadata>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_single_goal_query() {
let q = IrQuery {
goal: IrTerm::Structure {
name: "parent".into(),
args: vec![IrTerm::Atom("alice".into()), IrTerm::Var("X".into())],
},
metadata: None,
};
assert!(q.metadata.is_none());
}
#[test]
fn test_multi_goal_query() {
let q = IrQuery {
goal: IrTerm::Structure {
name: ",".into(),
args: vec![
IrTerm::Structure {
name: "parent".into(),
args: vec![IrTerm::Atom("alice".into()), IrTerm::Var("X".into())],
},
IrTerm::Structure {
name: "parent".into(),
args: vec![IrTerm::Var("X".into()), IrTerm::Var("Y".into())],
},
],
},
metadata: None,
};
if let IrTerm::Structure { name, args } = &q.goal {
assert_eq!(name, ",");
assert_eq!(args.len(), 2);
} else {
panic!("expected Structure");
}
}
}