feat: add support for encoder members

This commit is contained in:
CJ van den Berg 2025-03-22 21:42:24 +01:00
parent a6174af2ec
commit 37021a266b
Signed by: neurocyte
GPG key ID: 8EB1E1BB660E3FB9

View file

@ -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_union => return if (value) |v| writeValue(writer, v) else |err| writeValue(writer, err),
.error_set => return writeErrorset(writer, value), .error_set => return writeErrorset(writer, value),
.@"union" => |info| { .@"union" => |info| {
if (std.meta.hasFn(T, "cborEncode")) {
return value.cborEncode(writer);
}
if (info.tag_type) |TagType| { if (info.tag_type) |TagType| {
comptime var v = void; comptime var v = void;
inline for (info.fields) |u_field| { inline for (info.fields) |u_field| {
@ -231,6 +234,9 @@ pub fn writeValue(writer: anytype, value: anytype) @TypeOf(writer).Error!void {
} }
}, },
.@"struct" => |info| { .@"struct" => |info| {
if (std.meta.hasFn(T, "cborEncode")) {
return value.cborEncode(writer);
}
if (info.is_tuple) { if (info.is_tuple) {
if (info.fields.len == 0) return writeNull(writer); if (info.fields.len == 0) return writeNull(writer);
try writeArrayHeader(writer, info.fields.len); 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), 64 => try writeF64(writer, value),
else => @compileError("cannot write type '" ++ @typeName(T) ++ "' to cbor stream"), 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"), else => @compileError("cannot write type '" ++ @typeName(T) ++ "' to cbor stream"),
} }
} }