From ac122a513bb048b4842c2707e2a295fd9611ad80 Mon Sep 17 00:00:00 2001 From: "Lucas F." Date: Wed, 14 Jan 2026 14:22:39 -0300 Subject: [PATCH] update: toValue method --- src/renderer.zig | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/renderer.zig b/src/renderer.zig index 92f6a99..97d7d83 100644 --- a/src/renderer.zig +++ b/src/renderer.zig @@ -318,7 +318,38 @@ pub const Renderer = struct { return null; } - fn valueToString(self: *const Renderer, alloc: Allocator, buf: *ArrayListUnmanaged(u8), value: Value) !void { + fn toValue(self: *Context, value: anytype) RenderError!Value { + const T = @TypeOf(value); + return switch (@typeInfo(T)) { + .bool => Value{ .bool = value }, + .int, .comptime_int => Value{ .int = @intCast(value) }, + .float, .comptime_float => Value{ .float = @floatCast(value) }, + .pointer => Value{ .string = try std.fmt.allocPrint(self.allocator(), "{s}", .{value}) }, + .@"struct" => blk: { + var dict = std.StringHashMapUnmanaged(Value){}; + inline for (std.meta.fields(T)) |field| { + const field_val = @field(value, field.name); + const converted = try self.toValue(field_val); + try dict.put(self.allocator(), field.name, converted); + } + break :blk Value{ .dict = dict }; + }, + .array => blk: { + var list = try self.allocator().alloc(Value, value.len); + for (value, 0..) |item, i| { + list[i] = try self.toValue(item); + } + break :blk Value{ .list = list }; + }, + .optional => if (value) |v| try self.toValue(v) else .null, + .null => .null, + // CASO ESPECIAL: o valor já é um Value (ex: lista de Value) + .@"union" => if (T == Value) value else @compileError("Unsupported union type: " ++ @typeName(T)), + else => @compileError("Unsupported type: " ++ @typeName(T)), + }; + } + + fn valueToString(self: *const Renderer, alloc: Allocator, buf: *ArrayListUnmanaged(u8), value: Value) RenderError!void { _ = self; var w = buf.writer(alloc); switch (value) {