refactor: remove duplicate keybind command loading code

This commit is contained in:
CJ van den Berg 2024-12-01 21:28:05 +01:00
parent 61198412f8
commit 0de7086e82
Signed by: neurocyte
GPG key ID: 8EB1E1BB660E3FB9

View file

@ -341,25 +341,15 @@ const BindingSet = struct {
fn load_event(self: *BindingSet, allocator: std.mem.Allocator, dest: *std.ArrayListUnmanaged(Binding), event: input.Event, bindings: []const []const std.json.Value) (parse_flow.ParseError || parse_vim.ParseError)!void {
bindings: for (bindings) |entry| {
var state: enum { key_event, command, args } = .key_event;
var key_events: ?[]KeyEvent = null;
var command_: ?[]const u8 = null;
var args = std.ArrayListUnmanaged(std.json.Value){};
defer {
if (key_events) |p| allocator.free(p);
if (command_) |p| allocator.free(p);
args.deinit(allocator);
}
for (entry) |token| {
switch (state) {
.key_event => {
const token = entry[0];
if (token != .string) {
const logger = log.logger("keybind");
logger.print_err("keybind.load", "ERROR: invalid binding key token {any}", .{token});
logger.deinit();
continue :bindings;
}
key_events = switch (self.syntax) {
const key_events = switch (self.syntax) {
.flow => parse_flow.parse_key_events(allocator, event, token.string) catch |e| {
const logger = log.logger("keybind");
logger.print_err("keybind.load", "ERROR: {s} {s}", .{ @errorName(e), parse_flow.parse_error_message });
@ -373,42 +363,12 @@ const BindingSet = struct {
break;
},
};
state = .command;
},
.command => {
if (token != .string) {
const logger = log.logger("keybind");
logger.print_err("keybind.load", "ERROR: invalid binding command token {any}", .{token});
logger.deinit();
continue :bindings;
}
command_ = try allocator.dupe(u8, token.string);
state = .args;
},
.args => {
try args.append(allocator, token);
},
}
}
if (state != .args) {
if (builtin.is_test) @panic("invalid state");
continue;
}
var args_cbor = std.ArrayListUnmanaged(u8){};
defer args_cbor.deinit(allocator);
const writer = args_cbor.writer(allocator);
try cbor.writeArrayHeader(writer, args.items.len);
for (args.items) |arg| try cbor.writeJsonValue(writer, arg);
errdefer allocator.free(key_events);
try dest.append(allocator, .{
.key_events = key_events.?,
.command = .{
.command = command_.?,
.args = try args_cbor.toOwnedSlice(allocator),
},
.key_events = key_events,
.command = try Command.load(allocator, entry[1..]),
});
key_events = null;
command_ = null;
}
}