using System.IO; using System.Linq; using System.Text; using SabreTools.IO.Writers; using SabreTools.Models.AttractMode; namespace SabreTools.Serialization { /// /// Separated value serializer for AttractMode romlists /// public partial class AttractMode { /// /// Serializes the defined type to an AttractMode romlist /// /// Data to serialize /// Path to the file to serialize to /// True on successful serialization, false otherwise public static bool SerializeToFile(MetadataFile? metadataFile, string path) { using var stream = SerializeToStream(metadataFile); if (stream == null) return false; using var fs = File.OpenWrite(path); stream.Seek(0, SeekOrigin.Begin); stream.CopyTo(fs); return true; } /// /// Serializes the defined type to a stream /// /// Data to serialize /// Stream containing serialized data on success, null otherwise public static Stream? SerializeToStream(MetadataFile? metadataFile) { // If the metadata file is null if (metadataFile == null) return null; // Setup the writer and output var stream = new MemoryStream(); var writer = new SeparatedValueWriter(stream, Encoding.UTF8) { Separator = ';', Quotes = false, VerifyFieldCount = false, }; // TODO: Include flag to write out long or short header // Write the short header writer.WriteString(HeaderWithoutRomname); // TODO: Convert to array of values // Write out the rows, if they exist WriteRows(metadataFile.Row, writer); // Return the stream return stream; } /// /// Write rows information to the current writer /// /// Array of Row objects representing the rows information /// SeparatedValueWriter representing the output private static void WriteRows(Row[]? rows, SeparatedValueWriter writer) { // If the games information is missing, we can't do anything if (rows == null || !rows.Any()) return; // Loop through and write out the rows foreach (var row in rows) { var rowArray = new string?[] { row.Name, row.Title, row.Emulator, row.CloneOf, row.Year, row.Manufacturer, row.Category, row.Players, row.Rotation, row.Control, row.Status, row.DisplayCount, row.DisplayType, row.AltRomname, row.AltTitle, row.Extra, row.Buttons, }; writer.WriteValues(rowArray); writer.Flush(); } } } }