summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lambda-calcul/rust/README.md1
-rw-r--r--lambda-calcul/rust/src/ast.rs22
2 files changed, 21 insertions, 2 deletions
diff --git a/lambda-calcul/rust/README.md b/lambda-calcul/rust/README.md
index 89c81d2..0b13e5c 100644
--- a/lambda-calcul/rust/README.md
+++ b/lambda-calcul/rust/README.md
@@ -73,6 +73,7 @@ There are `--port` and `--host` arguments should one want to change the default
* [ ] propose to send JSON or S-Exp
* [ ] persist user state to avoid losing connections
* [ ] deploy automatically server on punkachien.net with radicle CI
+* [ ] better JSON representation for AST than raw serde stuff
* [ ] ask people to implement something
* [ ] prepare starter kit to overcome
diff --git a/lambda-calcul/rust/src/ast.rs b/lambda-calcul/rust/src/ast.rs
index d0f1d6f..0aaeab4 100644
--- a/lambda-calcul/rust/src/ast.rs
+++ b/lambda-calcul/rust/src/ast.rs
@@ -102,7 +102,6 @@ mod ast_tests {
use proptest::prelude::*;
proptest! {
-
#[test]
fn display_multiple_applications_as_a_sequence(atoms in vec("[a-z]".prop_map(Sym), 2..10)) {
let init = atoms.first().unwrap().clone();
@@ -112,6 +111,25 @@ mod ast_tests {
assert_eq!(value.to_string(),
format!("({})",
atoms.iter().map(|v| v.to_string()).collect::<Vec<String>>().join(" ")));
- }
+ }
+
+ #[test]
+ fn can_serialize_and_deserialize(value in any::<Value>()) {
+ let serialized = serde_json::to_string(&value).unwrap();
+ let deserialized: Value = serde_json::from_str(&serialized).unwrap();
+ assert_eq!(value, deserialized);
+ }
+ }
+
+ #[test]
+ fn can_represent_let_expression_in_json() {
+ let let_expr = Let(
+ "x".to_string(),
+ Box::new(Num(42)),
+ Box::new(Sym("x".to_string())),
+ );
+ let serialized = serde_json::to_string(&let_expr).unwrap();
+ let expected = r#"{"Let":["x",{"Num":42},{"Sym":"x"}]}"#;
+ assert_eq!(serialized, expected);
}
}