Zig deep clone and merge for config maps

Zig
const std = @import("std");

const Config = struct {
    name: []const u8,
    values: std.StringHashMap(u32),
};

fn deepClone(a: std.mem.Allocator, c: Config) !Config {
    var out = Config{ .name = try a.dupe(u8, c.name), .values = std.StringHashMap(u32).init(a) };
    var it = c.values.iterator();
    while (it.next()) |e| try out.values.put(try a.dupe(u8, e.key_ptr.*), e.value_ptr.*);
    return out;
}

fn deepMerge(a: std.mem.Allocator, base: Config, over: Config) !Config {
    var out = try deepClone(a, base);
    if (over.name.len > 0) out.name = try a.dupe(u8, over.name);
    var it = over.values.iterator();
    while (it.next()) |e| try out.values.put(try a.dupe(u8, e.key_ptr.*), e.value_ptr.*);
    return out;
}