63 lines
1.9 KiB
TypeScript
63 lines
1.9 KiB
TypeScript
/**
|
|
* Parse a CompileResult into CompilationLog entries for display in the console.
|
|
*/
|
|
|
|
import type { CompileResult } from '../services/compilation';
|
|
|
|
export interface CompilationLog {
|
|
timestamp: Date;
|
|
type: 'info' | 'success' | 'error' | 'warning' | 'core-install';
|
|
message: string;
|
|
}
|
|
|
|
export function parseCompileResult(result: CompileResult, board: string): CompilationLog[] {
|
|
const logs: CompilationLog[] = [];
|
|
const now = new Date();
|
|
|
|
logs.push({ timestamp: now, type: 'info', message: `Compiling for ${board}...` });
|
|
|
|
// Core install log
|
|
if (result.core_install_log) {
|
|
for (const line of result.core_install_log.split('\n')) {
|
|
if (line.trim()) {
|
|
logs.push({ timestamp: now, type: 'core-install', message: line });
|
|
}
|
|
}
|
|
}
|
|
|
|
// stdout
|
|
if (result.stdout) {
|
|
for (const line of result.stdout.split('\n')) {
|
|
if (line.trim()) {
|
|
const type = line.toLowerCase().includes('warning') ? 'warning' : 'info';
|
|
logs.push({ timestamp: now, type, message: line });
|
|
}
|
|
}
|
|
}
|
|
|
|
// stderr — classify lines as warnings or errors
|
|
if (result.stderr) {
|
|
for (const line of result.stderr.split('\n')) {
|
|
if (!line.trim()) continue;
|
|
let type: CompilationLog['type'] = 'error';
|
|
const lower = line.toLowerCase();
|
|
if (lower.includes('warning:') || lower.includes('warn ')) {
|
|
type = 'warning';
|
|
} else if (lower.includes('note:') || lower.includes('in file included') || lower.startsWith('using ') || lower.startsWith('libraries ')) {
|
|
type = 'info';
|
|
}
|
|
logs.push({ timestamp: now, type, message: line });
|
|
}
|
|
}
|
|
|
|
// Final status
|
|
if (result.success) {
|
|
logs.push({ timestamp: now, type: 'success', message: '✓ Compilation successful' });
|
|
} else {
|
|
const errorMsg = result.error || 'Compilation failed';
|
|
logs.push({ timestamp: now, type: 'error', message: `✕ ${errorMsg}` });
|
|
}
|
|
|
|
return logs;
|
|
}
|