about summary refs log tree commit diff
path: root/src/root.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/root.zig')
-rw-r--r--src/root.zig33
1 files changed, 24 insertions, 9 deletions
diff --git a/src/root.zig b/src/root.zig
index 57f99c0..4e278e3 100644
--- a/src/root.zig
+++ b/src/root.zig
@@ -12,7 +12,7 @@ const declarations = std.meta.declarations;
 const eql = std.mem.eql;
 const expectEqual = std.testing.expectEqual;
 const expectEqualDeep = std.testing.expectEqualDeep;
-const expectError = std.testing.expectError;
+const expectEqualStrings = std.testing.expectEqualStrings;
 const std = @import("std");
 const toLower = std.ascii.toLower;
 const zeroes = std.mem.zeroes;
@@ -350,19 +350,27 @@ test "isomorphism" {
 }
 
 /// Evaluates the Janet program given in str.
-pub fn eval(comptime T: type, str: []const u8, src: [*:0]const u8) !T {
+pub fn eval(comptime T: type, str: []const u8,
+            src: [*:0]const u8) !union (enum) { ret: T, err: []const u8 } {
     var ret: Value = undefined;
     const errflags = janet.dobytes(root_env, str.ptr, @intCast(str.len),
                                    src, &ret);
     // Errors are already logged by Janet,
     // among them only one is returned and not machine-readable.
-    return if (errflags == 0) unwrap(T, ret) else error.JanetError;
+    return if (errflags == 0) .{
+        .ret = try unwrap(T, ret)
+    } else .{
+        .err = try unwrap([]const u8, ret)
+    };
 }
 
 test eval {
     init();
     defer deinit();
-    try expectEqual(try eval(i32, "(+ 3 7)", @src().fn_name), 10);
+    switch (try eval(i32, "(+ 3 7)", @src().fn_name)) {
+        .ret => |ret| try expectEqual(@as(i32, 10), ret),
+        .err => return error.TestUnexpectedError,
+    }
 }
 
 /// Binds val to name.
@@ -382,9 +390,10 @@ test def {
     init();
     defer deinit();
     try def("seven", Number{ .n = 7 }, "number 7 in a struct");
-    const nine = try eval(Number, "(:next-n (:next-n seven))",
-                              @src().fn_name);
-    try expectEqual(Number{ .n = 9 }, nine);
+    switch (try eval(Number, "(:next-n (:next-n seven))", @src().fn_name)) {
+        .ret => |nine| try expectEqual(Number{ .n = 9 }, nine),
+        .err => return error.TestUnexpectedError,
+    }
 }
 
 /// Gets value.
@@ -433,7 +442,10 @@ test defn {
         .documentation = "(add a b)\n\nReturn a + b.",
         .source = @src(),
     });
-    try expectEqual(try eval(i32, "(add 3 7)", @src().fn_name), 10);
+    switch (try eval(i32, "(add 3 7)", @src().fn_name)) {
+        .ret => |ret| try expectEqual(@as(i32, 10), ret),
+        .err => return error.TestUnexpectedError,
+    }
 
     try defn(struct {
         fn raise() !void { return error.ThisIsFine; }
@@ -442,5 +454,8 @@ test defn {
         .documentation = "(raise)\n\nRaise an error.",
         .source = @src(),
     });
-    try expectError(error.JanetError, eval(void, "(raise)", @src().fn_name));
+    switch (try eval(void, "(raise)", @src().fn_name)) {
+        .ret => return error.TestExpectedError,
+        .err => |err| try expectEqualStrings("this is fine", err),
+    }
 }