master
1const Writer = struct {
2 /// Calls print and then flushes the buffer.
3 pub fn print(self: *Writer, comptime format: []const u8, args: anytype) anyerror!void {
4 const State = enum {
5 start,
6 open_brace,
7 close_brace,
8 };
9
10 comptime var start_index: usize = 0;
11 comptime var state = State.start;
12 comptime var next_arg: usize = 0;
13
14 inline for (format, 0..) |c, i| {
15 switch (state) {
16 State.start => switch (c) {
17 '{' => {
18 if (start_index < i) try self.write(format[start_index..i]);
19 state = State.open_brace;
20 },
21 '}' => {
22 if (start_index < i) try self.write(format[start_index..i]);
23 state = State.close_brace;
24 },
25 else => {},
26 },
27 State.open_brace => switch (c) {
28 '{' => {
29 state = State.start;
30 start_index = i;
31 },
32 '}' => {
33 try self.printValue(args[next_arg]);
34 next_arg += 1;
35 state = State.start;
36 start_index = i + 1;
37 },
38 's' => {
39 continue;
40 },
41 else => @compileError("Unknown format character: " ++ [1]u8{c}),
42 },
43 State.close_brace => switch (c) {
44 '}' => {
45 state = State.start;
46 start_index = i;
47 },
48 else => @compileError("Single '}' encountered in format string"),
49 },
50 }
51 }
52 comptime {
53 if (args.len != next_arg) {
54 @compileError("Unused arguments");
55 }
56 if (state != State.start) {
57 @compileError("Incomplete format string: " ++ format);
58 }
59 }
60 if (start_index < format.len) {
61 try self.write(format[start_index..format.len]);
62 }
63 try self.flush();
64 }
65
66 fn write(self: *Writer, value: []const u8) !void {
67 _ = self;
68 _ = value;
69 }
70 pub fn printValue(self: *Writer, value: anytype) !void {
71 _ = self;
72 _ = value;
73 }
74 fn flush(self: *Writer) !void {
75 _ = self;
76 }
77};
78
79// syntax