]> Repositorios git - scryer-prolog.git/commitdiff
Error handling
authorNicolas Luck <[email protected]>
Thu, 20 Jul 2023 20:23:51 +0000 (22:23 +0200)
committerNicolas Luck <[email protected]>
Thu, 20 Jul 2023 20:23:51 +0000 (22:23 +0200)
src/machine/lib_machine.rs

index 708c524f98073086b82a9566b54bbc5b573f451d..674a459e4c350a6c6c17f96a116c4076dcd521f8 100644 (file)
@@ -5,23 +5,27 @@ impl Machine {
         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.run_top_level(atom!("$toplevel"), (atom!("run_input_once"), 0));
         self.parse_output()
     }
 
-    pub fn parse_output(&self) -> QueryResult {
-        let output = self.get_user_output();
-        output
-            .split(";")
-            .map(|s| s.trim())
-            .map(|s| s.replace(".", ""))
-            .filter(|s| !s.is_empty())
-            .map(QueryResultLine::try_from)
-            .filter_map(Result::ok)
-            .collect::<Vec<QueryResultLine>>()
-            .into()
+    pub fn parse_output(&self) -> Result<QueryResult, String> {
+        let output = self.get_user_output().trim().to_string();
+        if output.starts_with("error(") {
+            Err(output)
+        } else {
+            Ok(output
+                .split(";")
+                .map(|s| s.trim())
+                .map(|s| s.replace(".", ""))
+                .filter(|s| !s.is_empty())
+                .map(QueryResultLine::try_from)
+                .filter_map(Result::ok)
+                .collect::<Vec<QueryResultLine>>()
+                .into())
+        }
     }
 }
 
@@ -48,24 +52,35 @@ mod tests {
         let output = machine.run_query(query);
         assert_eq!(
             output,
-            QueryResult::Matches(vec![
+            Ok(QueryResult::Matches(vec![
                 QueryMatch::from(btreemap! {
                     "P" => Value::from("p1"),
                 }),
                 QueryMatch::from(btreemap! {
                     "P" => Value::from("p2"),
                 }),
-            ])
+            ]))
         );
 
         assert_eq!(
             machine.run_query(String::from(r#"triple("a","p1","b")."#)),
-            QueryResult::True
+            Ok(QueryResult::True)
         );
 
         assert_eq!(
             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)."))
         );
     }
 }