diff --git a/codegen/src/main.zig b/codegen/src/main.zig index 1556204..36f12af 100644 --- a/codegen/src/main.zig +++ b/codegen/src/main.zig @@ -716,7 +716,7 @@ fn generateTypeFor(shape_id: []const u8, writer: anytype, state: GenerationState // The serializer will have to deal with the idea we might be an array return try generateTypeFor(shape.set.member_target, writer, state, true); }, - .timestamp => |s| try generateSimpleTypeFor(s, "i64", writer), + .timestamp => |s| try generateSimpleTypeFor(s, "f128", writer), .blob => |s| try generateSimpleTypeFor(s, "[]const u8", writer), .boolean => |s| try generateSimpleTypeFor(s, "bool", writer), .double => |s| try generateSimpleTypeFor(s, "f64", writer), diff --git a/src/aws.zig b/src/aws.zig index 25745a7..fe05cc8 100644 --- a/src/aws.zig +++ b/src/aws.zig @@ -783,6 +783,12 @@ fn parseInt(comptime T: type, val: []const u8) !T { return e; }; } + if (T == f128) { + return @as(f128, date.parseEnglishToTimestamp(val)) catch |e| { + log.err("Error coercing date string '{s}' to timestamp value", .{val}); + return e; + }; + } log.err("Error parsing string '{s}' to integer", .{val}); return rc; } diff --git a/src/xml_shaper.zig b/src/xml_shaper.zig index e4febc6..bf33bab 100644 --- a/src/xml_shaper.zig +++ b/src/xml_shaper.zig @@ -105,6 +105,12 @@ fn parseInternal(comptime T: type, element: *xml.Element, options: ParseOptions) }, .Float, .ComptimeFloat => { return std.fmt.parseFloat(T, element.children.items[0].CharData) catch |e| { + if (element.children.items[0].CharData[element.children.items[0].CharData.len - 1] == 'Z') { + // We have an iso8601 in an integer field (we think) + // Try to coerce this into our type + const timestamp = try date.parseIso8601ToTimestamp(element.children.items[0].CharData); + return @floatFromInt(timestamp); + } if (log_parse_traces) { std.log.err( "Could not parse '{s}' as float in element '{s}': {any}",