fix json serialization for null/empty maps
This commit is contained in:
		
							parent
							
								
									8c68dd6902
								
							
						
					
					
						commit
						7e111ce9a0
					
				
					 2 changed files with 70 additions and 2 deletions
				
			
		| 
						 | 
					@ -4,7 +4,7 @@ const std = @import("std");
 | 
				
			||||||
pub fn serializeMap(map: anytype, key: []const u8, options: anytype, out_stream: anytype) !bool {
 | 
					pub fn serializeMap(map: anytype, key: []const u8, options: anytype, out_stream: anytype) !bool {
 | 
				
			||||||
    if (@typeInfo(@TypeOf(map)) == .Optional) {
 | 
					    if (@typeInfo(@TypeOf(map)) == .Optional) {
 | 
				
			||||||
        if (map == null)
 | 
					        if (map == null)
 | 
				
			||||||
            return true
 | 
					            return false
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
            return serializeMapInternal(map.?, key, options, out_stream);
 | 
					            return serializeMapInternal(map.?, key, options, out_stream);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -12,7 +12,23 @@ pub fn serializeMap(map: anytype, key: []const u8, options: anytype, out_stream:
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn serializeMapInternal(map: anytype, key: []const u8, options: anytype, out_stream: anytype) !bool {
 | 
					fn serializeMapInternal(map: anytype, key: []const u8, options: anytype, out_stream: anytype) !bool {
 | 
				
			||||||
    if (map.len == 0) return true;
 | 
					    if (map.len == 0) {
 | 
				
			||||||
 | 
					        var child_options = options;
 | 
				
			||||||
 | 
					        if (child_options.whitespace) |*child_ws|
 | 
				
			||||||
 | 
					            child_ws.indent_level += 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try out_stream.writeByte('"');
 | 
				
			||||||
 | 
					        try out_stream.writeAll(key);
 | 
				
			||||||
 | 
					        _ = try out_stream.write("\":");
 | 
				
			||||||
 | 
					        if (options.whitespace) |ws| {
 | 
				
			||||||
 | 
					            if (ws.separator) {
 | 
				
			||||||
 | 
					                try out_stream.writeByte(' ');
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        try out_stream.writeByte('{');
 | 
				
			||||||
 | 
					        try out_stream.writeByte('}');
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    // TODO: Map might be [][]struct{key, value} rather than []struct{key, value}
 | 
					    // TODO: Map might be [][]struct{key, value} rather than []struct{key, value}
 | 
				
			||||||
    var child_options = options;
 | 
					    var child_options = options;
 | 
				
			||||||
    if (child_options.whitespace) |*child_ws|
 | 
					    if (child_options.whitespace) |*child_ws|
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										52
									
								
								src/aws.zig
									
										
									
									
									
								
							
							
						
						
									
										52
									
								
								src/aws.zig
									
										
									
									
									
								
							| 
						 | 
					@ -1306,6 +1306,58 @@ test "custom serialization for map objects" {
 | 
				
			||||||
    , buffer.items);
 | 
					    , buffer.items);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test "proper serialization for kms" {
 | 
				
			||||||
 | 
					    // Github issue #8
 | 
				
			||||||
 | 
					    // https://github.com/elerch/aws-sdk-for-zig/issues/8
 | 
				
			||||||
 | 
					    const allocator = std.testing.allocator;
 | 
				
			||||||
 | 
					    var buffer = std.ArrayList(u8).init(allocator);
 | 
				
			||||||
 | 
					    defer buffer.deinit();
 | 
				
			||||||
 | 
					    const req = services.kms.encrypt.Request{
 | 
				
			||||||
 | 
					        .encryption_algorithm = "SYMMETRIC_DEFAULT",
 | 
				
			||||||
 | 
					        // Since encryption_context is not null, we expect "{}" to be the value
 | 
				
			||||||
 | 
					        // here, not "[]", because this is our special AWS map pattern
 | 
				
			||||||
 | 
					        .encryption_context = &.{},
 | 
				
			||||||
 | 
					        .key_id = "42",
 | 
				
			||||||
 | 
					        .plaintext = "foo",
 | 
				
			||||||
 | 
					        .dry_run = false,
 | 
				
			||||||
 | 
					        .grant_tokens = &[_][]const u8{},
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    try json.stringify(req, .{ .whitespace = .{} }, buffer.writer());
 | 
				
			||||||
 | 
					    try std.testing.expectEqualStrings(
 | 
				
			||||||
 | 
					        \\{
 | 
				
			||||||
 | 
					        \\    "KeyId": "42",
 | 
				
			||||||
 | 
					        \\    "Plaintext": "foo",
 | 
				
			||||||
 | 
					        \\    "EncryptionContext": {},
 | 
				
			||||||
 | 
					        \\    "GrantTokens": [],
 | 
				
			||||||
 | 
					        \\    "EncryptionAlgorithm": "SYMMETRIC_DEFAULT",
 | 
				
			||||||
 | 
					        \\    "DryRun": false
 | 
				
			||||||
 | 
					        \\}
 | 
				
			||||||
 | 
					    , buffer.items);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var buffer_null = std.ArrayList(u8).init(allocator);
 | 
				
			||||||
 | 
					    defer buffer_null.deinit();
 | 
				
			||||||
 | 
					    const req_null = services.kms.encrypt.Request{
 | 
				
			||||||
 | 
					        .encryption_algorithm = "SYMMETRIC_DEFAULT",
 | 
				
			||||||
 | 
					        // Since encryption_context here *IS* null, we expect simply "null" to be the value
 | 
				
			||||||
 | 
					        .encryption_context = null,
 | 
				
			||||||
 | 
					        .key_id = "42",
 | 
				
			||||||
 | 
					        .plaintext = "foo",
 | 
				
			||||||
 | 
					        .dry_run = false,
 | 
				
			||||||
 | 
					        .grant_tokens = &[_][]const u8{},
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    try json.stringify(req_null, .{ .whitespace = .{} }, buffer_null.writer());
 | 
				
			||||||
 | 
					    try std.testing.expectEqualStrings(
 | 
				
			||||||
 | 
					        \\{
 | 
				
			||||||
 | 
					        \\    "KeyId": "42",
 | 
				
			||||||
 | 
					        \\    "Plaintext": "foo",
 | 
				
			||||||
 | 
					        \\    "EncryptionContext": null,
 | 
				
			||||||
 | 
					        \\    "GrantTokens": [],
 | 
				
			||||||
 | 
					        \\    "EncryptionAlgorithm": "SYMMETRIC_DEFAULT",
 | 
				
			||||||
 | 
					        \\    "DryRun": false
 | 
				
			||||||
 | 
					        \\}
 | 
				
			||||||
 | 
					    , buffer_null.items);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
test "REST Json v1 builds proper queries" {
 | 
					test "REST Json v1 builds proper queries" {
 | 
				
			||||||
    const allocator = std.testing.allocator;
 | 
					    const allocator = std.testing.allocator;
 | 
				
			||||||
    const svs = Services(.{.lambda}){};
 | 
					    const svs = Services(.{.lambda}){};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue