From 45de3a14a4c48f28104715fca0a872fc609515a3 Mon Sep 17 00:00:00 2001 From: bakaq Date: Sat, 14 Dec 2024 03:21:28 -0300 Subject: [PATCH] Add Serialize impl for LeafAnswer --- src/machine/lib_machine/mod.rs | 22 ++++++++++++++++++++++ src/machine/lib_machine/tests.rs | 23 +++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/src/machine/lib_machine/mod.rs b/src/machine/lib_machine/mod.rs index a3f8d4ac0..2394af029 100644 --- a/src/machine/lib_machine/mod.rs +++ b/src/machine/lib_machine/mod.rs @@ -44,6 +44,28 @@ pub enum LeafAnswer { }, } +impl Serialize for LeafAnswer { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + match self { + LeafAnswer::True => serializer.serialize_bool(true), + LeafAnswer::False => serializer.serialize_bool(false), + LeafAnswer::Exception(e) => { + let mut map = serializer.serialize_map(Some(1))?; + map.serialize_entry("exception", &e)?; + map.end() + } + LeafAnswer::LeafAnswer { bindings } => { + let mut map = serializer.serialize_map(Some(1))?; + map.serialize_entry("bindings", &bindings)?; + map.end() + } + } + } +} + impl LeafAnswer { /// Creates a leaf answer with no residual goals. pub fn from_bindings>(bindings: impl IntoIterator) -> Self { diff --git a/src/machine/lib_machine/tests.rs b/src/machine/lib_machine/tests.rs index 538fee578..9e876b926 100644 --- a/src/machine/lib_machine/tests.rs +++ b/src/machine/lib_machine/tests.rs @@ -692,3 +692,26 @@ fn term_json_serialize_disjunctions() { assert_eq!(json_value, serde_json::to_value(prolog_value).unwrap()); } + +#[test] +#[cfg_attr(miri, ignore)] +fn leaf_answer_json_serialize() { + let leaf_answers = [ + LeafAnswer::True, + LeafAnswer::False, + LeafAnswer::Exception(Term::atom("a")), + LeafAnswer::from_bindings([("X", Term::atom("a")), ("Y", Term::string("b"))]), + ]; + + let json_value = json!([ + true, + false, + { "exception": { "atom": "a" } }, + { "bindings": { + "X": { "atom": "a" }, + "Y": "b", + }}, + ]); + + assert_eq!(json_value, serde_json::to_value(leaf_answers).unwrap()); +}