using System; using System.IO; using System.Text.Json; using GeViSetEditor.Core.Models; using GeViSetEditor.Core.Parsers; namespace GeViSetEditor.CLI.Commands { /// /// Test complete binary parser - parses ENTIRE structure /// public static class ParseCompleteCommand { public static void Execute(string inputPath, string? outputJsonPath = null) { Console.WriteLine("=== Complete Binary Parser Test ===\n"); if (!File.Exists(inputPath)) { Console.WriteLine($"ERROR: File not found: {inputPath}"); return; } try { // Read file byte[] data = File.ReadAllBytes(inputPath); Console.WriteLine($"Read file: {inputPath}"); Console.WriteLine($"File size: {data.Length:N0} bytes\n"); // Parse with complete parser var parser = new CompleteBinaryParser(); var setFile = parser.Parse(data); // Display results Console.WriteLine("\n=== Parse Results ==="); Console.WriteLine($"Header: '{setFile.Header}'"); Console.WriteLine($"Sections: {setFile.Sections.Count}"); Console.WriteLine($"Total Items: {setFile.Statistics.TotalItems}"); Console.WriteLine($"Total Rules: {setFile.Statistics.TotalRules}"); Console.WriteLine($"Total Actions: {setFile.Statistics.TotalActions}"); Console.WriteLine("\n=== Section Breakdown ==="); foreach (var sectionType in setFile.Statistics.SectionTypes.OrderByDescending(x => x.Value)) { Console.WriteLine($" {sectionType.Key}: {sectionType.Value} occurrences"); } // Show first few sections in detail Console.WriteLine("\n=== First 10 Sections (Detail) ==="); foreach (var section in setFile.Sections.Take(10)) { Console.WriteLine($"\nSection: '{section.Name}'"); Console.WriteLine($" Offset: {section.FileOffset} - {section.FileEndOffset} ({section.ByteSize} bytes)"); Console.WriteLine($" Items: {section.Items.Count}, Rules: {section.Rules.Count}"); if (section.Items.Count > 0) { Console.WriteLine(" Sample items:"); foreach (var item in section.Items.Take(3)) { Console.WriteLine($" {item.Key} = {item.Value} ({item.ValueType})"); } if (section.Items.Count > 3) { Console.WriteLine($" ... and {section.Items.Count - 3} more"); } } if (section.Rules.Count > 0) { Console.WriteLine(" Sample rules:"); foreach (var rule in section.Rules.Take(2)) { Console.WriteLine($" Rule #{rule.RuleId}: {rule.Actions.Count} actions"); foreach (var action in rule.Actions.Take(2)) { Console.WriteLine($" - {action}"); } } } } // Export to JSON if requested if (!string.IsNullOrEmpty(outputJsonPath)) { Console.WriteLine($"\n=== Exporting to JSON ==="); var options = new JsonSerializerOptions { WriteIndented = true, PropertyNamingPolicy = JsonNamingPolicy.CamelCase }; string json = JsonSerializer.Serialize(setFile, options); File.WriteAllText(outputJsonPath, json); Console.WriteLine($"JSON written to: {outputJsonPath}"); Console.WriteLine($"JSON size: {json.Length:N0} characters"); } Console.WriteLine("\n✓ Parsing complete!"); } catch (Exception ex) { Console.WriteLine($"\n✗ ERROR: {ex.Message}"); Console.WriteLine($"Stack trace:\n{ex.StackTrace}"); } } } }