From 4e25840e08c9de6790924a515c54b6179179b198 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 17 Oct 2024 08:13:35 -0700 Subject: [PATCH] apprt/gtk: support new config diagnostics API --- src/apprt/gtk/App.zig | 12 ++++++++---- src/apprt/gtk/ConfigErrorsWindow.zig | 19 ++++++++++++++++--- src/cli/diagnostics.zig | 2 +- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/apprt/gtk/App.zig b/src/apprt/gtk/App.zig index 67d08812e..6c17e3d3e 100644 --- a/src/apprt/gtk/App.zig +++ b/src/apprt/gtk/App.zig @@ -123,9 +123,13 @@ pub fn init(core_app: *CoreApp, opts: Options) !App { errdefer config.deinit(); // If we had configuration errors, then log them. - if (!config._errors.empty()) { - for (config._errors.list.items) |err| { - log.warn("configuration error: {s}", .{err.message}); + if (!config._diagnostics.empty()) { + var buf = std.ArrayList(u8).init(core_app.alloc); + defer buf.deinit(); + for (config._diagnostics.items()) |diag| { + try diag.write(buf.writer()); + log.warn("configuration error: {s}", .{buf.items}); + buf.clearRetainingCapacity(); } } @@ -815,7 +819,7 @@ fn syncConfigChanges(self: *App) !void { /// there are new configuration errors and hide the window if the errors /// are resolved. fn updateConfigErrors(self: *App) !void { - if (!self.config._errors.empty()) { + if (!self.config._diagnostics.empty()) { if (self.config_errors_window == null) { try ConfigErrorsWindow.create(self); assert(self.config_errors_window != null); diff --git a/src/apprt/gtk/ConfigErrorsWindow.zig b/src/apprt/gtk/ConfigErrorsWindow.zig index 44fa83363..3f8ba3205 100644 --- a/src/apprt/gtk/ConfigErrorsWindow.zig +++ b/src/apprt/gtk/ConfigErrorsWindow.zig @@ -28,7 +28,7 @@ pub fn create(app: *App) !void { } pub fn update(self: *ConfigErrors) void { - if (self.app.config._errors.empty()) { + if (self.app.config._diagnostics.empty()) { c.gtk_window_destroy(@ptrCast(self.window)); return; } @@ -130,8 +130,21 @@ const PrimaryView = struct { const buf = c.gtk_text_buffer_new(null); errdefer c.g_object_unref(buf); - for (config._errors.list.items) |err| { - c.gtk_text_buffer_insert_at_cursor(buf, err.message, @intCast(err.message.len)); + var msg_buf: [4096]u8 = undefined; + var fbs = std.io.fixedBufferStream(&msg_buf); + + for (config._diagnostics.items()) |diag| { + fbs.reset(); + diag.write(fbs.writer()) catch |err| { + log.warn( + "error writing diagnostic to buffer err={}", + .{err}, + ); + continue; + }; + + const msg = fbs.getWritten(); + c.gtk_text_buffer_insert_at_cursor(buf, msg.ptr, @intCast(msg.len)); c.gtk_text_buffer_insert_at_cursor(buf, "\n", -1); } diff --git a/src/cli/diagnostics.zig b/src/cli/diagnostics.zig index c808c104a..1e56379c8 100644 --- a/src/cli/diagnostics.zig +++ b/src/cli/diagnostics.zig @@ -118,7 +118,7 @@ pub const DiagnosticList = struct { return self.list.items.len == 0; } - pub fn items(self: *DiagnosticList) []Diagnostic { + pub fn items(self: *const DiagnosticList) []const Diagnostic { return self.list.items; } };