From 6321828006394266ccdbf21d13678b1674cfe519 Mon Sep 17 00:00:00 2001 From: Jeremy Wall Date: Sun, 20 Jan 2019 08:32:05 -0600 Subject: [PATCH] FEATURE: The begnnings of some schema definition utilities. Also allow failure messages to be generated from any expression. --- src/parse/mod.rs | 2 +- std/schema.ucg | 15 +++++++++++++++ std/tests/schema_test.ucg | 12 ++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 std/schema.ucg create mode 100644 std/tests/schema_test.ucg diff --git a/src/parse/mod.rs b/src/parse/mod.rs index 3febdbc..2add3aa 100644 --- a/src/parse/mod.rs +++ b/src/parse/mod.rs @@ -663,7 +663,7 @@ make_fn!( do_each!( pos => pos, _ => word!("fail"), - msg => must!(wrap_err!(either!(format_expression, string_expression), "Expected failure message")), + msg => must!(wrap_err!(expression, "Expected failure message")), (Expression::Fail(FailDef{ pos: pos, message: Box::new(msg), diff --git a/std/schema.ucg b/std/schema.ucg new file mode 100644 index 0000000..d6a1bad --- /dev/null +++ b/std/schema.ucg @@ -0,0 +1,15 @@ +let one_of = module { + val=NULL, + types=[], +} => { + let reducer = macro(acc, t) => acc{ + ok = acc.ok || (acc.val is t), + }; + let any = macro(val, types) => reduce reducer {ok=false, val=val}, types; + + let result = any(mod.val, mod.types).ok; +}; + +let must = macro(m, msg) => select m.result, fail msg, { + true = m.result, +}; diff --git a/std/tests/schema_test.ucg b/std/tests/schema_test.ucg new file mode 100644 index 0000000..4a9676d --- /dev/null +++ b/std/tests/schema_test.ucg @@ -0,0 +1,12 @@ +let t = import "std/testing.ucg".asserts{}; +let schema = import "std/schema.ucg"; + +assert t.ok{ + test = schema.must(schema.one_of{val=1, types=["float", "int"]}, "Must be a float or an int"), + desc = "1 is an int", +}; + +assert t.not_ok{ + test = schema.one_of{val=1, types=["float", "str"]}.result, + desc = "1 is not a float or string", +}; \ No newline at end of file