Files
my-pi/pi-notify/src/parsers.ts
T

45 lines
1.8 KiB
TypeScript

import type { KittyVisibility, MessageSource, NotificationAction } from "./types.ts";
export function parseMessageSource(value: string | undefined): MessageSource {
const normalized = value?.trim().toLowerCase();
if (normalized === "user" || normalized === "none") return normalized;
return "assistant";
}
export function parseMessageMax(value: string | undefined): number {
return parseBoundedInteger(value, 80, 0, 500);
}
export function parseMinDurationMs(value: string | undefined): number {
const seconds = parseBoundedNumber(value, 3, 0, 3600);
return Math.round(seconds * 1000);
}
export function parseEnabled(value: string | undefined): boolean {
if (value === undefined) return true;
return !["0", "false", "no", "off"].includes(value.trim().toLowerCase());
}
export function parseKittyVisibility(value: string | undefined): KittyVisibility {
const normalized = value?.trim().toLowerCase();
if (normalized === "always" || normalized === "unfocused" || normalized === "invisible") return normalized;
return "always";
}
export function parseNotificationAction(value: string | undefined): NotificationAction {
return value?.trim().toLowerCase() === "none" ? "none" : "focus";
}
function parseBoundedInteger(value: string | undefined, fallback: number, min: number, max: number): number {
const parsed = Number.parseInt(value || String(fallback), 10);
if (!Number.isFinite(parsed)) return fallback;
return Math.max(min, Math.min(parsed, max));
}
function parseBoundedNumber(value: string | undefined, fallback: number, min: number, max: number): number {
const normalized = value?.trim();
const parsed = Number(normalized ? normalized : fallback);
if (!Number.isFinite(parsed)) return fallback;
return Math.max(min, Math.min(parsed, max));
}