mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-02-28 06:22:45 -08:00
86 lines
2.2 KiB
TypeScript
86 lines
2.2 KiB
TypeScript
import type { ConfigValidationWarning } from '../types';
|
|
|
|
export type StartupFailureHandlers = {
|
|
logError: (details: string) => void;
|
|
showErrorBox: (title: string, details: string) => void;
|
|
quit: () => void;
|
|
};
|
|
|
|
export function formatConfigValue(value: unknown): string {
|
|
if (value === undefined) {
|
|
return 'undefined';
|
|
}
|
|
|
|
try {
|
|
return JSON.stringify(value);
|
|
} catch {
|
|
return String(value);
|
|
}
|
|
}
|
|
|
|
export function buildConfigWarningSummary(
|
|
configPath: string,
|
|
warnings: ConfigValidationWarning[],
|
|
): string {
|
|
const lines = [
|
|
`[config] Validation found ${warnings.length} issue(s). File: ${configPath}`,
|
|
...warnings.map(
|
|
(warning, index) =>
|
|
`[config] ${index + 1}. ${warning.path}: ${warning.message} actual=${formatConfigValue(warning.value)} fallback=${formatConfigValue(warning.fallback)}`,
|
|
),
|
|
];
|
|
return lines.join('\n');
|
|
}
|
|
|
|
export function buildConfigWarningNotificationBody(
|
|
configPath: string,
|
|
warnings: ConfigValidationWarning[],
|
|
): string {
|
|
const maxLines = 3;
|
|
const maxPathLength = 48;
|
|
|
|
const trimPath = (value: string): string =>
|
|
value.length > maxPathLength ? `...${value.slice(-(maxPathLength - 3))}` : value;
|
|
const clippedPath = trimPath(configPath);
|
|
|
|
const lines = warnings.slice(0, maxLines).map((warning, index) => {
|
|
const message = `${warning.path}: ${warning.message}`;
|
|
return `${index + 1}. ${message}`;
|
|
});
|
|
|
|
const overflow = warnings.length - lines.length;
|
|
if (overflow > 0) {
|
|
lines.push(`+${overflow} more issue(s)`);
|
|
}
|
|
|
|
return [
|
|
`${warnings.length} config validation issue(s) detected.`,
|
|
'Defaults were applied where possible.',
|
|
`File: ${clippedPath}`,
|
|
...lines,
|
|
].join('\n');
|
|
}
|
|
|
|
export function buildConfigParseErrorDetails(configPath: string, parseError: string): string {
|
|
return [
|
|
'Failed to parse config file at:',
|
|
configPath,
|
|
'',
|
|
`Error: ${parseError}`,
|
|
'',
|
|
'Fix the config file and restart SubMiner.',
|
|
].join('\n');
|
|
}
|
|
|
|
export function failStartupFromConfig(
|
|
title: string,
|
|
details: string,
|
|
handlers: StartupFailureHandlers,
|
|
): never {
|
|
handlers.logError(details);
|
|
handlers.showErrorBox(title, details);
|
|
process.exitCode = 1;
|
|
handlers.quit();
|
|
throw new Error(details);
|
|
}
|