From 6eb0964fa6a6a144ff720a51ab9b4ea62e987a80 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Wed, 18 Feb 2026 23:08:18 +0000 Subject: [PATCH] refactor(auto-reply): share standard set/unset slash parsing --- .../reply/commands-setunset-standard.ts | 23 ++++++++++++++++ .../reply/commands-setunset.test.ts | 26 +++++++++++++++++++ src/auto-reply/reply/config-commands.ts | 7 ++--- src/auto-reply/reply/debug-commands.ts | 7 ++--- 4 files changed, 53 insertions(+), 10 deletions(-) create mode 100644 src/auto-reply/reply/commands-setunset-standard.ts diff --git a/src/auto-reply/reply/commands-setunset-standard.ts b/src/auto-reply/reply/commands-setunset-standard.ts new file mode 100644 index 0000000000..0005407208 --- /dev/null +++ b/src/auto-reply/reply/commands-setunset-standard.ts @@ -0,0 +1,23 @@ +import { parseSlashCommandWithSetUnset } from "./commands-setunset.js"; + +export function parseStandardSetUnsetSlashCommand(params: { + raw: string; + slash: string; + invalidMessage: string; + usageMessage: string; + onKnownAction: (action: string, args: string) => T | undefined; + onSet?: (path: string, value: unknown) => T; + onUnset?: (path: string) => T; + onError?: (message: string) => T; +}): T | null { + return parseSlashCommandWithSetUnset({ + raw: params.raw, + slash: params.slash, + invalidMessage: params.invalidMessage, + usageMessage: params.usageMessage, + onKnownAction: params.onKnownAction, + onSet: params.onSet ?? ((path, value) => ({ action: "set", path, value }) as T), + onUnset: params.onUnset ?? ((path) => ({ action: "unset", path }) as T), + onError: params.onError ?? ((message) => ({ action: "error", message }) as T), + }); +} diff --git a/src/auto-reply/reply/commands-setunset.test.ts b/src/auto-reply/reply/commands-setunset.test.ts index 7e471a4a83..fd420fc248 100644 --- a/src/auto-reply/reply/commands-setunset.test.ts +++ b/src/auto-reply/reply/commands-setunset.test.ts @@ -1,4 +1,5 @@ import { describe, expect, it } from "vitest"; +import { parseStandardSetUnsetSlashCommand } from "./commands-setunset-standard.js"; import { parseSetUnsetCommand, parseSetUnsetCommandAction, @@ -114,3 +115,28 @@ describe("parseSlashCommandWithSetUnset", () => { expect(unknownAction).toEqual({ action: "error", message: "Usage: /config show|set|unset" }); }); }); + +describe("parseStandardSetUnsetSlashCommand", () => { + it("uses default set/unset/error mappings", () => { + const result = parseStandardSetUnsetSlashCommand({ + raw: '/config set a.b={"ok":true}', + slash: "/config", + invalidMessage: "Invalid /config syntax.", + usageMessage: "Usage: /config show|set|unset", + onKnownAction: () => undefined, + }); + expect(result).toEqual({ action: "set", path: "a.b", value: { ok: true } }); + }); + + it("supports caller-provided mappings", () => { + const result = parseStandardSetUnsetSlashCommand({ + raw: "/config unset a.b", + slash: "/config", + invalidMessage: "Invalid /config syntax.", + usageMessage: "Usage: /config show|set|unset", + onKnownAction: () => undefined, + onUnset: (path) => ({ action: "unset", path: `wrapped:${path}` }), + }); + expect(result).toEqual({ action: "unset", path: "wrapped:a.b" }); + }); +}); diff --git a/src/auto-reply/reply/config-commands.ts b/src/auto-reply/reply/config-commands.ts index 888d26ac8b..f4e21668b6 100644 --- a/src/auto-reply/reply/config-commands.ts +++ b/src/auto-reply/reply/config-commands.ts @@ -1,4 +1,4 @@ -import { parseSlashCommandWithSetUnset } from "./commands-setunset.js"; +import { parseStandardSetUnsetSlashCommand } from "./commands-setunset-standard.js"; export type ConfigCommand = | { action: "show"; path?: string } @@ -7,7 +7,7 @@ export type ConfigCommand = | { action: "error"; message: string }; export function parseConfigCommand(raw: string): ConfigCommand | null { - return parseSlashCommandWithSetUnset({ + return parseStandardSetUnsetSlashCommand({ raw, slash: "/config", invalidMessage: "Invalid /config syntax.", @@ -18,8 +18,5 @@ export function parseConfigCommand(raw: string): ConfigCommand | null { } return undefined; }, - onSet: (path, value) => ({ action: "set", path, value }), - onUnset: (path) => ({ action: "unset", path }), - onError: (message) => ({ action: "error", message }), }); } diff --git a/src/auto-reply/reply/debug-commands.ts b/src/auto-reply/reply/debug-commands.ts index 9d06c16d5f..f95467b280 100644 --- a/src/auto-reply/reply/debug-commands.ts +++ b/src/auto-reply/reply/debug-commands.ts @@ -1,4 +1,4 @@ -import { parseSlashCommandWithSetUnset } from "./commands-setunset.js"; +import { parseStandardSetUnsetSlashCommand } from "./commands-setunset-standard.js"; export type DebugCommand = | { action: "show" } @@ -8,7 +8,7 @@ export type DebugCommand = | { action: "error"; message: string }; export function parseDebugCommand(raw: string): DebugCommand | null { - return parseSlashCommandWithSetUnset({ + return parseStandardSetUnsetSlashCommand({ raw, slash: "/debug", invalidMessage: "Invalid /debug syntax.", @@ -22,8 +22,5 @@ export function parseDebugCommand(raw: string): DebugCommand | null { } return undefined; }, - onSet: (path, value) => ({ action: "set", path, value }), - onUnset: (path) => ({ action: "unset", path }), - onError: (message) => ({ action: "error", message }), }); }