From 052aeee4150eba68051311982d883688670f6ca4 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Thu, 19 Feb 2026 22:06:44 -0800 Subject: [PATCH] std.zon.Serializer: slightly more helpful message when a type is unserializable --- lib/std/zon/Serializer.zig | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/std/zon/Serializer.zig b/lib/std/zon/Serializer.zig index c30c0e09d8051c0eafab2e8e4ba2a85d46aa1db2..9839129e316906fd20110f47ae40c28d193f8ec4 100644 --- a/lib/std/zon/Serializer.zig +++ b/lib/std/zon/Serializer.zig @@ -122,7 +122,7 @@ pub fn valueMaxDepth(self: *Serializer, val: anytype, options: ValueOptions, dep /// Serialize a value, similar to `serializeArbitraryDepth`. pub fn valueArbitraryDepth(self: *Serializer, val: anytype, options: ValueOptions) Error!void { - comptime assert(canSerializeType(@TypeOf(val))); + comptime assertCanSerializeType(@TypeOf(val)); switch (@typeInfo(@TypeOf(val))) { .int, .comptime_int => if (options.emit_codepoint_literals.emitAsCodepoint(val)) |c| { self.codePoint(c) catch |err| switch (err) { @@ -321,7 +321,7 @@ pub fn tupleArbitraryDepth( } fn tupleImpl(self: *Serializer, val: anytype, options: ValueOptions) Error!void { - comptime assert(canSerializeType(@TypeOf(val))); + comptime assertCanSerializeType(@TypeOf(val)); switch (@typeInfo(@TypeOf(val))) { .@"struct" => { var container = try self.beginTuple(.{ .whitespace_style = .{ .fields = val.len } }); @@ -814,6 +814,10 @@ test checkValueDepth { try expectValueDepthEquals(3, @as([]const []const u8, &.{&.{ 1, 2, 3 }})); } +inline fn assertCanSerializeType(T: type) void { + if (!canSerializeType(T)) @compileError("cannot serialize: " ++ @typeName(T)); +} + inline fn canSerializeType(T: type) bool { comptime return canSerializeTypeInner(T, &.{}, false); } -- 2.54.0