From 37021a266be7abe9e051c65bedc0f91f36f96540 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Sat, 22 Mar 2025 21:42:24 +0100 Subject: [PATCH] feat: add support for encoder members --- src/cbor.zig | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/cbor.zig b/src/cbor.zig index 2d791c8..e3cdb6f 100644 --- a/src/cbor.zig +++ b/src/cbor.zig @@ -215,6 +215,9 @@ pub fn writeValue(writer: anytype, value: anytype) @TypeOf(writer).Error!void { .error_union => return if (value) |v| writeValue(writer, v) else |err| writeValue(writer, err), .error_set => return writeErrorset(writer, value), .@"union" => |info| { + if (std.meta.hasFn(T, "cborEncode")) { + return value.cborEncode(writer); + } if (info.tag_type) |TagType| { comptime var v = void; inline for (info.fields) |u_field| { @@ -231,6 +234,9 @@ pub fn writeValue(writer: anytype, value: anytype) @TypeOf(writer).Error!void { } }, .@"struct" => |info| { + if (std.meta.hasFn(T, "cborEncode")) { + return value.cborEncode(writer); + } if (info.is_tuple) { if (info.fields.len == 0) return writeNull(writer); try writeArrayHeader(writer, info.fields.len); @@ -277,6 +283,12 @@ pub fn writeValue(writer: anytype, value: anytype) @TypeOf(writer).Error!void { 64 => try writeF64(writer, value), else => @compileError("cannot write type '" ++ @typeName(T) ++ "' to cbor stream"), }, + .@"enum" => { + if (std.meta.hasFn(T, "cborEncode")) { + return value.cborEncode(writer); + } + return writeString(writer, @tagName(value)); + }, else => @compileError("cannot write type '" ++ @typeName(T) ++ "' to cbor stream"), } }