using System; using System.Collections.Generic; using SabreTools.Metadata.DatItems; using SabreTools.Metadata.DatItems.Formats; namespace SabreTools.Metadata.DatFiles.Formats { /// /// Represents parsing and writing of a SoftwareList /// public sealed class SoftwareList : SerializableDatFile { #region Constants /// /// DTD for original MAME Software List DATs /// /// /// TODO: See if there's an updated DTD and then check for required fields /// internal const string SoftwareListDTD = @" "; #endregion #region Properties /// public override Data.Models.Metadata.ItemType[] SupportedTypes => [ Data.Models.Metadata.ItemType.DipSwitch, Data.Models.Metadata.ItemType.Disk, Data.Models.Metadata.ItemType.Info, Data.Models.Metadata.ItemType.PartFeature, Data.Models.Metadata.ItemType.Rom, Data.Models.Metadata.ItemType.SharedFeat, ]; #endregion /// /// Constructor designed for casting a base DatFile /// /// Parent DatFile to copy from public SoftwareList(DatFile? datFile) : base(datFile) { Header.DatFormat = DatFormat.SoftwareList; } /// protected internal override List? GetMissingRequiredFields(DatItem datItem) { List missingFields = []; switch (datItem) { case DipSwitch dipSwitch: if (string.IsNullOrEmpty(dipSwitch.PartName)) missingFields.Add(nameof(Data.Models.Metadata.Part.Name)); if (string.IsNullOrEmpty(dipSwitch.PartInterface)) missingFields.Add(nameof(Data.Models.Metadata.Part.Interface)); if (string.IsNullOrEmpty(dipSwitch.Name)) missingFields.Add(nameof(Data.Models.Metadata.DipSwitch.Name)); if (string.IsNullOrEmpty(dipSwitch.Tag)) missingFields.Add(nameof(Data.Models.Metadata.DipSwitch.Tag)); if (string.IsNullOrEmpty(dipSwitch.Mask)) missingFields.Add(nameof(Data.Models.Metadata.DipSwitch.Mask)); if (dipSwitch.DipValueSpecified) { var dipValues = dipSwitch.DipValue; if (Array.Find(dipValues!, dv => string.IsNullOrEmpty(dv.Name)) is not null) missingFields.Add(nameof(Data.Models.Metadata.DipValue.Name)); if (Array.Find(dipValues!, dv => string.IsNullOrEmpty(dv.Value)) is not null) missingFields.Add(nameof(Data.Models.Metadata.DipValue.Value)); } break; case Disk disk: if (string.IsNullOrEmpty(disk.PartName)) missingFields.Add(nameof(Data.Models.Metadata.Part.Name)); if (string.IsNullOrEmpty(disk.PartInterface)) missingFields.Add(nameof(Data.Models.Metadata.Part.Interface)); if (disk.DiskAreaName is null) missingFields.Add(nameof(Data.Models.Metadata.DiskArea.Name)); if (string.IsNullOrEmpty(disk.Name)) missingFields.Add(nameof(Data.Models.Metadata.Disk.Name)); break; case Info info: if (string.IsNullOrEmpty(info.Name)) missingFields.Add(nameof(Data.Models.Metadata.Info.Name)); break; case Rom rom: if (string.IsNullOrEmpty(rom.PartName)) missingFields.Add(nameof(Data.Models.Metadata.Part.Name)); if (string.IsNullOrEmpty(rom.PartInterface)) missingFields.Add(nameof(Data.Models.Metadata.Part.Interface)); if (string.IsNullOrEmpty(rom.DataAreaName)) missingFields.Add(nameof(Data.Models.Metadata.DataArea.Name)); if (rom.DataAreaSize is null) missingFields.Add(nameof(Data.Models.Metadata.DataArea.Size)); break; case SharedFeat sharedFeat: if (string.IsNullOrEmpty(sharedFeat.Name)) missingFields.Add(nameof(Data.Models.Metadata.SharedFeat.Name)); break; default: // Item type is not supported break; } return missingFields; } } }