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;
}
}
}