-use super::{Machine, MachineConfig, QueryResult, QueryResultLine, Atom};
+use super::{Machine, MachineConfig, QueryResult, QueryResolution, QueryResolutionLine, Atom};
impl Machine {
pub fn new_lib() -> Self {
Machine::new(MachineConfig::in_memory().with_toplevel(include_str!("../lib_toplevel.pl")))
}
- pub fn run_query(&mut self, query: String) -> Result<QueryResult, String> {
+ pub fn run_query(&mut self, query: String) -> QueryResult {
self.set_user_input(query);
self.run_top_level(atom!("$toplevel"), (atom!("run_input_once"), 0));
self.parse_output()
}
- pub fn parse_output(&self) -> Result<QueryResult, String> {
+ pub fn parse_output(&self) -> QueryResult {
let output = self.get_user_output().trim().to_string();
if output.starts_with("error(") {
Err(output)
.map(|s| s.trim())
.map(|s| s.replace(".", ""))
.filter(|s| !s.is_empty())
- .map(QueryResultLine::try_from)
+ .map(QueryResolutionLine::try_from)
.filter_map(Result::ok)
- .collect::<Vec<QueryResultLine>>()
+ .collect::<Vec<QueryResolutionLine>>()
.into())
}
}
let output = machine.run_query(query);
assert_eq!(
output,
- Ok(QueryResult::Matches(vec![
+ Ok(QueryResolution::Matches(vec![
QueryMatch::from(btreemap! {
"P" => Value::from("p1"),
}),
assert_eq!(
machine.run_query(String::from(r#"triple("a","p1","b")."#)),
- Ok(QueryResult::True)
+ Ok(QueryResolution::True)
);
assert_eq!(
machine.run_query(String::from(r#"triple("x","y","z")."#)),
- Ok(QueryResult::False)
+ Ok(QueryResolution::False)
);
}
use rug::*;
use std::collections::BTreeMap;
+pub type QueryResult = Result<QueryResolution, String>;
+
#[derive(Debug, Clone, PartialEq, Eq)]
-pub enum QueryResult {
+pub enum QueryResolution {
True,
False,
Matches(Vec<QueryMatch>),
}
#[derive(Debug, Clone, PartialEq, Eq)]
-pub enum QueryResultLine {
+pub enum QueryResolutionLine {
True,
False,
Match(BTreeMap<String, Value>),
}
}
-impl From<Vec<QueryResultLine>> for QueryResult {
- fn from(query_result_lines: Vec<QueryResultLine>) -> Self {
+impl From<Vec<QueryResolutionLine>> for QueryResolution {
+ fn from(query_result_lines: Vec<QueryResolutionLine>) -> Self {
// If there is only one line, and it is true or false, return that.
if query_result_lines.len() == 1 {
match query_result_lines[0].clone() {
- QueryResultLine::True => return QueryResult::True,
- QueryResultLine::False => return QueryResult::False,
+ QueryResolutionLine::True => return QueryResolution::True,
+ QueryResolutionLine::False => return QueryResolution::False,
_ => {}
}
}
// If there is at least one line with true and no matches, return true.
if query_result_lines
.iter()
- .any(|l| l == &QueryResultLine::True)
+ .any(|l| l == &QueryResolutionLine::True)
&& !query_result_lines.iter().any(|l| {
- if let &QueryResultLine::Match(_) = l {
+ if let &QueryResolutionLine::Match(_) = l {
true
} else {
false
}
})
{
- return QueryResult::True;
+ return QueryResolution::True;
}
// If there is at least one match, return all matches.
let all_matches = query_result_lines
.into_iter()
.filter(|l| {
- if let &QueryResultLine::Match(_) = l {
+ if let &QueryResolutionLine::Match(_) = l {
true
} else {
false
}
})
.map(|l| match l {
- QueryResultLine::Match(m) => QueryMatch::from(m),
+ QueryResolutionLine::Match(m) => QueryMatch::from(m),
_ => unreachable!(),
})
.collect::<Vec<_>>();
if !all_matches.is_empty() {
- return QueryResult::Matches(all_matches);
+ return QueryResolution::Matches(all_matches);
}
- QueryResult::False
+ QueryResolution::False
}
}
-impl TryFrom<String> for QueryResultLine {
+impl TryFrom<String> for QueryResolutionLine {
type Error = ();
fn try_from(string: String) -> Result<Self, Self::Error> {
match string.as_str() {
- "true" => Ok(QueryResultLine::True),
- "false" => Ok(QueryResultLine::False),
- _ => Ok(QueryResultLine::Match(
+ "true" => Ok(QueryResolutionLine::True),
+ "false" => Ok(QueryResolutionLine::False),
+ _ => Ok(QueryResolutionLine::Match(
string
.split(",")
.map(|s| s.trim())