mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-02-28 06:22:45 -08:00
feat(core): add Electron runtime, services, and app composition
This commit is contained in:
85
src/main/config-validation.ts
Normal file
85
src/main/config-validation.ts
Normal file
@@ -0,0 +1,85 @@
|
||||
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);
|
||||
}
|
||||
Reference in New Issue
Block a user