using System; using System.Collections.Generic; using SabreTools.DatItems; using SabreTools.DatItems.Formats; namespace SabreTools.DatFiles.Formats { /// /// Represents parsing and writing of a SoftwareList /// internal sealed class SoftwareList : SerializableDatFile { /// /// DTD for original MAME Software List DATs /// /// /// TODO: See if there's an updated DTD and then check for required fields /// private const string SoftwareListDTD = @" "; /// /// Constructor designed for casting a base DatFile /// /// Parent DatFile to copy from public SoftwareList(DatFile? datFile) : base(datFile) { } /// protected override ItemType[] GetSupportedTypes() { return [ ItemType.DipSwitch, ItemType.Disk, ItemType.Info, ItemType.PartFeature, ItemType.Rom, ItemType.SharedFeat, ]; } /// protected override List? GetMissingRequiredFields(DatItem datItem) { List missingFields = []; switch (datItem) { case DipSwitch dipSwitch: if (!dipSwitch.PartSpecified) { missingFields.Add(Models.Metadata.Part.NameKey); missingFields.Add(Models.Metadata.Part.InterfaceKey); } else { if (string.IsNullOrEmpty(dipSwitch.GetFieldValue(DipSwitch.PartKey)!.GetName())) missingFields.Add(Models.Metadata.Part.NameKey); if (string.IsNullOrEmpty(dipSwitch.GetFieldValue(DipSwitch.PartKey)!.GetStringFieldValue(Models.Metadata.Part.InterfaceKey))) missingFields.Add(Models.Metadata.Part.InterfaceKey); } if (string.IsNullOrEmpty(dipSwitch.GetName())) missingFields.Add(Models.Metadata.DipSwitch.NameKey); if (string.IsNullOrEmpty(dipSwitch.GetStringFieldValue(Models.Metadata.DipSwitch.TagKey))) missingFields.Add(Models.Metadata.DipSwitch.TagKey); if (string.IsNullOrEmpty(dipSwitch.GetStringFieldValue(Models.Metadata.DipSwitch.MaskKey))) missingFields.Add(Models.Metadata.DipSwitch.MaskKey); if (dipSwitch.ValuesSpecified) { var dipValues = dipSwitch.GetFieldValue(Models.Metadata.DipSwitch.DipValueKey); if (Array.Find(dipValues!, dv => string.IsNullOrEmpty(dv.GetName())) != null) missingFields.Add(Models.Metadata.DipValue.NameKey); if (Array.Find(dipValues!, dv => string.IsNullOrEmpty(dv.GetStringFieldValue(Models.Metadata.DipValue.ValueKey))) != null) missingFields.Add(Models.Metadata.DipValue.ValueKey); } break; case Disk disk: if (!disk.PartSpecified) { missingFields.Add(Models.Metadata.Part.NameKey); missingFields.Add(Models.Metadata.Part.InterfaceKey); } else { if (string.IsNullOrEmpty(disk.GetFieldValue(Disk.PartKey)!.GetName())) missingFields.Add(Models.Metadata.Part.NameKey); if (string.IsNullOrEmpty(disk.GetFieldValue(Disk.PartKey)!.GetStringFieldValue(Models.Metadata.Part.InterfaceKey))) missingFields.Add(Models.Metadata.Part.InterfaceKey); } if (!disk.DiskAreaSpecified) { missingFields.Add(Models.Metadata.DiskArea.NameKey); } else { if (string.IsNullOrEmpty(disk.GetFieldValue(Disk.DiskAreaKey)!.GetName())) missingFields.Add(Models.Metadata.DiskArea.NameKey); } if (string.IsNullOrEmpty(disk.GetName())) missingFields.Add(Models.Metadata.Disk.NameKey); break; case Info info: if (string.IsNullOrEmpty(info.GetName())) missingFields.Add(Models.Metadata.Info.NameKey); break; case Rom rom: if (!rom.PartSpecified) { missingFields.Add(Models.Metadata.Part.NameKey); missingFields.Add(Models.Metadata.Part.InterfaceKey); } else { if (string.IsNullOrEmpty(rom.GetFieldValue(Rom.PartKey)!.GetName())) missingFields.Add(Models.Metadata.Part.NameKey); if (string.IsNullOrEmpty(rom.GetFieldValue(Rom.PartKey)!.GetStringFieldValue(Models.Metadata.Part.InterfaceKey))) missingFields.Add(Models.Metadata.Part.InterfaceKey); } if (!rom.DataAreaSpecified) { missingFields.Add(Models.Metadata.DataArea.NameKey); missingFields.Add(Models.Metadata.DataArea.SizeKey); } else { if (string.IsNullOrEmpty(rom.GetFieldValue(Rom.DataAreaKey)!.GetName())) missingFields.Add(Models.Metadata.DataArea.NameKey); if (rom.GetFieldValue(Rom.DataAreaKey)!.GetInt64FieldValue(Models.Metadata.DataArea.SizeKey) == null) missingFields.Add(Models.Metadata.DataArea.SizeKey); } break; case SharedFeat sharedFeat: if (string.IsNullOrEmpty(sharedFeat.GetName())) missingFields.Add(Models.Metadata.SharedFeat.NameKey); break; default: // Unsupported ItemTypes should be caught already return null; } return missingFields; } } }