refactor: extract runtime option ipc helpers

This commit is contained in:
2026-02-09 23:19:36 -08:00
parent 688eedbfc0
commit 35c2dd0e32
4 changed files with 135 additions and 30 deletions

View File

@@ -0,0 +1,53 @@
import test from "node:test";
import assert from "node:assert/strict";
import {
applyRuntimeOptionResultRuntimeService,
cycleRuntimeOptionFromIpcRuntimeService,
setRuntimeOptionFromIpcRuntimeService,
} from "./runtime-options-runtime-service";
test("applyRuntimeOptionResultRuntimeService emits success OSD message", () => {
const osd: string[] = [];
const result = applyRuntimeOptionResultRuntimeService(
{ ok: true, osdMessage: "Updated" },
(text) => {
osd.push(text);
},
);
assert.equal(result.ok, true);
assert.deepEqual(osd, ["Updated"]);
});
test("setRuntimeOptionFromIpcRuntimeService returns unavailable when manager missing", () => {
const osd: string[] = [];
const result = setRuntimeOptionFromIpcRuntimeService(
null,
"anki.autoUpdateNewCards",
true,
(text) => {
osd.push(text);
},
);
assert.equal(result.ok, false);
assert.equal(result.error, "Runtime options manager unavailable");
assert.deepEqual(osd, []);
});
test("cycleRuntimeOptionFromIpcRuntimeService reports errors once", () => {
const osd: string[] = [];
const result = cycleRuntimeOptionFromIpcRuntimeService(
{
setOptionValue: () => ({ ok: true }),
cycleOption: () => ({ ok: false, error: "bad option" }),
},
"anki.kikuFieldGrouping",
1,
(text) => {
osd.push(text);
},
);
assert.equal(result.ok, false);
assert.equal(result.error, "bad option");
assert.deepEqual(osd, ["bad option"]);
});

View File

@@ -0,0 +1,64 @@
import {
RuntimeOptionApplyResult,
RuntimeOptionId,
RuntimeOptionValue,
} from "../../types";
export interface RuntimeOptionsManagerLike {
setOptionValue: (
id: RuntimeOptionId,
value: RuntimeOptionValue,
) => RuntimeOptionApplyResult;
cycleOption: (
id: RuntimeOptionId,
direction: 1 | -1,
) => RuntimeOptionApplyResult;
}
export function applyRuntimeOptionResultRuntimeService(
result: RuntimeOptionApplyResult,
showMpvOsd: (text: string) => void,
): RuntimeOptionApplyResult {
if (result.ok && result.osdMessage) {
showMpvOsd(result.osdMessage);
}
return result;
}
export function setRuntimeOptionFromIpcRuntimeService(
manager: RuntimeOptionsManagerLike | null,
id: RuntimeOptionId,
value: RuntimeOptionValue,
showMpvOsd: (text: string) => void,
): RuntimeOptionApplyResult {
if (!manager) {
return { ok: false, error: "Runtime options manager unavailable" };
}
const result = applyRuntimeOptionResultRuntimeService(
manager.setOptionValue(id, value),
showMpvOsd,
);
if (!result.ok && result.error) {
showMpvOsd(result.error);
}
return result;
}
export function cycleRuntimeOptionFromIpcRuntimeService(
manager: RuntimeOptionsManagerLike | null,
id: RuntimeOptionId,
direction: 1 | -1,
showMpvOsd: (text: string) => void,
): RuntimeOptionApplyResult {
if (!manager) {
return { ok: false, error: "Runtime options manager unavailable" };
}
const result = applyRuntimeOptionResultRuntimeService(
manager.cycleOption(id, direction),
showMpvOsd,
);
if (!result.ok && result.error) {
showMpvOsd(result.error);
}
return result;
}