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