import { YamlValidationError, YamlEditorSchema } from './types'; export function validateYaml(content: string, schemas: YamlEditorSchema[] = []): YamlValidationError[] { const errors: YamlValidationError[] = []; if (!content.trim()) { return errors; } try { // 基础 YAML 语法验证 const lines = content.split('\n'); for (let i = 0; i < lines.length; i++) { const line = lines[i]; const lineNumber = i + 1; // 检查缩进一致性 if (line.trim() && !isValidIndentation(line)) { errors.push({ message: 'Invalid indentation. YAML requires consistent indentation.', startLineNumber: lineNumber, endLineNumber: lineNumber, startColumn: 1, endColumn: line.length + 1, severity: 'error', }); } // 检查冒号后是否有空格 const colonMatch = line.match(/^(\s*)([^:\s]+)(:)(\S)/); if (colonMatch) { const startColumn = colonMatch[1].length + colonMatch[2].length + 2; errors.push({ message: 'Missing space after colon. Use ": " instead of ":"', startLineNumber: lineNumber, endLineNumber: lineNumber, startColumn: startColumn, endColumn: startColumn + 1, severity: 'error', }); } // 检查列表项格式 const listMatch = line.match(/^(\s*)-(\S)/); if (listMatch) { const startColumn = listMatch[1].length + 2; errors.push({ message: 'Missing space after dash. Use "- " instead of "-"', startLineNumber: lineNumber, endLineNumber: lineNumber, startColumn: startColumn, endColumn: startColumn + 1, severity: 'error', }); } } // Schema 验证 if (schemas.length > 0) { const schemaErrors = validateAgainstSchemas(content, schemas); errors.push(...schemaErrors); } } catch (error) { errors.push({ message: `YAML parsing error: ${error}`, startLineNumber: 1, endLineNumber: 1, startColumn: 1, endColumn: 1, severity: 'error', }); } return errors; } function isValidIndentation(line: string): boolean { const trimmed = line.trim(); if (!trimmed) return true; const leadingSpaces = line.length - line.trimLeft().length; // YAML 通常使用 2 或 4 个空格缩进 return leadingSpaces % 2 === 0; } function validateAgainstSchemas(_content: string, _schemas: YamlEditorSchema[]): YamlValidationError[] { const errors: YamlValidationError[] = []; // TODO: 实现更复杂的 schema 验证逻辑 // 目前提供基础的结构验证 // 可以在这里添加对 content 和 schemas 的具体验证 return errors; } export function parseYamlValue(value: string): any { const trimmed = value.trim(); // Boolean values if (['true', 'True', 'TRUE', 'yes', 'Yes', 'YES', 'on', 'On', 'ON'].includes(trimmed)) { return true; } if (['false', 'False', 'FALSE', 'no', 'No', 'NO', 'off', 'Off', 'OFF'].includes(trimmed)) { return false; } // Null values if (['null', 'Null', 'NULL', '~'].includes(trimmed)) { return null; } // Number values if (/^-?\d+$/.test(trimmed)) { return parseInt(trimmed, 10); } if (/^-?\d+\.\d+$/.test(trimmed)) { return parseFloat(trimmed); } // String values (remove quotes if present) if ((trimmed.startsWith('"') && trimmed.endsWith('"')) || (trimmed.startsWith("'") && trimmed.endsWith("'"))) { return trimmed.slice(1, -1); } return trimmed; }