| ... | ... | @@ -1422,23 +1422,37 @@ fn parseInternal( |
| 1422 | 1422 | }; |
| 1423 | 1423 | }, |
| 1424 | 1424 | .Float, .ComptimeFloat => { |
| 1425 | | const numberToken = switch (token) { |
| 1426 | | .Number => |n| n, |
| 1425 | switch (token) { |
| 1426 | .Number => |numberToken| return try std.fmt.parseFloat(T, numberToken.slice(tokens.slice, tokens.i - 1)), |
| 1427 | .String => |stringToken| return try std.fmt.parseFloat(T, stringToken.slice(tokens.slice, tokens.i - 1)), |
| 1427 | 1428 | else => return error.UnexpectedToken, |
| 1428 | | }; |
| 1429 | | return try std.fmt.parseFloat(T, numberToken.slice(tokens.slice, tokens.i - 1)); |
| 1429 | } |
| 1430 | 1430 | }, |
| 1431 | 1431 | .Int, .ComptimeInt => { |
| 1432 | | const numberToken = switch (token) { |
| 1433 | | .Number => |n| n, |
| 1432 | switch (token) { |
| 1433 | .Number => |numberToken| { |
| 1434 | if (numberToken.is_integer) |
| 1435 | return try std.fmt.parseInt(T, numberToken.slice(tokens.slice, tokens.i - 1), 10); |
| 1436 | const float = try std.fmt.parseFloat(f128, numberToken.slice(tokens.slice, tokens.i - 1)); |
| 1437 | if (@round(float) != float) return error.InvalidNumber; |
| 1438 | if (float > std.math.maxInt(T) or float < std.math.minInt(T)) return error.Overflow; |
| 1439 | return @floatToInt(T, float); |
| 1440 | }, |
| 1441 | .String => |stringToken| { |
| 1442 | return std.fmt.parseInt(T, stringToken.slice(tokens.slice, tokens.i - 1), 10) catch |err| { |
| 1443 | switch (err) { |
| 1444 | error.Overflow => return err, |
| 1445 | error.InvalidCharacter => { |
| 1446 | const float = try std.fmt.parseFloat(f128, stringToken.slice(tokens.slice, tokens.i - 1)); |
| 1447 | if (@round(float) != float) return error.InvalidNumber; |
| 1448 | if (float > std.math.maxInt(T) or float < std.math.minInt(T)) return error.Overflow; |
| 1449 | return @floatToInt(T, float); |
| 1450 | }, |
| 1451 | } |
| 1452 | }; |
| 1453 | }, |
| 1434 | 1454 | else => return error.UnexpectedToken, |
| 1435 | | }; |
| 1436 | | if (numberToken.is_integer) |
| 1437 | | return try std.fmt.parseInt(T, numberToken.slice(tokens.slice, tokens.i - 1), 10); |
| 1438 | | const float = try std.fmt.parseFloat(f128, numberToken.slice(tokens.slice, tokens.i - 1)); |
| 1439 | | if (@round(float) != float) return error.InvalidNumber; |
| 1440 | | if (float > std.math.maxInt(T) or float < std.math.minInt(T)) return error.Overflow; |
| 1441 | | return @floatToInt(T, float); |
| 1455 | } |
| 1442 | 1456 | }, |
| 1443 | 1457 | .Optional => |optionalInfo| { |
| 1444 | 1458 | if (token == .Null) { |