input: add Binding.Action.format to convert action to string

This commit is contained in:
Mitchell Hashimoto
2023-11-03 15:57:14 -07:00
parent c9110b331d
commit cb4bb8aaf6
2 changed files with 36 additions and 9 deletions

View File

@@ -303,6 +303,41 @@ pub const Action = union(enum) {
return Error.InvalidAction;
}
/// Implements the formatter for the fmt package. This encodes the
/// action back into the format used by parse.
pub fn format(
self: Action,
comptime layout: []const u8,
opts: std.fmt.FormatOptions,
writer: anytype,
) !void {
_ = layout;
_ = opts;
switch (self) {
inline else => |value| {
const Value = @TypeOf(value);
const value_info = @typeInfo(Value);
// All actions start with the tag.
try writer.print("{s}", .{@tagName(self)});
// Write the value depending on the type
switch (Value) {
void => {},
[]const u8 => try writer.print(":{s}", .{value}),
else => switch (value_info) {
.Enum => try writer.print(":{s}", .{@tagName(value)}),
.Float => try writer.print(":{d}", .{value}),
.Int => try writer.print(":{d}", .{value}),
.Struct => try writer.print("{} (not configurable)", .{value}),
else => @compileError("unhandled type: " ++ @typeName(Value)),
},
}
},
}
}
/// Returns a hash code that can be used to uniquely identify this
/// action.
pub fn hash(self: Action) u64 {