From 63e0b427f896727cf0740d43d846df9dd2a01f64 Mon Sep 17 00:00:00 2001 From: urso Date: Mon, 26 Aug 2024 14:19:55 +0200 Subject: [PATCH 1/2] node: safeCastNode accepts optional pointer --- src/pgzx/node.zig | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/pgzx/node.zig b/src/pgzx/node.zig index 4734669..94c0691 100644 --- a/src/pgzx/node.zig +++ b/src/pgzx/node.zig @@ -1,3 +1,5 @@ +const std = @import("std"); + const pg = @import("pgzx_pgsys"); const generated = @import("gen_node_tags"); @@ -48,6 +50,12 @@ pub inline fn castNode(comptime T: type, node: anytype) *T { } pub inline fn safeCastNode(comptime T: type, node: anytype) ?*T { + if (@typeInfo(@TypeOf(node)) == .Optional) { + if (node == null) { + return null; + } + } + if (tag(node) != generated.findTag(T)) { return null; } @@ -76,8 +84,6 @@ inline fn checkIsPotentialNodePtr(node: anytype) void { } pub const TestSuite_Node = struct { - const std = @import("std"); - pub fn testMakeAndTag() !void { const node = make(pg.FdwRoutine); try std.testing.expectEqual(tag(node), .FdwRoutine); From 728ef8d03a19f376a9edccb2fe0a24b3a41fba85 Mon Sep 17 00:00:00 2001 From: urso Date: Mon, 26 Aug 2024 14:20:30 +0200 Subject: [PATCH 2/2] node: intVal, floatVal, strVal, boolVal --- src/pgzx/node.zig | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/pgzx/node.zig b/src/pgzx/node.zig index 94c0691..f9bcb65 100644 --- a/src/pgzx/node.zig +++ b/src/pgzx/node.zig @@ -10,6 +10,34 @@ pub const Tag = generated.Tag; pub const List = collections.list.PointerListOf(pg.Node); +pub inline fn intVal(node: anytype) c_int { + const n = safeCastNode(pg.Integer, node) orelse { + @panic("Expected Integer node"); + }; + return n.ival; +} + +pub inline fn floatVal(node: anytype) f64 { + const n = safeCastNode(pg.Float, node) orelse { + @panic("Expected Float node"); + }; + return std.fmt.parseFloat(f64, std.mem.span(n.fval)); +} + +pub inline fn strVal(node: anytype) [:0]const u8 { + const n = safeCastNode(pg.String, node) orelse { + @panic("Expected String node"); + }; + return std.mem.span(n.sval); +} + +pub inline fn boolVal(node: anytype) bool { + const n = safeCastNode(pg.Boolean, node) orelse { + @panic("Expected Boolean node"); + }; + return n.boolval; +} + pub inline fn make(comptime T: type) *T { const node: *pg.Node = @ptrCast(@alignCast(pg.palloc0fast(@sizeOf(T)))); node.*.type = @intFromEnum(mustFindTag(T));