refactor: remove duplicate keybind command loading code
This commit is contained in:
parent
61198412f8
commit
0de7086e82
1 changed files with 24 additions and 64 deletions
|
@ -341,74 +341,34 @@ 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 {
|
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| {
|
bindings: for (bindings) |entry| {
|
||||||
var state: enum { key_event, command, args } = .key_event;
|
const token = entry[0];
|
||||||
var key_events: ?[]KeyEvent = null;
|
if (token != .string) {
|
||||||
var command_: ?[]const u8 = null;
|
const logger = log.logger("keybind");
|
||||||
var args = std.ArrayListUnmanaged(std.json.Value){};
|
logger.print_err("keybind.load", "ERROR: invalid binding key token {any}", .{token});
|
||||||
defer {
|
logger.deinit();
|
||||||
if (key_events) |p| allocator.free(p);
|
continue :bindings;
|
||||||
if (command_) |p| allocator.free(p);
|
|
||||||
args.deinit(allocator);
|
|
||||||
}
|
}
|
||||||
for (entry) |token| {
|
|
||||||
switch (state) {
|
const key_events = switch (self.syntax) {
|
||||||
.key_event => {
|
.flow => parse_flow.parse_key_events(allocator, event, token.string) catch |e| {
|
||||||
if (token != .string) {
|
const logger = log.logger("keybind");
|
||||||
const logger = log.logger("keybind");
|
logger.print_err("keybind.load", "ERROR: {s} {s}", .{ @errorName(e), parse_flow.parse_error_message });
|
||||||
logger.print_err("keybind.load", "ERROR: invalid binding key token {any}", .{token});
|
logger.deinit();
|
||||||
logger.deinit();
|
break;
|
||||||
continue :bindings;
|
},
|
||||||
}
|
.vim => parse_vim.parse_key_events(allocator, event, token.string) catch |e| {
|
||||||
key_events = switch (self.syntax) {
|
const logger = log.logger("keybind");
|
||||||
.flow => parse_flow.parse_key_events(allocator, event, token.string) catch |e| {
|
logger.print_err("keybind.load.vim", "ERROR: {s} {s}", .{ @errorName(e), parse_vim.parse_error_message });
|
||||||
const logger = log.logger("keybind");
|
logger.deinit();
|
||||||
logger.print_err("keybind.load", "ERROR: {s} {s}", .{ @errorName(e), parse_flow.parse_error_message });
|
break;
|
||||||
logger.deinit();
|
},
|
||||||
break;
|
};
|
||||||
},
|
errdefer allocator.free(key_events);
|
||||||
.vim => parse_vim.parse_key_events(allocator, event, token.string) catch |e| {
|
|
||||||
const logger = log.logger("keybind");
|
|
||||||
logger.print_err("keybind.load.vim", "ERROR: {s} {s}", .{ @errorName(e), parse_vim.parse_error_message });
|
|
||||||
logger.deinit();
|
|
||||||
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);
|
|
||||||
|
|
||||||
try dest.append(allocator, .{
|
try dest.append(allocator, .{
|
||||||
.key_events = key_events.?,
|
.key_events = key_events,
|
||||||
.command = .{
|
.command = try Command.load(allocator, entry[1..]),
|
||||||
.command = command_.?,
|
|
||||||
.args = try args_cbor.toOwnedSlice(allocator),
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
key_events = null;
|
|
||||||
command_ = null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue