diff options
| author | Gabriel Schneider <[email protected]> | 2026-09-28 23:04:59 -0300 |
|---|---|---|
| committer | Gabriel Schneider <[email protected]> | 2026-10-01 00:12:15 -0300 |
| commit | 7e6e5e803c6ec2e203b094b2a64291840c5e6aed (patch) | |
| tree | 22c45825bc56f1199344c93c7c5e4bd6a7e780aa /src/ninep | |
| parent | 2586e804e4df670bf6a5072ec776d9fc00c1c4b9 (diff) | |
| download | pardes-7e6e5e803c6ec2e203b094b2a64291840c5e6aed.tar.gz pardes-7e6e5e803c6ec2e203b094b2a64291840c5e6aed.zip | |
An answer the question does not offer is refused, and the question stands
`answer z` to a question offering a and b succeeded, sent nothing and
dropped the question; so did Del's `answer x`. The ctl now takes only an
offered choice or -, refuses anything else with the choices it takes
(`answer takes k j or -`), and leaves the question asked.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Diffstat (limited to 'src/ninep')
| -rw-r--r-- | src/ninep/ctl.zig | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/src/ninep/ctl.zig b/src/ninep/ctl.zig index b4144fd2..c8be3bad 100644 --- a/src/ninep/ctl.zig +++ b/src/ninep/ctl.zig @@ -516,10 +516,15 @@ pub fn writePane(p: *Pardes, req: Req, pane: *Pane) Reply { } else if (std.mem.startsWith(u8, line, "answer ")) { // The pane's question (its `ask` in the log), answered. const choice = std.mem.trim(u8, line["answer ".len..], " "); - if (choice.len != 1) return refuse(p, req, "answer takes one choice, or -", line); const id = p.paneBySerial(serial).?; - if (p.panes[id].?.prompt != .del_side and p.panes[id].?.prompt != .repl_choice) - return refuse(p, req, "no question asked", line); + var offered: [64]u8 = undefined; + const choices = p.questionChoices(id, &offered) orelse return refuse(p, req, "no question asked", line); + // Only a choice the question offers answers it; anything + // else leaves it standing, and says what it takes. + if (!std.mem.eql(u8, choice, "-") and (choice.len != 1 or std.mem.indexOfScalar(u8, choices, choice[0]) == null)) { + var why: [96]u8 = undefined; + return refuse(p, req, std.fmt.bufPrint(&why, "answer takes {s} or -", .{choices}) catch "answer takes a choice or -", line); + } if (apply) _ = p.answerQuestion(id, if (choice[0] == '-') null else choice[0]); } else if (!apply) { if (checkBuiltin(p, req, line, .pane)) |refusal| return refusal; |
