100 lines
2.8 KiB
TypeScript
100 lines
2.8 KiB
TypeScript
export type DebugCommand =
|
|
| { action: "show" }
|
|
| { action: "reset" }
|
|
| { action: "set"; path: string; value: unknown }
|
|
| { action: "unset"; path: string }
|
|
| { action: "error"; message: string };
|
|
|
|
function parseDebugValue(raw: string): { value?: unknown; error?: string } {
|
|
const trimmed = raw.trim();
|
|
if (!trimmed) return { error: "Missing value." };
|
|
|
|
if (trimmed.startsWith("{") || trimmed.startsWith("[")) {
|
|
try {
|
|
return { value: JSON.parse(trimmed) };
|
|
} catch (err) {
|
|
return { error: `Invalid JSON: ${String(err)}` };
|
|
}
|
|
}
|
|
|
|
if (trimmed === "true") return { value: true };
|
|
if (trimmed === "false") return { value: false };
|
|
if (trimmed === "null") return { value: null };
|
|
|
|
if (/^-?\d+(\.\d+)?$/.test(trimmed)) {
|
|
const num = Number(trimmed);
|
|
if (Number.isFinite(num)) return { value: num };
|
|
}
|
|
|
|
if (
|
|
(trimmed.startsWith('"') && trimmed.endsWith('"')) ||
|
|
(trimmed.startsWith("'") && trimmed.endsWith("'"))
|
|
) {
|
|
try {
|
|
return { value: JSON.parse(trimmed) };
|
|
} catch {
|
|
const unquoted = trimmed.slice(1, -1);
|
|
return { value: unquoted };
|
|
}
|
|
}
|
|
|
|
return { value: trimmed };
|
|
}
|
|
|
|
export function parseDebugCommand(raw: string): DebugCommand | null {
|
|
const trimmed = raw.trim();
|
|
if (!trimmed.toLowerCase().startsWith("/debug")) return null;
|
|
const rest = trimmed.slice("/debug".length).trim();
|
|
if (!rest) return { action: "show" };
|
|
|
|
const match = rest.match(/^(\S+)(?:\s+([\s\S]+))?$/);
|
|
if (!match) return { action: "error", message: "Invalid /debug syntax." };
|
|
const action = match[1].toLowerCase();
|
|
const args = (match[2] ?? "").trim();
|
|
|
|
switch (action) {
|
|
case "show":
|
|
return { action: "show" };
|
|
case "reset":
|
|
return { action: "reset" };
|
|
case "unset": {
|
|
if (!args)
|
|
return { action: "error", message: "Usage: /debug unset path" };
|
|
return { action: "unset", path: args };
|
|
}
|
|
case "set": {
|
|
if (!args) {
|
|
return {
|
|
action: "error",
|
|
message: "Usage: /debug set path=value",
|
|
};
|
|
}
|
|
const eqIndex = args.indexOf("=");
|
|
if (eqIndex <= 0) {
|
|
return {
|
|
action: "error",
|
|
message: "Usage: /debug set path=value",
|
|
};
|
|
}
|
|
const path = args.slice(0, eqIndex).trim();
|
|
const rawValue = args.slice(eqIndex + 1);
|
|
if (!path) {
|
|
return {
|
|
action: "error",
|
|
message: "Usage: /debug set path=value",
|
|
};
|
|
}
|
|
const parsed = parseDebugValue(rawValue);
|
|
if (parsed.error) {
|
|
return { action: "error", message: parsed.error };
|
|
}
|
|
return { action: "set", path, value: parsed.value };
|
|
}
|
|
default:
|
|
return {
|
|
action: "error",
|
|
message: "Usage: /debug show|set|unset|reset",
|
|
};
|
|
}
|
|
}
|