80 lines
2.1 KiB
TypeScript
80 lines
2.1 KiB
TypeScript
export type PaginationCmdOpts = {
|
|
all?: boolean;
|
|
maxPages?: string;
|
|
cursor?: string;
|
|
delay?: string;
|
|
};
|
|
|
|
export function parsePositiveIntFlag(
|
|
raw: string | undefined,
|
|
flagName: string,
|
|
): { ok: true; value: number | undefined } | { ok: false; error: string } {
|
|
if (raw === undefined) {
|
|
return { ok: true, value: undefined };
|
|
}
|
|
const value = Number.parseInt(raw, 10);
|
|
if (!Number.isFinite(value) || value <= 0) {
|
|
return { ok: false, error: `Invalid ${flagName}. Expected a positive integer.` };
|
|
}
|
|
return { ok: true, value };
|
|
}
|
|
|
|
export function parseNonNegativeIntFlag(
|
|
raw: string | undefined,
|
|
flagName: string,
|
|
defaultValue: number,
|
|
): { ok: true; value: number } | { ok: false; error: string } {
|
|
const value = Number.parseInt(raw ?? String(defaultValue), 10);
|
|
if (!Number.isFinite(value) || value < 0) {
|
|
return { ok: false, error: `Invalid ${flagName}. Expected a non-negative integer.` };
|
|
}
|
|
return { ok: true, value };
|
|
}
|
|
|
|
export function parsePaginationFlags(
|
|
cmdOpts: PaginationCmdOpts,
|
|
opts?: {
|
|
maxPagesImpliesPagination?: boolean;
|
|
defaultDelayMs?: number;
|
|
includeDelay?: boolean;
|
|
},
|
|
):
|
|
| {
|
|
ok: true;
|
|
usePagination: boolean;
|
|
maxPages?: number;
|
|
cursor?: string;
|
|
pageDelayMs?: number;
|
|
}
|
|
| { ok: false; error: string } {
|
|
const maxPagesImpliesPagination = opts?.maxPagesImpliesPagination ?? false;
|
|
const includeDelay = opts?.includeDelay ?? false;
|
|
const defaultDelayMs = opts?.defaultDelayMs ?? 1000;
|
|
|
|
const maxPages = parsePositiveIntFlag(cmdOpts.maxPages, '--max-pages');
|
|
if (!maxPages.ok) {
|
|
return maxPages;
|
|
}
|
|
|
|
const usePagination = Boolean(
|
|
cmdOpts.all || cmdOpts.cursor || (maxPagesImpliesPagination && maxPages.value !== undefined),
|
|
);
|
|
|
|
let pageDelayMs: number | undefined;
|
|
if (includeDelay) {
|
|
const delay = parseNonNegativeIntFlag(cmdOpts.delay, '--delay', defaultDelayMs);
|
|
if (!delay.ok) {
|
|
return delay;
|
|
}
|
|
pageDelayMs = delay.value;
|
|
}
|
|
|
|
return {
|
|
ok: true,
|
|
usePagination,
|
|
maxPages: maxPages.value,
|
|
cursor: cmdOpts.cursor,
|
|
pageDelayMs,
|
|
};
|
|
}
|