Error handling
This commit is contained in:
@@ -5,15 +5,18 @@ impl Machine {
|
|||||||
Machine::new(MachineConfig::in_memory().with_toplevel(include_str!("../lib_toplevel.pl")))
|
Machine::new(MachineConfig::in_memory().with_toplevel(include_str!("../lib_toplevel.pl")))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn run_query(&mut self, query: String) -> QueryResult {
|
pub fn run_query(&mut self, query: String) -> Result<QueryResult, String> {
|
||||||
self.set_user_input(query);
|
self.set_user_input(query);
|
||||||
self.run_top_level(atom!("$toplevel"), (atom!("run_input_once"), 0));
|
self.run_top_level(atom!("$toplevel"), (atom!("run_input_once"), 0));
|
||||||
self.parse_output()
|
self.parse_output()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn parse_output(&self) -> QueryResult {
|
pub fn parse_output(&self) -> Result<QueryResult, String> {
|
||||||
let output = self.get_user_output();
|
let output = self.get_user_output().trim().to_string();
|
||||||
output
|
if output.starts_with("error(") {
|
||||||
|
Err(output)
|
||||||
|
} else {
|
||||||
|
Ok(output
|
||||||
.split(";")
|
.split(";")
|
||||||
.map(|s| s.trim())
|
.map(|s| s.trim())
|
||||||
.map(|s| s.replace(".", ""))
|
.map(|s| s.replace(".", ""))
|
||||||
@@ -21,7 +24,8 @@ impl Machine {
|
|||||||
.map(QueryResultLine::try_from)
|
.map(QueryResultLine::try_from)
|
||||||
.filter_map(Result::ok)
|
.filter_map(Result::ok)
|
||||||
.collect::<Vec<QueryResultLine>>()
|
.collect::<Vec<QueryResultLine>>()
|
||||||
.into()
|
.into())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -48,24 +52,35 @@ mod tests {
|
|||||||
let output = machine.run_query(query);
|
let output = machine.run_query(query);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
output,
|
output,
|
||||||
QueryResult::Matches(vec![
|
Ok(QueryResult::Matches(vec![
|
||||||
QueryMatch::from(btreemap! {
|
QueryMatch::from(btreemap! {
|
||||||
"P" => Value::from("p1"),
|
"P" => Value::from("p1"),
|
||||||
}),
|
}),
|
||||||
QueryMatch::from(btreemap! {
|
QueryMatch::from(btreemap! {
|
||||||
"P" => Value::from("p2"),
|
"P" => Value::from("p2"),
|
||||||
}),
|
}),
|
||||||
])
|
]))
|
||||||
);
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
machine.run_query(String::from(r#"triple("a","p1","b")."#)),
|
machine.run_query(String::from(r#"triple("a","p1","b")."#)),
|
||||||
QueryResult::True
|
Ok(QueryResult::True)
|
||||||
);
|
);
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
machine.run_query(String::from(r#"triple("x","y","z")."#)),
|
machine.run_query(String::from(r#"triple("x","y","z")."#)),
|
||||||
QueryResult::False
|
Ok(QueryResult::False)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn failing_query() {
|
||||||
|
let mut machine = Machine::new_lib();
|
||||||
|
let query = String::from(r#"triple("a",P,"b")."#);
|
||||||
|
let output = machine.run_query(query);
|
||||||
|
assert_eq!(
|
||||||
|
output,
|
||||||
|
Err(String::from("error(existence_error(procedure,triple/3),triple/3)."))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user