using System; using System.Text.RegularExpressions; using SabreTools.Data.Extensions; using SabreTools.Data.Models.Metadata; using SabreTools.Text.Extensions; namespace SabreTools.Metadata.Filter { /// /// Represents a single filtering object /// /// TODO: Add ability to have a set of values that are accepted public class FilterObject { /// /// Item key associated with the filter /// public readonly FilterKey Key; /// /// Value to match in the filter /// public readonly string? Value; /// /// Operation on how to match the filter /// public readonly Operation Operation; public FilterObject(string? filterString) { if (!SplitFilterString(filterString, out var keyItem, out Operation operation, out var value)) throw new ArgumentException($"{nameof(filterString)} could not be parsed", nameof(filterString)); Key = new FilterKey(keyItem); Value = value; Operation = operation; } public FilterObject(string itemField, string? value, string? operation) { Key = new FilterKey(itemField); Value = value; Operation = GetOperation(operation); } public FilterObject(string itemField, string? value, Operation operation) { Key = new FilterKey(itemField); Value = value; Operation = operation; } #region Matching /// /// Determine if a object matches the key and value /// public bool Matches(object obj) { return Operation switch { Operation.Equals => MatchesEqual(obj), Operation.NotEquals => MatchesNotEqual(obj), Operation.GreaterThan => MatchesGreaterThan(obj), Operation.GreaterThanOrEqual => MatchesGreaterThanOrEqual(obj), Operation.LessThan => MatchesLessThan(obj), Operation.LessThanOrEqual => MatchesLessThanOrEqual(obj), Operation.NONE => false, _ => false, }; } /// /// Determines if a value matches exactly /// private bool MatchesEqual(object obj) { // Special case for machine type if (obj is Machine machine && string.Equals(Key.ItemName, "machine", StringComparison.OrdinalIgnoreCase) && string.Equals(Key.FieldName, "type", StringComparison.OrdinalIgnoreCase)) { return Value?.ToLowerInvariant() switch { "none" => machine.IsBios != true && machine.IsDevice != true && machine.IsMechanical != true, "bios" => machine.IsBios == true, "device" or "dev" => machine.IsDevice == true, "mechanical" or "mech" => machine.IsMechanical == true, _ => false, }; } // Process the check value if (!GetCheckValue(obj, Key.FieldName, out string? checkValue)) return string.IsNullOrEmpty(Value); // If a null value is expected if (checkValue is null) return string.IsNullOrEmpty(Value); // If we have both a potentally boolean check and value bool? checkValueBool = checkValue.AsYesNo(); bool? matchValueBool = Value.AsYesNo(); if (checkValueBool is not null && matchValueBool is not null) return checkValueBool == matchValueBool; // If we have both a potentially numeric check and value if (NumberHelper.IsNumeric(checkValue) && NumberHelper.IsNumeric(Value)) { // Check Int64 values long? checkValueLong = NumberHelper.ConvertToInt64(checkValue); long? matchValueLong = NumberHelper.ConvertToInt64(Value); if (checkValueLong is not null && matchValueLong is not null) return checkValueLong == matchValueLong; // Check Double values double? checkValueDouble = NumberHelper.ConvertToDouble(checkValue); double? matchValueDouble = NumberHelper.ConvertToDouble(Value); if (checkValueDouble is not null && matchValueDouble is not null) return checkValueDouble == matchValueDouble; } // If the value might contain valid Regex if (Value is not null && ContainsRegex(Value)) return Regex.IsMatch(checkValue, Value); return string.Equals(checkValue, Value, StringComparison.OrdinalIgnoreCase); } /// /// Determines if a value does not match exactly /// private bool MatchesNotEqual(object obj) { // Special case for machine type if (obj is Machine machine && string.Equals(Key.ItemName, "machine", StringComparison.OrdinalIgnoreCase) && string.Equals(Key.FieldName, "type", StringComparison.OrdinalIgnoreCase)) { return Value?.ToLowerInvariant() switch { "none" => machine.IsBios == true || machine.IsDevice == true || machine.IsMechanical == true, "bios" => machine.IsBios != true, "device" or "dev" => machine.IsDevice != true, "mechanical" or "mech" => machine.IsMechanical != true, _ => true, }; } // Process the check value if (!GetCheckValue(obj, Key.FieldName, out string? checkValue)) return string.IsNullOrEmpty(Value); // If a null value is expected if (checkValue is null) return !string.IsNullOrEmpty(Value); // If we have both a potentally boolean check and value bool? checkValueBool = checkValue.AsYesNo(); bool? matchValueBool = Value.AsYesNo(); if (checkValueBool is not null && matchValueBool is not null) return checkValueBool != matchValueBool; // If we have both a potentially numeric check and value if (NumberHelper.IsNumeric(checkValue) && NumberHelper.IsNumeric(Value)) { // Check Int64 values long? checkValueLong = NumberHelper.ConvertToInt64(checkValue); long? matchValueLong = NumberHelper.ConvertToInt64(Value); if (checkValueLong is not null && matchValueLong is not null) return checkValueLong != matchValueLong; // Check Double values double? checkValueDouble = NumberHelper.ConvertToDouble(checkValue); double? matchValueDouble = NumberHelper.ConvertToDouble(Value); if (checkValueDouble is not null && matchValueDouble is not null) return checkValueDouble != matchValueDouble; } // If the value might contain valid Regex if (Value is not null && ContainsRegex(Value)) return !Regex.IsMatch(checkValue, Value); return !string.Equals(checkValue, Value, StringComparison.OrdinalIgnoreCase); } /// /// Determines if a value is strictly greater than /// private bool MatchesGreaterThan(object obj) { // Process the check value if (!GetCheckValue(obj, Key.FieldName, out string? checkValue)) return string.IsNullOrEmpty(Value); // Null is always failure if (checkValue is null) return false; // If we have both a potentially numeric check and value if (NumberHelper.IsNumeric(checkValue) && NumberHelper.IsNumeric(Value)) { // Check Int64 values long? checkValueLong = NumberHelper.ConvertToInt64(checkValue); long? matchValueLong = NumberHelper.ConvertToInt64(Value); if (checkValueLong is not null && matchValueLong is not null) return checkValueLong > matchValueLong; // Check Double values double? checkValueDouble = NumberHelper.ConvertToDouble(checkValue); double? matchValueDouble = NumberHelper.ConvertToDouble(Value); if (checkValueDouble is not null && matchValueDouble is not null) return checkValueDouble > matchValueDouble; } return false; } /// /// Determines if a value is greater than or equal /// private bool MatchesGreaterThanOrEqual(object obj) { // Process the check value if (!GetCheckValue(obj, Key.FieldName, out string? checkValue)) return string.IsNullOrEmpty(Value); // Null is always failure if (checkValue is null) return false; // If we have both a potentially numeric check and value if (NumberHelper.IsNumeric(checkValue) && NumberHelper.IsNumeric(Value)) { // Check Int64 values long? checkValueLong = NumberHelper.ConvertToInt64(checkValue); long? matchValueLong = NumberHelper.ConvertToInt64(Value); if (checkValueLong is not null && matchValueLong is not null) return checkValueLong >= matchValueLong; // Check Double values double? checkValueDouble = NumberHelper.ConvertToDouble(checkValue); double? matchValueDouble = NumberHelper.ConvertToDouble(Value); if (checkValueDouble is not null && matchValueDouble is not null) return checkValueDouble >= matchValueDouble; } return false; } /// /// Determines if a value is strictly less than /// private bool MatchesLessThan(object obj) { // Process the check value if (!GetCheckValue(obj, Key.FieldName, out string? checkValue)) return string.IsNullOrEmpty(Value); // Null is always failure if (checkValue is null) return false; // If we have both a potentially numeric check and value if (NumberHelper.IsNumeric(checkValue) && NumberHelper.IsNumeric(Value)) { // Check Int64 values long? checkValueLong = NumberHelper.ConvertToInt64(checkValue); long? matchValueLong = NumberHelper.ConvertToInt64(Value); if (checkValueLong is not null && matchValueLong is not null) return checkValueLong < matchValueLong; // Check Double values double? checkValueDouble = NumberHelper.ConvertToDouble(checkValue); double? matchValueDouble = NumberHelper.ConvertToDouble(Value); if (checkValueDouble is not null && matchValueDouble is not null) return checkValueDouble < matchValueDouble; } return false; } /// /// Determines if a value is less than or equal /// private bool MatchesLessThanOrEqual(object obj) { // Process the check value if (!GetCheckValue(obj, Key.FieldName, out string? checkValue)) return string.IsNullOrEmpty(Value); // Null is always failure if (checkValue is null) return false; // If we have both a potentially numeric check and value if (NumberHelper.IsNumeric(checkValue) && NumberHelper.IsNumeric(Value)) { // Check Int64 values long? checkValueLong = NumberHelper.ConvertToInt64(checkValue); long? matchValueLong = NumberHelper.ConvertToInt64(Value); if (checkValueLong is not null && matchValueLong is not null) return checkValueLong <= matchValueLong; // Check Double values double? checkValueDouble = NumberHelper.ConvertToDouble(checkValue); double? matchValueDouble = NumberHelper.ConvertToDouble(Value); if (checkValueDouble is not null && matchValueDouble is not null) return checkValueDouble <= matchValueDouble; } return false; } #endregion #region Helpers /// /// Determine if a value may contain regex for matching /// /// /// If a value contains one of the following characters: /// ^ $ * ? + /// Then it will attempt to check if the value is regex or not. /// If none of those characters exist, then value will assumed /// not to be regex. /// private static bool ContainsRegex(string? value) { // If the value is missing, it can't be regex if (value is null) return false; // If we find a special character, try parsing as regex #if NETCOREAPP || NETSTANDARD2_1_OR_GREATER if (value.Contains('^') || value.Contains('$') || value.Contains('*') || value.Contains('?') || value.Contains('+')) #else if (value.Contains("^") || value.Contains("$") || value.Contains("*") || value.Contains("?") || value.Contains("+")) #endif { try { _ = new Regex(value); return true; } catch { return false; } } return false; } /// /// Get the check value for a field /// private static bool GetCheckValue(object obj, string fieldName, out string? checkValue) { // Special case for item type if (obj is DatItem datItem && string.Equals(fieldName, "type", StringComparison.OrdinalIgnoreCase)) { checkValue = datItem.ItemType.AsStringValue(); return true; } switch (obj) { case Adjuster item: return GetCheckValue(item, fieldName, out checkValue); case Archive item: return GetCheckValue(item, fieldName, out checkValue); case BiosSet item: return GetCheckValue(item, fieldName, out checkValue); case Chip item: return GetCheckValue(item, fieldName, out checkValue); case Configuration item: return GetCheckValue(item, fieldName, out checkValue); case ConfLocation item: return GetCheckValue(item, fieldName, out checkValue); case ConfSetting item: return GetCheckValue(item, fieldName, out checkValue); case Control item: return GetCheckValue(item, fieldName, out checkValue); case DataArea item: return GetCheckValue(item, fieldName, out checkValue); case Device item: return GetCheckValue(item, fieldName, out checkValue); case DeviceRef item: return GetCheckValue(item, fieldName, out checkValue); case DipLocation item: return GetCheckValue(item, fieldName, out checkValue); case DipSwitch item: return GetCheckValue(item, fieldName, out checkValue); case DipValue item: return GetCheckValue(item, fieldName, out checkValue); case Disk item: return GetCheckValue(item, fieldName, out checkValue); case DiskArea item: return GetCheckValue(item, fieldName, out checkValue); case Display item: return GetCheckValue(item, fieldName, out checkValue); case Driver item: return GetCheckValue(item, fieldName, out checkValue); case Feature item: return GetCheckValue(item, fieldName, out checkValue); case Header item: return GetCheckValue(item, fieldName, out checkValue); case Info item: return GetCheckValue(item, fieldName, out checkValue); case Input item: return GetCheckValue(item, fieldName, out checkValue); case Machine item: return GetCheckValue(item, fieldName, out checkValue); case Media item: return GetCheckValue(item, fieldName, out checkValue); case Original item: return GetCheckValue(item, fieldName, out checkValue); case Part item: return GetCheckValue(item, fieldName, out checkValue); case Port item: return GetCheckValue(item, fieldName, out checkValue); case RamOption item: return GetCheckValue(item, fieldName, out checkValue); case Release item: return GetCheckValue(item, fieldName, out checkValue); case ReleaseDetails item: return GetCheckValue(item, fieldName, out checkValue); case Rom item: return GetCheckValue(item, fieldName, out checkValue); case Sample item: return GetCheckValue(item, fieldName, out checkValue); case Serials item: return GetCheckValue(item, fieldName, out checkValue); case SharedFeat item: return GetCheckValue(item, fieldName, out checkValue); case Slot item: return GetCheckValue(item, fieldName, out checkValue); case SlotOption item: return GetCheckValue(item, fieldName, out checkValue); case SoftwareList item: return GetCheckValue(item, fieldName, out checkValue); case Sound item: return GetCheckValue(item, fieldName, out checkValue); case SourceDetails item: return GetCheckValue(item, fieldName, out checkValue); case Video item: return GetCheckValue(item, fieldName, out checkValue); // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Derive an operation from the input string, if possible /// private static Operation GetOperation(string? operation) { return operation?.ToLowerInvariant() switch { "=" => Operation.Equals, "=:" => Operation.Equals, "==" => Operation.Equals, ":" => Operation.Equals, "::" => Operation.Equals, ":=" => Operation.Equals, "!" => Operation.NotEquals, "!=" => Operation.NotEquals, "!:" => Operation.NotEquals, ">" => Operation.GreaterThan, ">:" => Operation.GreaterThanOrEqual, ">=" => Operation.GreaterThanOrEqual, "!<" => Operation.GreaterThanOrEqual, "<" => Operation.LessThan, "<:" => Operation.LessThanOrEqual, "<=" => Operation.LessThanOrEqual, "!>" => Operation.LessThanOrEqual, _ => Operation.NONE, }; } /// /// Derive a key, operation, and value from the input string, if possible /// private static bool SplitFilterString(string? filterString, out string? key, out Operation operation, out string? value) { // Set default values key = null; operation = Operation.NONE; value = null; if (string.IsNullOrEmpty(filterString)) return false; // Trim quotations, if necessary #if NETCOREAPP || NETSTANDARD2_1_OR_GREATER if (filterString!.StartsWith('\"')) filterString = filterString[1..^1]; #else if (filterString!.StartsWith("\"")) filterString = filterString.Substring(1, filterString.Length - 2); #endif // Split the string using regex var match = Regex.Match(filterString, @"^(?[a-zA-Z._]+)(?[=!:><]{1,2})(?.*)$", RegexOptions.Compiled); if (!match.Success) return false; key = match.Groups["itemField"].Value; operation = GetOperation(match.Groups["operation"].Value); // Only non-zero length values are counted as non-null if (match.Groups["value"]?.Value?.Length > 0) value = match.Groups["value"].Value; return true; } #endregion #region Per-Type Check Value Retrieval /// /// Get the check value for a field /// private static bool GetCheckValue(Adjuster obj, string fieldName, out string? checkValue) { switch (fieldName) { case "condition.mask": checkValue = obj.ConditionMask; return true; case "condition.relation": checkValue = obj.ConditionRelation?.AsStringValue(); return true; case "condition.tag": checkValue = obj.ConditionTag; return true; case "condition.value": checkValue = obj.ConditionValue; return true; case "default": checkValue = obj.Default.FromYesNo(); return true; case "name": checkValue = obj.Name; return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(Archive obj, string fieldName, out string? checkValue) { switch (fieldName) { case "additional": checkValue = obj.Additional; return true; case "adult": checkValue = obj.Adult is null ? null : (obj.Adult == true ? "1" : "0"); return true; case "alt": checkValue = obj.Alt is null ? null : (obj.Alt == true ? "1" : "0"); return true; case "bios": checkValue = obj.Bios is null ? null : (obj.Bios == true ? "1" : "0"); return true; case "categories": checkValue = obj.Categories; return true; case "clone": case "clonetag": checkValue = obj.CloneTag; return true; case "complete": checkValue = obj.Complete is null ? null : (obj.Complete == true ? "1" : "0"); return true; case "dat": checkValue = obj.Dat is null ? null : (obj.Dat == true ? "1" : "0"); return true; case "datternote": checkValue = obj.DatterNote; return true; case "description": checkValue = obj.Description; return true; case "devstatus": checkValue = obj.DevStatus; return true; case "gameid1": checkValue = obj.GameId1; return true; case "gameid2": checkValue = obj.GameId2; return true; case "langchecked": checkValue = obj.LangChecked; return true; case "languages": checkValue = obj.Languages; return true; case "licensed": checkValue = obj.Licensed is null ? null : (obj.Licensed == true ? "1" : "0"); return true; case "listed": checkValue = obj.Listed is null ? null : (obj.Listed == true ? "1" : "0"); return true; case "mergeof": checkValue = obj.MergeOf; return true; case "mergename": checkValue = obj.MergeName; return true; case "name": checkValue = obj.Name; return true; case "namealt": checkValue = obj.NameAlt; return true; case "number": checkValue = obj.Number; return true; case "physical": checkValue = obj.Physical is null ? null : (obj.Physical == true ? "1" : "0"); return true; case "pirate": checkValue = obj.Pirate is null ? null : (obj.Pirate == true ? "1" : "0"); return true; case "private": checkValue = obj.Private is null ? null : (obj.Private == true ? "1" : "0"); return true; case "region": checkValue = obj.Region; return true; case "regparent": checkValue = obj.RegParent; return true; case "showlang": checkValue = obj.ShowLang is null ? null : (obj.ShowLang == true ? "1" : "0"); return true; case "special1": checkValue = obj.Special1; return true; case "special2": checkValue = obj.Special2; return true; case "stickynote": checkValue = obj.StickyNote; return true; case "version1": checkValue = obj.Version1; return true; case "version2": checkValue = obj.Version2; return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(BiosSet obj, string fieldName, out string? checkValue) { switch (fieldName) { case "default": checkValue = obj.Default.FromYesNo(); return true; case "description": checkValue = obj.Description; return true; case "name": checkValue = obj.Name; return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(Chip obj, string fieldName, out string? checkValue) { switch (fieldName) { case "chiptype": checkValue = obj.ChipType?.AsStringValue(); return true; case "clock": checkValue = obj.Clock?.ToString(); return true; case "flags": checkValue = obj.Flags; return true; case "name": checkValue = obj.Name; return true; case "soundonly": checkValue = obj.SoundOnly.FromYesNo(); return true; case "tag": checkValue = obj.Tag; return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(Configuration obj, string fieldName, out string? checkValue) { switch (fieldName) { case "condition.mask": checkValue = obj.ConditionMask; return true; case "condition.relation": checkValue = obj.ConditionRelation?.AsStringValue(); return true; case "condition.tag": checkValue = obj.ConditionTag; return true; case "condition.value": checkValue = obj.ConditionValue; return true; case "mask": checkValue = obj.Mask; return true; case "name": checkValue = obj.Name; return true; case "tag": checkValue = obj.Tag; return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(ConfLocation obj, string fieldName, out string? checkValue) { switch (fieldName) { case "inverted": checkValue = obj.Inverted.FromYesNo(); return true; case "name": checkValue = obj.Name; return true; case "number": checkValue = obj.Number?.ToString(); return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(ConfSetting obj, string fieldName, out string? checkValue) { switch (fieldName) { case "condition.mask": checkValue = obj.ConditionMask; return true; case "condition.relation": checkValue = obj.ConditionRelation?.AsStringValue(); return true; case "condition.tag": checkValue = obj.ConditionTag; return true; case "condition.value": checkValue = obj.ConditionValue; return true; case "default": checkValue = obj.Default.FromYesNo(); return true; case "name": checkValue = obj.Name; return true; case "value": checkValue = obj.Value; return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(Control obj, string fieldName, out string? checkValue) { switch (fieldName) { case "buttons": checkValue = obj.Buttons?.ToString(); return true; case "controltype": checkValue = obj.ControlType?.AsStringValue(); return true; case "keydelta": checkValue = obj.KeyDelta?.ToString(); return true; case "maximum": checkValue = obj.Maximum?.ToString(); return true; case "minimum": checkValue = obj.Minimum?.ToString(); return true; case "player": checkValue = obj.Player?.ToString(); return true; case "reqbuttons": checkValue = obj.ReqButtons?.ToString(); return true; case "reverse": checkValue = obj.Reverse.FromYesNo(); return true; case "sensitivity": checkValue = obj.Sensitivity?.ToString(); return true; case "ways": checkValue = obj.Ways; return true; case "ways2": checkValue = obj.Ways2; return true; case "ways3": checkValue = obj.Ways3; return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(DataArea obj, string fieldName, out string? checkValue) { switch (fieldName) { case "endianness": checkValue = obj.Endianness?.AsStringValue(); return true; case "name": checkValue = obj.Name; return true; case "size": checkValue = obj.Size?.ToString(); return true; case "width": checkValue = obj.Width?.AsStringValue(); return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(Device obj, string fieldName, out string? checkValue) { switch (fieldName) { case "devicetype": checkValue = obj.DeviceType?.AsStringValue(); return true; // TODO: Figure out how to deal with string arrays // case "extension.name": // checkValue = obj.ExtensionName; // return true; case "fixedimage": checkValue = obj.FixedImage; return true; case "instance.briefname": checkValue = obj.InstanceBriefName; return true; case "instance.name": checkValue = obj.InstanceName; return true; case "interface": checkValue = obj.Interface; return true; case "mandatory": checkValue = obj.Mandatory.FromYesNo(); return true; case "tag": checkValue = obj.Tag; return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(DeviceRef obj, string fieldName, out string? checkValue) { switch (fieldName) { case "name": checkValue = obj.Name; return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(DipLocation obj, string fieldName, out string? checkValue) { switch (fieldName) { case "inverted": checkValue = obj.Inverted.FromYesNo(); return true; case "name": checkValue = obj.Name; return true; case "number": checkValue = obj.Number?.ToString(); return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(DipSwitch obj, string fieldName, out string? checkValue) { switch (fieldName) { case "condition.mask": checkValue = obj.ConditionMask; return true; case "condition.relation": checkValue = obj.ConditionRelation?.AsStringValue(); return true; case "condition.tag": checkValue = obj.ConditionTag; return true; case "condition.value": checkValue = obj.ConditionValue; return true; case "default": checkValue = obj.Default.FromYesNo(); return true; case "mask": checkValue = obj.Mask; return true; case "name": checkValue = obj.Name; return true; case "tag": checkValue = obj.Tag; return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(DipValue obj, string fieldName, out string? checkValue) { switch (fieldName) { case "condition.mask": checkValue = obj.ConditionMask; return true; case "condition.relation": checkValue = obj.ConditionRelation?.AsStringValue(); return true; case "condition.tag": checkValue = obj.ConditionTag; return true; case "condition.value": checkValue = obj.ConditionValue; return true; case "default": checkValue = obj.Default.FromYesNo(); return true; case "name": checkValue = obj.Name; return true; case "value": checkValue = obj.Value; return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(Disk obj, string fieldName, out string? checkValue) { switch (fieldName) { case "flags": checkValue = obj.Flags; return true; case "index": checkValue = obj.Index?.ToString(); return true; case "md5": checkValue = obj.MD5; return true; case "merge": checkValue = obj.Merge; return true; case "name": checkValue = obj.Name; return true; case "optional": checkValue = obj.Optional.FromYesNo(); return true; case "region": checkValue = obj.Region; return true; case "sha1": checkValue = obj.SHA1; return true; case "status": checkValue = obj.Status?.AsStringValue(); return true; case "writable": checkValue = obj.Writable.FromYesNo(); return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(DiskArea obj, string fieldName, out string? checkValue) { switch (fieldName) { case "name": checkValue = obj.Name; return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(Display obj, string fieldName, out string? checkValue) { switch (fieldName) { case "aspectx": checkValue = obj.AspectX?.ToString(); return true; case "aspecty": checkValue = obj.AspectY?.ToString(); return true; case "displaytype": case "screen": checkValue = obj.DisplayType?.AsStringValue(); return true; case "flipx": checkValue = obj.FlipX.FromYesNo(); return true; case "hbend": checkValue = obj.HBEnd?.ToString(); return true; case "hbstart": checkValue = obj.HBStart?.ToString(); return true; case "height": case "y": checkValue = obj.Height?.ToString(); return true; case "htotal": checkValue = obj.HTotal?.ToString(); return true; case "pixclock": checkValue = obj.PixClock?.ToString(); return true; case "refresh": case "freq": checkValue = obj.Refresh?.ToString(); return true; case "rotate": case "orientation": checkValue = obj.Rotate?.AsStringValue(); return true; case "tag": checkValue = obj.Tag; return true; case "vbend": checkValue = obj.VBEnd?.ToString(); return true; case "vbstart": checkValue = obj.VBStart?.ToString(); return true; case "vtotal": checkValue = obj.VTotal?.ToString(); return true; case "width": case "x": checkValue = obj.Width?.ToString(); return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(Driver obj, string fieldName, out string? checkValue) { switch (fieldName) { case "blit": checkValue = obj.Blit?.AsStringValue(); return true; case "cocktail": checkValue = obj.Cocktail?.AsStringValue(); return true; case "color": checkValue = obj.Color?.AsStringValue(); return true; case "emulation": checkValue = obj.Emulation?.AsStringValue(); return true; case "incomplete": checkValue = obj.Incomplete.FromYesNo(); return true; case "nosoundhardware": checkValue = obj.NoSoundHardware.FromYesNo(); return true; case "palettesize": checkValue = obj.PaletteSize; return true; case "requiresartwork": checkValue = obj.RequiresArtwork.FromYesNo(); return true; case "savestate": checkValue = obj.SaveState?.AsStringValue(); return true; case "sound": checkValue = obj.Sound?.AsStringValue(); return true; case "status": checkValue = obj.Status?.AsStringValue(); return true; case "unofficial": checkValue = obj.Unofficial.FromYesNo(); return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(Feature obj, string fieldName, out string? checkValue) { switch (fieldName) { case "featuretype": checkValue = obj.FeatureType?.AsStringValue(); return true; case "name": checkValue = obj.Name; return true; case "overall": checkValue = obj.Overall?.AsStringValue(); return true; case "status": checkValue = obj.Status?.AsStringValue(); return true; case "value": checkValue = obj.Value; return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(Header obj, string fieldName, out string? checkValue) { switch (fieldName) { case "author": checkValue = obj.Author; return true; case "biosmode": checkValue = obj.BiosMode.AsStringValue(); return true; case "build": checkValue = obj.Build; return true; // Header.CanOpen is intentionally skipped case "category": checkValue = obj.Category; return true; case "comment": checkValue = obj.Comment; return true; case "date": checkValue = obj.Date; return true; case "datversion": checkValue = obj.DatVersion; return true; case "debug": checkValue = obj.Debug.FromYesNo(); return true; case "description": checkValue = obj.Description; return true; case "email": checkValue = obj.Email; return true; case "emulatorversion": checkValue = obj.EmulatorVersion; return true; case "filename": checkValue = obj.FileName; return true; case "forcemerging": checkValue = obj.ForceMerging.AsStringValue(); return true; case "forcenodump": checkValue = obj.ForceNodump.AsStringValue(); return true; case "forcepacking": checkValue = obj.ForcePacking.AsStringValue(); return true; case "forcezipping": checkValue = obj.ForceZipping.FromYesNo(); return true; // Header.HeaderRow is intentionally skipped case "header": case "headerskipper": case "skipper": checkValue = obj.HeaderSkipper; return true; case "homepage": checkValue = obj.Homepage; return true; case "id": checkValue = obj.Id; return true; // Header.Images is intentionally skipped case "imfolder": checkValue = obj.ImFolder; return true; // Header.Infos is intentionally skipped case "lockbiosmode": checkValue = obj.LockBiosMode.FromYesNo(); return true; case "lockrommode": checkValue = obj.LockRomMode.FromYesNo(); return true; case "locksamplemode": checkValue = obj.LockSampleMode.FromYesNo(); return true; case "mameconfig": checkValue = obj.MameConfig; return true; case "name": checkValue = obj.Name; return true; // Header.NewDat is intentionally skipped case "notes": checkValue = obj.Notes; return true; case "plugin": checkValue = obj.Plugin; return true; case "refname": checkValue = obj.RefName; return true; case "rommode": checkValue = obj.RomMode.AsStringValue(); return true; case "romtitle": checkValue = obj.RomTitle; return true; case "rootdir": checkValue = obj.RootDir; return true; case "samplemode": checkValue = obj.SampleMode.AsStringValue(); return true; case "schemalocation": checkValue = obj.SchemaLocation; return true; case "screenshotsheight": checkValue = obj.ScreenshotsHeight; return true; case "screenshotswidth": checkValue = obj.ScreenshotsWidth; return true; // Header.Search is intentionally skipped case "system": checkValue = obj.System; return true; case "timestamp": checkValue = obj.Timestamp; return true; case "type": checkValue = obj.Type; return true; case "url": checkValue = obj.Url; return true; case "version": checkValue = obj.Version; return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(Info obj, string fieldName, out string? checkValue) { switch (fieldName) { case "name": checkValue = obj.Name; return true; case "value": checkValue = obj.Value; return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(Input obj, string fieldName, out string? checkValue) { switch (fieldName) { case "buttons": checkValue = obj.Buttons?.ToString(); return true; case "coins": checkValue = obj.Coins?.ToString(); return true; case "control": case "controlattr": checkValue = obj.ControlAttr; return true; case "players": checkValue = obj.Players?.ToString(); return true; case "service": checkValue = obj.Service.FromYesNo(); return true; case "tilt": checkValue = obj.Tilt.FromYesNo(); return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(Machine obj, string fieldName, out string? checkValue) { switch (fieldName) { case "board": checkValue = obj.Board; return true; case "buttons": checkValue = obj.Buttons; return true; case "category": checkValue = obj.Category is null ? null : string.Join(", ", obj.Category); return true; case "cloneof": checkValue = obj.CloneOf; return true; case "cloneofid": checkValue = obj.CloneOfId; return true; case "comment": checkValue = obj.Comment is null ? null : string.Join(", ", obj.Comment); return true; case "company": checkValue = obj.Company; return true; case "control": checkValue = obj.Control; return true; case "crc": checkValue = obj.CRC; return true; case "country": checkValue = obj.Country; return true; case "description": checkValue = obj.Description; return true; case "developer": checkValue = obj.Developer; return true; case "dirname": checkValue = obj.DirName; return true; case "displaycount": checkValue = obj.DisplayCount; return true; case "displaytype": checkValue = obj.DisplayType; return true; case "duplicateid": checkValue = obj.DuplicateID; return true; case "emulator": checkValue = obj.Emulator; return true; case "enabled": checkValue = obj.Enabled; return true; case "extra": checkValue = obj.Extra; return true; case "favorite": checkValue = obj.Favorite; return true; case "genmsxid": checkValue = obj.GenMSXID; return true; case "genre": checkValue = obj.Genre; return true; case "hash": checkValue = obj.Hash; return true; case "history": checkValue = obj.History; return true; case "id": checkValue = obj.Id; return true; case "im1crc": checkValue = obj.Im1CRC; return true; case "im2crc": checkValue = obj.Im2CRC; return true; case "imagenumber": checkValue = obj.ImageNumber; return true; case "isbios": checkValue = obj.IsBios.FromYesNo(); return true; case "isdevice": checkValue = obj.IsDevice.FromYesNo(); return true; case "ismechanical": checkValue = obj.IsMechanical.FromYesNo(); return true; case "language": checkValue = obj.Language; return true; case "location": checkValue = obj.Location; return true; case "manufacturer": checkValue = obj.Manufacturer; return true; case "name": checkValue = obj.Name; return true; case "notes": checkValue = obj.Notes; return true; case "playedcount": checkValue = obj.PlayedCount; return true; case "playedtime": checkValue = obj.PlayedTime; return true; case "players": checkValue = obj.Players; return true; case "publisher": checkValue = obj.Publisher; return true; case "ratings": checkValue = obj.Ratings; return true; case "rebuildto": checkValue = obj.RebuildTo; return true; case "relatedto": checkValue = obj.RelatedTo; return true; case "releasenumber": checkValue = obj.ReleaseNumber; return true; case "romof": checkValue = obj.RomOf; return true; case "rotation": checkValue = obj.Rotation; return true; case "runnable": checkValue = obj.Runnable?.AsStringValue(); return true; case "sampleof": checkValue = obj.SampleOf; return true; case "savetype": checkValue = obj.SaveType; return true; case "score": checkValue = obj.Score; return true; case "source": checkValue = obj.Source; return true; case "sourcefile": checkValue = obj.SourceFile; return true; case "sourcerom": checkValue = obj.SourceRom; return true; case "status": checkValue = obj.Status; return true; case "subgenre": checkValue = obj.Subgenre; return true; case "supported": checkValue = obj.Supported?.AsStringValue(); return true; case "system": checkValue = obj.System; return true; case "tags": checkValue = obj.Tags; return true; case "titleid": checkValue = obj.TitleID; return true; case "url": checkValue = obj.Url; return true; case "year": checkValue = obj.Year; return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(Media obj, string fieldName, out string? checkValue) { switch (fieldName) { case "md5": checkValue = obj.MD5; return true; case "name": checkValue = obj.Name; return true; case "sha1": checkValue = obj.SHA1; return true; case "sha256": checkValue = obj.SHA256; return true; case "spamsum": checkValue = obj.SpamSum; return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(Original obj, string fieldName, out string? checkValue) { switch (fieldName) { case "content": checkValue = obj.Content; return true; case "value": checkValue = obj.Value.FromYesNo(); return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(Part obj, string fieldName, out string? checkValue) { switch (fieldName) { case "interface": checkValue = obj.Interface; return true; case "name": checkValue = obj.Name; return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(Port obj, string fieldName, out string? checkValue) { switch (fieldName) { // TODO: Figure out how to deal with string arrays // case "analog.mask": // checkValue = obj.AnalogMask; // return true; case "tag": checkValue = obj.Tag; return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(RamOption obj, string fieldName, out string? checkValue) { switch (fieldName) { case "content": checkValue = obj.Content; return true; case "default": checkValue = obj.Default.FromYesNo(); return true; case "name": checkValue = obj.Name; return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(Release obj, string fieldName, out string? checkValue) { switch (fieldName) { case "date": checkValue = obj.Date; return true; case "default": checkValue = obj.Default.FromYesNo(); return true; case "language": checkValue = obj.Language; return true; case "name": checkValue = obj.Name; return true; case "region": checkValue = obj.Region; return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(ReleaseDetails obj, string fieldName, out string? checkValue) { switch (fieldName) { case "appendtonumber": checkValue = obj.AppendToNumber; return true; case "archivename": checkValue = obj.ArchiveName; return true; case "category": checkValue = obj.Category; return true; case "comment": checkValue = obj.Comment; return true; case "date": checkValue = obj.Date; return true; case "dirname": checkValue = obj.DirName; return true; case "group": checkValue = obj.Group; return true; case "id": checkValue = obj.Id; return true; case "nfocrc": checkValue = obj.NfoCRC; return true; case "nfoname": checkValue = obj.NfoName; return true; case "nfosize": checkValue = obj.NfoSize; return true; case "origin": checkValue = obj.Origin; return true; case "originalformat": checkValue = obj.OriginalFormat; return true; case "region": checkValue = obj.Region; return true; case "rominfo": checkValue = obj.RomInfo; return true; case "tool": checkValue = obj.Tool; return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(Rom obj, string fieldName, out string? checkValue) { switch (fieldName) { case "album": checkValue = obj.Album; return true; case "alt_romname": case "altromname": checkValue = obj.AltRomname; return true; case "alt_title": case "alttitle": checkValue = obj.AltTitle; return true; case "artist": checkValue = obj.Artist; return true; case "asr_detected_lang": case "asrdetectedlang": checkValue = obj.ASRDetectedLang; return true; case "asr_detected_lang_conf": case "asrdetectedlangconf": checkValue = obj.ASRDetectedLangConf; return true; case "asr_transcribed_lang": case "asrtranscribedlang": checkValue = obj.ASRTranscribedLang; return true; case "bios": checkValue = obj.Bios; return true; case "bitrate": checkValue = obj.Bitrate; return true; case "btih": case "bittorrentmagnethash": checkValue = obj.BitTorrentMagnetHash; return true; case "cloth_cover_detection_module_version": case "clothcoverdetectionmoduleversion": checkValue = obj.ClothCoverDetectionModuleVersion; return true; case "collection-catalog-number": case "collectioncatalognumber": checkValue = obj.CollectionCatalogNumber; return true; case "comment": checkValue = obj.Comment; return true; case "crc16": checkValue = obj.CRC16; return true; case "crc": case "crc32": checkValue = obj.CRC32; return true; case "crc64": checkValue = obj.CRC64; return true; case "creator": checkValue = obj.Creator; return true; case "date": checkValue = obj.Date; return true; case "dispose": checkValue = obj.Dispose.FromYesNo(); return true; case "extension": checkValue = obj.Extension; return true; case "filecount": checkValue = obj.FileCount?.ToString(); return true; case "fileisavailable": checkValue = obj.FileIsAvailable.FromYesNo(); return true; case "flags": checkValue = obj.Flags; return true; case "format": checkValue = obj.Format; return true; case "header": checkValue = obj.Header; return true; case "height": checkValue = obj.Height; return true; case "hocr_char_to_word_hocr_version": case "hocrchartowordhocrversion": checkValue = obj.hOCRCharToWordhOCRVersion; return true; case "hocr_char_to_word_module_version": case "hocrchartowordmoduleversion": checkValue = obj.hOCRCharToWordModuleVersion; return true; case "hocr_fts_text_hocr_version": case "hocrftstexthocrversion": checkValue = obj.hOCRFtsTexthOCRVersion; return true; case "hocr_fts_text_module_version": case "hocrftstextmoduleversion": checkValue = obj.hOCRFtsTextModuleVersion; return true; case "hocr_pageindex_hocr_version": case "hocrpageindexhocrversion": checkValue = obj.hOCRPageIndexhOCRVersion; return true; case "hocr_pageindex_module_version": case "hocrpageindexmoduleversion": checkValue = obj.hOCRPageIndexModuleVersion; return true; case "inverted": checkValue = obj.Inverted.FromYesNo(); return true; case "mtime": case "lastmodifiedtime": checkValue = obj.LastModifiedTime; return true; case "length": checkValue = obj.Length; return true; case "loadflag": checkValue = obj.LoadFlag?.AsStringValue(); return true; case "matrix_number": case "matrixnumber": checkValue = obj.MatrixNumber; return true; case "md2": checkValue = obj.MD2; return true; case "md4": checkValue = obj.MD4; return true; case "md5": checkValue = obj.MD5; return true; case "mediatype": case "openmsxmediatype": checkValue = obj.OpenMSXMediaType?.AsStringValue(); return true; case "merge": checkValue = obj.Merge; return true; case "mia": checkValue = obj.MIA.FromYesNo(); return true; case "name": checkValue = obj.Name; return true; case "offset": checkValue = obj.Offset; return true; case "openmsxtype": checkValue = obj.OpenMSXType; return true; case "optional": checkValue = obj.Optional.FromYesNo(); return true; case "original": checkValue = obj.Original; return true; case "pdf_module_version": case "pdfmoduleversion": checkValue = obj.PDFModuleVersion; return true; case "preview-image": case "previewimage": checkValue = obj.PreviewImage; return true; case "publisher": checkValue = obj.Publisher; return true; case "region": checkValue = obj.Region; return true; case "remark": checkValue = obj.Remark; return true; case "ripemd128": checkValue = obj.RIPEMD128; return true; case "ripemd160": checkValue = obj.RIPEMD160; return true; case "rotation": checkValue = obj.Rotation; return true; case "serial": checkValue = obj.Serial; return true; case "sha1": checkValue = obj.SHA1; return true; case "sha256": checkValue = obj.SHA256; return true; case "sha384": checkValue = obj.SHA384; return true; case "sha512": checkValue = obj.SHA512; return true; case "size": checkValue = obj.Size?.ToString(); return true; case "soundonly": checkValue = obj.SoundOnly.FromYesNo(); return true; case "source": checkValue = obj.Source; return true; case "spamsum": checkValue = obj.SpamSum; return true; case "start": checkValue = obj.Start; return true; case "status": checkValue = obj.Status?.AsStringValue(); return true; case "summation": checkValue = obj.Summation; return true; case "ocr": case "tesseractocr": checkValue = obj.TesseractOCR; return true; case "ocr_converted": case "tesseractocrconverted": checkValue = obj.TesseractOCRConverted; return true; case "ocr_detected_lang": case "tesseractocrdetectedlang": checkValue = obj.TesseractOCRDetectedLang; return true; case "ocr_detected_lang_conf": case "tesseractocrdetectedlangconf": checkValue = obj.TesseractOCRDetectedLangConf; return true; case "ocr_detected_script": case "tesseractocrdetectedscript": checkValue = obj.TesseractOCRDetectedScript; return true; case "ocr_detected_script_conf": case "tesseractocrdetectedscriptconf": checkValue = obj.TesseractOCRDetectedScriptConf; return true; case "ocr_module_version": case "tesseractocrmoduleversion": checkValue = obj.TesseractOCRModuleVersion; return true; case "ocr_parameters": case "tesseractocrparameters": checkValue = obj.TesseractOCRParameters; return true; case "title": checkValue = obj.Title; return true; case "track": checkValue = obj.Track; return true; case "value": checkValue = obj.Value; return true; case "whisper_asr_module_version": case "whisperasrmoduleversion": checkValue = obj.WhisperASRModuleVersion; return true; case "whisper_model_hash": case "whispermodelhash": checkValue = obj.WhisperModelHash; return true; case "whisper_model_name": case "whispermodelname": checkValue = obj.WhisperModelName; return true; case "whisper_version": case "whisperversion": checkValue = obj.WhisperVersion; return true; case "width": checkValue = obj.Width; return true; case "word_conf_0_10": case "wordconfidenceinterval0to10": checkValue = obj.WordConfidenceInterval0To10; return true; case "word_conf_11_20": case "wordconfidenceinterval11to20": checkValue = obj.WordConfidenceInterval11To20; return true; case "word_conf_21_30": case "wordconfidenceinterval21to30": checkValue = obj.WordConfidenceInterval21To30; return true; case "word_conf_31_40": case "wordconfidenceinterval31to40": checkValue = obj.WordConfidenceInterval31To40; return true; case "word_conf_41_50": case "wordconfidenceinterval41to50": checkValue = obj.WordConfidenceInterval41To50; return true; case "word_conf_51_60": case "wordconfidenceinterval51to60": checkValue = obj.WordConfidenceInterval51To60; return true; case "word_conf_61_70": case "wordconfidenceinterval61to70": checkValue = obj.WordConfidenceInterval61To70; return true; case "word_conf_71_80": case "wordconfidenceinterval71to80": checkValue = obj.WordConfidenceInterval71To80; return true; case "word_conf_81_90": case "wordconfidenceinterval81to90": checkValue = obj.WordConfidenceInterval81To90; return true; case "word_conf_91_100": case "wordconfidenceinterval91to100": checkValue = obj.WordConfidenceInterval91To100; return true; case "xxhash364": checkValue = obj.xxHash364; return true; case "xxhash3128": checkValue = obj.xxHash3128; return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(Sample obj, string fieldName, out string? checkValue) { switch (fieldName) { case "name": checkValue = obj.Name; return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(Serials obj, string fieldName, out string? checkValue) { switch (fieldName) { case "boxbarcode": checkValue = obj.BoxBarcode; return true; case "boxserial": checkValue = obj.BoxSerial; return true; case "chipserial": checkValue = obj.ChipSerial; return true; case "digitalserial1": checkValue = obj.DigitalSerial1; return true; case "digitalserial2": checkValue = obj.DigitalSerial2; return true; case "lockoutserial": checkValue = obj.LockoutSerial; return true; case "mediaserial1": checkValue = obj.MediaSerial1; return true; case "mediaserial2": checkValue = obj.MediaSerial2; return true; case "mediaserial3": checkValue = obj.MediaSerial3; return true; case "mediastamp": checkValue = obj.MediaStamp; return true; case "pcbserial": checkValue = obj.PCBSerial; return true; case "romchipserial1": checkValue = obj.RomChipSerial1; return true; case "romchipserial2": checkValue = obj.RomChipSerial2; return true; case "savechipserial": checkValue = obj.SaveChipSerial; return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(SharedFeat obj, string fieldName, out string? checkValue) { switch (fieldName) { case "name": checkValue = obj.Name; return true; case "value": checkValue = obj.Value; return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(Slot obj, string fieldName, out string? checkValue) { switch (fieldName) { case "name": checkValue = obj.Name; return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(SlotOption obj, string fieldName, out string? checkValue) { switch (fieldName) { case "default": checkValue = obj.Default.FromYesNo(); return true; case "devname": checkValue = obj.DevName; return true; case "name": checkValue = obj.Name; return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(SoftwareList obj, string fieldName, out string? checkValue) { switch (fieldName) { case "filter": checkValue = obj.Filter; return true; case "name": checkValue = obj.Name; return true; case "status": checkValue = obj.Status?.AsStringValue(); return true; case "tag": checkValue = obj.Tag; return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(Sound obj, string fieldName, out string? checkValue) { switch (fieldName) { case "channels": checkValue = obj.Channels?.ToString(); return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(SourceDetails obj, string fieldName, out string? checkValue) { switch (fieldName) { case "appendtonumber": checkValue = obj.AppendToNumber; return true; case "comment1": checkValue = obj.Comment1; return true; case "comment2": checkValue = obj.Comment2; return true; case "dumpdate": checkValue = obj.DumpDate; return true; case "dumpdateinfo": checkValue = obj.DumpDateInfo is null ? null : (obj.DumpDateInfo == true ? "1" : "0"); return true; case "dumper": checkValue = obj.Dumper; return true; case "id": checkValue = obj.Id; return true; case "link1": checkValue = obj.Link1; return true; case "link1public": checkValue = obj.Link1Public is null ? null : (obj.Link1Public == true ? "1" : "0"); return true; case "link2": checkValue = obj.Link2; return true; case "link2public": checkValue = obj.Link2Public is null ? null : (obj.Link2Public == true ? "1" : "0"); return true; case "link3": checkValue = obj.Link3; return true; case "link3public": checkValue = obj.Link3Public is null ? null : (obj.Link3Public == true ? "1" : "0"); return true; case "mediatitle": checkValue = obj.MediaTitle; return true; case "nodump": checkValue = obj.Nodump is null ? null : (obj.Nodump == true ? "1" : "0"); return true; case "origin": checkValue = obj.Origin; return true; case "originalformat": checkValue = obj.OriginalFormat; return true; case "project": checkValue = obj.Project; return true; case "region": checkValue = obj.Region; return true; case "releasedate": checkValue = obj.ReleaseDate; return true; case "releasedateinfo": checkValue = obj.ReleaseDateInfo is null ? null : (obj.ReleaseDateInfo == true ? "1" : "0"); return true; case "rominfo": checkValue = obj.RomInfo; return true; case "section": checkValue = obj.Section; return true; case "tool": checkValue = obj.Tool; return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } /// /// Get the check value for a field /// private static bool GetCheckValue(Video obj, string fieldName, out string? checkValue) { switch (fieldName) { case "aspectx": checkValue = obj.AspectX?.ToString(); return true; case "aspecty": checkValue = obj.AspectY?.ToString(); return true; case "height": case "y": checkValue = obj.Height?.ToString(); return true; case "orientation": case "rotate": checkValue = obj.Orientation?.AsStringValue(useSecond: true); return true; case "refresh": case "freq": checkValue = obj.Refresh?.ToString(); return true; case "displaytype": case "screen": checkValue = obj.Screen?.AsStringValue(); return true; case "width": case "x": checkValue = obj.Width?.ToString(); return true; // If the key doesn't exist, we count it as null default: checkValue = null; return false; } } #endregion } }