From 216cfd3433c3188df9d5a3801242cac2e6f967ef Mon Sep 17 00:00:00 2001 From: Frank Tovar Date: Sat, 14 Mar 2026 02:11:30 +0100 Subject: [PATCH] Add validation warnings to critical imports --- docs/critical_import_tool.md | 7 +++++++ src/RolemasterDb.ImportTool/CriticalImportCommandRunner.cs | 5 +++++ .../Parsing/ImportValidationReport.cs | 2 ++ .../Parsing/StandardCriticalTableParser.cs | 2 ++ 4 files changed, 16 insertions(+) diff --git a/docs/critical_import_tool.md b/docs/critical_import_tool.md index fbdb506..643e11d 100644 --- a/docs/critical_import_tool.md +++ b/docs/critical_import_tool.md @@ -383,6 +383,7 @@ This includes: - overall validity - validation errors +- validation warnings - row count - cell count @@ -490,6 +491,12 @@ If validation fails: - SQLite load is aborted - the command returns an error +If validation succeeds with warnings: + +- artifacts still record the warnings +- SQLite load continues +- the CLI prints each warning before reporting the successful load + This design is deliberate. It is safer to reject ambiguous extraction than to load a nearly-correct but wrong lookup table. ## Database Load Behavior diff --git a/src/RolemasterDb.ImportTool/CriticalImportCommandRunner.cs b/src/RolemasterDb.ImportTool/CriticalImportCommandRunner.cs index 4cbaf30..ba5b8e1 100644 --- a/src/RolemasterDb.ImportTool/CriticalImportCommandRunner.cs +++ b/src/RolemasterDb.ImportTool/CriticalImportCommandRunner.cs @@ -53,6 +53,11 @@ public sealed class CriticalImportCommandRunner $"Validation failed for '{entry.Slug}'. See {artifactPaths.ValidationReportPath} for details."); } + foreach (var warning in parseResult.ValidationReport.Warnings) + { + Console.WriteLine($"Warning: {warning}"); + } + var loader = new CriticalImportLoader(ResolveDatabasePath(options.DatabasePath)); var result = await loader.LoadAsync(parseResult.Table); diff --git a/src/RolemasterDb.ImportTool/Parsing/ImportValidationReport.cs b/src/RolemasterDb.ImportTool/Parsing/ImportValidationReport.cs index f9a4c73..5d143a3 100644 --- a/src/RolemasterDb.ImportTool/Parsing/ImportValidationReport.cs +++ b/src/RolemasterDb.ImportTool/Parsing/ImportValidationReport.cs @@ -3,11 +3,13 @@ namespace RolemasterDb.ImportTool.Parsing; public sealed class ImportValidationReport( bool isValid, IReadOnlyList errors, + IReadOnlyList warnings, int rowCount, int cellCount) { public bool IsValid { get; } = isValid; public IReadOnlyList Errors { get; } = errors; + public IReadOnlyList Warnings { get; } = warnings; public int RowCount { get; } = rowCount; public int CellCount { get; } = cellCount; } diff --git a/src/RolemasterDb.ImportTool/Parsing/StandardCriticalTableParser.cs b/src/RolemasterDb.ImportTool/Parsing/StandardCriticalTableParser.cs index 52897f5..a0e7508 100644 --- a/src/RolemasterDb.ImportTool/Parsing/StandardCriticalTableParser.cs +++ b/src/RolemasterDb.ImportTool/Parsing/StandardCriticalTableParser.cs @@ -19,6 +19,7 @@ public sealed class StandardCriticalTableParser var fragments = LoadFragments(xmlContent); var headerFragments = FindHeaderFragments(fragments); var validationErrors = new List(); + var validationWarnings = new List(); var columnCenters = headerFragments .OrderBy(item => item.Left) @@ -147,6 +148,7 @@ public sealed class StandardCriticalTableParser var validationReport = new ImportValidationReport( validationErrors.Count == 0, validationErrors, + validationWarnings, rowAnchors.Count, parsedCells.Count);