summaryrefslogtreecommitdiff
path: root/examples/hello-zig/src/root.zig
diff options
context:
space:
mode:
Diffstat (limited to 'examples/hello-zig/src/root.zig')
-rw-r--r--examples/hello-zig/src/root.zig83
1 files changed, 83 insertions, 0 deletions
diff --git a/examples/hello-zig/src/root.zig b/examples/hello-zig/src/root.zig
new file mode 100644
index 0000000..f6600ac
--- /dev/null
+++ b/examples/hello-zig/src/root.zig
@@ -0,0 +1,83 @@
1const std = @import("std");
2
3pub const OutputStyle = enum {
4 compact,
5 verbose,
6};
7
8pub const NumberKind = union(enum) {
9 negative: i64,
10 zero,
11 positive: u64,
12};
13
14pub const Greeter = struct {
15 name: []const u8,
16 punctuation: u8 = '!',
17
18 pub fn write(self: Greeter, writer: anytype, style: OutputStyle) !void {
19 switch (style) {
20 .compact => try writer.print("hello, {s}{c}\n", .{ self.name, self.punctuation }),
21 .verbose => {
22 try writer.print(
23 \\hello, {s}{c}
24 \\this sample is here to exercise Zig syntax support in Nova.
25 \\
26 , .{ self.name, self.punctuation });
27 },
28 }
29 }
30};
31
32pub fn classifyNumber(value: i64) NumberKind {
33 if (value == 0) return .zero;
34 if (value < 0) return .{ .negative = value };
35 return .{ .positive = @intCast(value) };
36}
37
38pub fn describeNumber(allocator: std.mem.Allocator, value: i64) ![]u8 {
39 return switch (classifyNumber(value)) {
40 .zero => std.fmt.allocPrint(allocator, "zero", .{}),
41 .negative => |negative| std.fmt.allocPrint(allocator, "negative({d})", .{negative}),
42 .positive => |positive| std.fmt.allocPrint(allocator, "positive({d})", .{positive}),
43 };
44}
45
46pub fn collectEvenSquares(
47 allocator: std.mem.Allocator,
48 values: []const i32,
49) !std.ArrayList(i32) {
50 var result: std.ArrayList(i32) = .empty;
51 errdefer result.deinit(allocator);
52
53 for (values) |value| {
54 if (@mod(value, 2) != 0) continue;
55 try result.append(allocator, value * value);
56 }
57
58 return result;
59}
60
61test "classifyNumber covers the main branches" {
62 try std.testing.expectEqual(NumberKind{ .negative = -5 }, classifyNumber(-5));
63 try std.testing.expectEqual(NumberKind.zero, classifyNumber(0));
64 try std.testing.expectEqual(NumberKind{ .positive = 9 }, classifyNumber(9));
65}
66
67test "collectEvenSquares keeps only even numbers" {
68 const values = [_]i32{ -4, -3, 0, 1, 2, 7 };
69 var result = try collectEvenSquares(std.testing.allocator, &values);
70 defer result.deinit(std.testing.allocator);
71
72 try std.testing.expectEqualSlices(i32, &.{ 16, 0, 4 }, result.items);
73}
74
75test "Greeter.write renders verbose output" {
76 var list: std.ArrayList(u8) = .empty;
77 defer list.deinit(std.testing.allocator);
78
79 const writer = list.writer(std.testing.allocator);
80 try (Greeter{ .name = "Zig" }).write(writer, .verbose);
81
82 try std.testing.expect(std.mem.indexOf(u8, list.items, "exercise Zig syntax support") != null);
83}