Add coding symbol rail

This commit is contained in:
slhx agent
2026-06-21 02:21:32 +02:00
parent cfbacb3cd2
commit f793ecd726
6 changed files with 324 additions and 2 deletions
+46
View File
@@ -30,9 +30,23 @@ fn commandResponse(allocator: std.mem.Allocator, session: *session_mod.Session,
if (std.mem.eql(u8, command, "move_right")) return dispatchAndRespond(allocator, session, .move_right);
if (std.mem.eql(u8, command, "delete_backward")) return dispatchAndRespond(allocator, session, .delete_backward);
if (std.mem.startsWith(u8, command, "insert ")) return dispatchAndRespond(allocator, session, .{ .insert = command[7..] });
if (std.mem.startsWith(u8, command, "pair ")) {
const pair = pairByName(command[5..]) orelse return allocator.dupe(u8, "err unknown pair\n");
return dispatchAndRespond(allocator, session, .{ .insert_pair = pair });
}
return allocator.dupe(u8, "err unknown command\n");
}
fn pairByName(name: []const u8) ?session_mod.Pair {
if (std.mem.eql(u8, name, "parens")) return .{ .open = "(", .close = ")" };
if (std.mem.eql(u8, name, "brackets")) return .{ .open = "[", .close = "]" };
if (std.mem.eql(u8, name, "braces")) return .{ .open = "{", .close = "}" };
if (std.mem.eql(u8, name, "double_quote")) return .{ .open = "\"", .close = "\"" };
if (std.mem.eql(u8, name, "single_quote")) return .{ .open = "'", .close = "'" };
if (std.mem.eql(u8, name, "backtick")) return .{ .open = "`", .close = "`" };
return null;
}
fn dispatchAndRespond(allocator: std.mem.Allocator, session: *session_mod.Session, command: session_mod.Command) ![]u8 {
session.dispatch(command) catch |err| switch (err) {
error.InvalidUtf8Insertion => return allocator.dupe(u8, "err invalid utf8\n"),
@@ -117,3 +131,35 @@ test "adversarial: protocol reports no buffer and invalid utf8 without corruptin
const after = try session.snapshot();
try std.testing.expectEqualStrings(before.bytes, after.bytes);
}
test "regular: protocol pair commands insert delimiters with cursor between them" {
var session = session_mod.Session.init(std.testing.allocator);
defer session.deinit();
var response = try handleLine(std.testing.allocator, &session, "open call\n");
std.testing.allocator.free(response);
response = try handleLine(std.testing.allocator, &session, "command move_right\n");
std.testing.allocator.free(response);
response = try handleLine(std.testing.allocator, &session, "command move_right\n");
std.testing.allocator.free(response);
response = try handleLine(std.testing.allocator, &session, "command move_right\n");
std.testing.allocator.free(response);
response = try handleLine(std.testing.allocator, &session, "command move_right\n");
std.testing.allocator.free(response);
response = try handleLine(std.testing.allocator, &session, "command pair parens\n");
defer std.testing.allocator.free(response);
try std.testing.expectEqualStrings("ok state cursor_byte=5 cursor_cell=5 bytes_len=6\n", response);
try std.testing.expectEqualStrings("call()", (try session.snapshot()).bytes);
}
test "adversarial: protocol rejects unknown pair names" {
var session = session_mod.Session.init(std.testing.allocator);
defer session.deinit();
try session.openFixture("abc");
const response = try handleLine(std.testing.allocator, &session, "command pair snippet_everything\n");
defer std.testing.allocator.free(response);
try std.testing.expectEqualStrings("err unknown pair\n", response);
try std.testing.expectEqualStrings("abc", (try session.snapshot()).bytes);
}