feature. See also
. The project being documented here (as the example) is the Zig library itself.
phc_encoding.serializeTo
fn serializeTo(params: anytype, out: *std.Io.Writer) !void
File
Code
fn serializeTo(params: anytype, out: *std.Io.Writer) !void {
const HashResult = @TypeOf(params);
if (@hasField(HashResult, version_param_name)) {
@compileError("Field name '" ++ version_param_name ++ "'' is reserved for the algorithm version");
}
try out.writeAll(fields_delimiter);
try out.writeAll(params.alg_id);
if (@hasField(HashResult, "alg_version")) {
if (@typeInfo(@TypeOf(params.alg_version)) == .optional) {
if (params.alg_version) |alg_version| {
try out.print(
"{s}{s}{s}{}",
.{ fields_delimiter, version_param_name, kv_delimiter, alg_version },
);
}
} else {
try out.print(
"{s}{s}{s}{}",
.{ fields_delimiter, version_param_name, kv_delimiter, params.alg_version },
);
}
}
var has_params = false;
const info = @typeInfo(HashResult).@"struct";
inline for (info.field_names, info.field_types) |p_name, p_type| {
if (comptime !(mem.eql(u8, p_name, "alg_id") or
mem.eql(u8, p_name, "alg_version") or
mem.eql(u8, p_name, "hash") or
mem.eql(u8, p_name, "salt")))
{
const value = @field(params, p_name);
try out.writeAll(if (has_params) params_delimiter else fields_delimiter);
if (@typeInfo(p_type) == .@"struct") {
var buf: [@TypeOf(value).max_encoded_length]u8 = undefined;
try out.print("{s}{s}{s}", .{ p_name, kv_delimiter, try value.toB64(&buf) });
} else {
try out.print(
if (@typeInfo(@TypeOf(value)) == .pointer) "{s}{s}{s}" else "{s}{s}{}",
.{ p_name, kv_delimiter, value },
);
}
has_params = true;
}
}
var has_salt = false;
if (@hasField(HashResult, "salt")) {
var buf: [@TypeOf(params.salt).max_encoded_length]u8 = undefined;
try out.print("{s}{s}", .{ fields_delimiter, try params.salt.toB64(&buf) });
has_salt = true;
}
if (@hasField(HashResult, "hash")) {
var buf: [@TypeOf(params.hash).max_encoded_length]u8 = undefined;
if (!has_salt) try out.writeAll(fields_delimiter);
try out.print("{s}{s}", .{ fields_delimiter, try params.hash.toB64(&buf) });
}
}