MCPcopy Create free account
hub / github.com/RtlZeroMemory/Rezi / parseKeyPart

Function parseKeyPart

packages/core/src/keybindings/parser.ts:27–174  ·  view source on GitHub ↗

* Parse a single key part (e.g., "ctrl+s" or just "a"). * * @param part - Single key/modifier combination (no spaces) * @returns ParsedKey or error

(
  part: string,
)

Source from the content-addressed store, hash-verified

25 * @returns ParsedKey or error
26 */
27function parseKeyPart(
28 part: string,
29): { ok: true; value: ParsedKey } | { ok: false; error: KeyParseError } {
30 if (part.length === 0) {
31 return {
32 ok: false,
33 error: { code: "EMPTY_SEQUENCE", detail: "empty key part" },
34 };
35 }
36
37 // Split on "+" to get modifiers and key
38 const pieces = part.split("+");
39 if (pieces.length === 0) {
40 return {
41 ok: false,
42 error: { code: "EMPTY_SEQUENCE", detail: "empty key part" },
43 };
44 }
45
46 let shift = false;
47 let ctrl = false;
48 let alt = false;
49 let meta = false;
50 let keyName: string | undefined;
51 const seenModifiers = new Set<"shift" | "ctrl" | "alt" | "meta">();
52
53 // Process each piece - all but last should be modifiers, last is the key
54 for (let i = 0; i < pieces.length; i++) {
55 const piece = pieces[i];
56 if (piece === undefined || piece.length === 0) {
57 return {
58 ok: false,
59 error: { code: "INVALID_KEY", detail: `empty component in "${part}"` },
60 };
61 }
62
63 const isLast = i === pieces.length - 1;
64 const pieceLower = piece.toLowerCase();
65
66 if (MODIFIER_NAMES.has(pieceLower)) {
67 // It's a modifier
68 let modifier: "shift" | "ctrl" | "alt" | "meta" | null = null;
69 switch (pieceLower) {
70 case "shift":
71 modifier = "shift";
72 shift = true;
73 break;
74 case "ctrl":
75 case "control":
76 modifier = "ctrl";
77 ctrl = true;
78 break;
79 case "alt":
80 modifier = "alt";
81 alt = true;
82 break;
83 case "meta":
84 case "cmd":

Callers 1

parseKeySequenceFunction · 0.85

Calls 4

charToKeyCodeFunction · 0.85
hasMethod · 0.45
addMethod · 0.45
getMethod · 0.45

Tested by

no test coverage detected