From 3fd1ca3b254f6aeaa8ab675a70da55007f40c2ad Mon Sep 17 00:00:00 2001 From: bing Date: Tue, 4 Aug 2026 21:29:28 +0800 Subject: [PATCH] feat(js): add exact u32 conversion --- src/js/number.zig | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/js/number.zig b/src/js/number.zig index 9dc04e0..79275ec 100644 --- a/src/js/number.zig +++ b/src/js/number.zig @@ -44,6 +44,23 @@ pub const Number = struct { return self.val.getValueUint32(); } + /// Attempts to convert the JavaScript number to a `u32` without coercion. + /// + /// Returns `error.InvalidUnsignedInteger` if the number is negative, + /// fractional, non-finite, or greater than `std.math.maxInt(u32)`. + pub fn toU32Exact(self: Number) !u32 { + const max: f64 = @floatFromInt(std.math.maxInt(u32)); + const value = try self.toF64(); + if (!std.math.isFinite(value) or + value < 0 or + value > max or + @trunc(value) != value) + { + return error.InvalidUnsignedInteger; + } + return @intFromFloat(value); + } + /// Attempts to convert the JavaScript number to a Zig `f64`. /// /// This conversion is generally lossless for most JS numbers, which are typically `f64`.