23 lines
845 B
TypeScript
23 lines
845 B
TypeScript
export type TargetIdResolution =
|
|
| { ok: true; targetId: string }
|
|
| { ok: false; reason: "not_found" | "ambiguous"; matches?: string[] };
|
|
|
|
export function resolveTargetIdFromTabs(
|
|
input: string,
|
|
tabs: Array<{ targetId: string }>,
|
|
): TargetIdResolution {
|
|
const needle = input.trim();
|
|
if (!needle) return { ok: false, reason: "not_found" };
|
|
|
|
const exact = tabs.find((t) => t.targetId === needle);
|
|
if (exact) return { ok: true, targetId: exact.targetId };
|
|
|
|
const lower = needle.toLowerCase();
|
|
const matches = tabs.map((t) => t.targetId).filter((id) => id.toLowerCase().startsWith(lower));
|
|
|
|
const only = matches.length === 1 ? matches[0] : undefined;
|
|
if (only) return { ok: true, targetId: only };
|
|
if (matches.length === 0) return { ok: false, reason: "not_found" };
|
|
return { ok: false, reason: "ambiguous", matches };
|
|
}
|