Dump status is the same, conceptually

This commit is contained in:
Matt Nadareski
2026-06-14 18:58:12 -04:00
parent dde1faf584
commit cbbedb1b2e
17 changed files with 208 additions and 440 deletions

View File

@@ -315,6 +315,117 @@ namespace SabreTools.RedumpLib.Test.Data
#endregion
#region Dump Status
/// <summary>
/// Check that every DumpStatus has a long name provided
/// </summary>
/// <param name="dumpStatus">DumpStatus value to check</param>
/// <param name="expectNull">True to expect a null value, false otherwise</param>
[Theory]
[MemberData(nameof(GenerateDumpStatusTestData))]
public void DumpStatus_LongName(DumpStatus? dumpStatus, bool expectNull)
{
var actual = dumpStatus.LongName();
if (expectNull)
Assert.Null(actual);
else
Assert.NotNull(actual);
}
/// <summary>
/// Check that every DumpStatus has a short name provided
/// </summary>
/// <param name="dumpStatus">DumpStatus value to check</param>
/// <param name="expectNull">True to expect a null value, false otherwise</param>
[Theory]
[MemberData(nameof(GenerateDumpStatusTestData))]
public void DumpStatus_ShortName(DumpStatus? dumpStatus, bool expectNull)
{
var actual = dumpStatus.ShortName();
if (expectNull)
Assert.Null(actual);
else
Assert.NotNull(actual);
}
/// <summary>
/// Ensure that every DumpStatus that has a short name that is unique
/// </summary>
[Fact]
public void DumpStatus_ShortName_NoDuplicates()
{
var fullDumpStatuses = Enum.GetValues<DumpStatus>().Cast<DumpStatus>().ToList();
var filteredDumpStatuses = new Dictionary<string, DumpStatus?>();
int totalCount = 0;
foreach (DumpStatus? dumpStatus in fullDumpStatuses)
{
var code = dumpStatus.ShortName();
if (string.IsNullOrEmpty(code))
continue;
// Throw if the code already exists
if (filteredDumpStatuses.ContainsKey(code))
throw new DuplicateNameException($"Code {code} already in dictionary");
filteredDumpStatuses[code] = dumpStatus;
totalCount++;
}
Assert.Equal(totalCount, filteredDumpStatuses.Count);
}
/// <summary>
/// Check that every DumpStatus can be mapped from a string
/// </summary>
/// <param name="dumpStatus">DumpStatus value to check</param>
/// <param name="expectNull">True to expect a null value, false otherwise</param>
[Theory]
[MemberData(nameof(GenerateDumpStatusTestData))]
public void DumpStatus_ToDumpStatus(DumpStatus? dumpStatus, bool expectNull)
{
string? longName = dumpStatus.LongName();
string? longNameSpaceless = longName?.Replace(" ", string.Empty);
string? possibleInteger = $"{(int?)dumpStatus}";
var actualNormal = longName.ToDumpStatus();
var actualSpaceless = longNameSpaceless.ToDumpStatus();
var actualInteger = possibleInteger.ToDumpStatus();
if (expectNull)
{
Assert.Null(actualNormal);
Assert.Null(actualSpaceless);
Assert.Null(actualInteger);
}
else
{
Assert.Equal(dumpStatus, actualNormal);
Assert.Equal(dumpStatus, actualSpaceless);
Assert.Equal(dumpStatus, actualInteger);
}
}
/// <summary>
/// Generate a test set of DumpStatus values
/// </summary>
/// <returns>MemberData-compatible list of DumpStatus values</returns>
public static TheoryData<DumpStatus?, bool> GenerateDumpStatusTestData()
{
var testData = new TheoryData<DumpStatus?, bool>() { { null, true } };
foreach (DumpStatus? dumpStatus in Enum.GetValues<DumpStatus>().Cast<DumpStatus?>())
{
testData.Add(dumpStatus, false);
}
return testData;
}
#endregion
#region Language
/// <summary>

View File

@@ -1,124 +0,0 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using SabreTools.RedumpLib.Data;
using SabreTools.RedumpLib.RedumpInfo.Data;
using Xunit;
namespace SabreTools.RedumpLib.Test.RedumpInfo
{
public class ExtensionsTests
{
#region Dump Status
/// <summary>
/// Check that every DumpStatus has a long name provided
/// </summary>
/// <param name="dumpStatus">DumpStatus value to check</param>
/// <param name="expectNull">True to expect a null value, false otherwise</param>
[Theory]
[MemberData(nameof(GenerateDumpStatusTestData))]
public void DumpStatus_LongName(DumpStatus? dumpStatus, bool expectNull)
{
var actual = dumpStatus.LongName();
if (expectNull)
Assert.Null(actual);
else
Assert.NotNull(actual);
}
/// <summary>
/// Check that every DumpStatus has a short name provided
/// </summary>
/// <param name="dumpStatus">DumpStatus value to check</param>
/// <param name="expectNull">True to expect a null value, false otherwise</param>
[Theory]
[MemberData(nameof(GenerateDumpStatusTestData))]
public void DumpStatus_ShortName(DumpStatus? dumpStatus, bool expectNull)
{
var actual = dumpStatus.ShortName();
if (expectNull)
Assert.Null(actual);
else
Assert.NotNull(actual);
}
/// <summary>
/// Ensure that every DumpStatus that has a short name that is unique
/// </summary>
[Fact]
public void DumpStatus_ShortName_NoDuplicates()
{
var fullDumpStatuses = Enum.GetValues<DumpStatus>().Cast<DumpStatus>().ToList();
var filteredDumpStatuses = new Dictionary<string, DumpStatus?>();
int totalCount = 0;
foreach (DumpStatus? dumpStatus in fullDumpStatuses)
{
var code = dumpStatus.ShortName();
if (string.IsNullOrEmpty(code))
continue;
// Throw if the code already exists
if (filteredDumpStatuses.ContainsKey(code))
throw new DuplicateNameException($"Code {code} already in dictionary");
filteredDumpStatuses[code] = dumpStatus;
totalCount++;
}
Assert.Equal(totalCount, filteredDumpStatuses.Count);
}
/// <summary>
/// Check that every DumpStatus can be mapped from a string
/// </summary>
/// <param name="dumpStatus">DumpStatus value to check</param>
/// <param name="expectNull">True to expect a null value, false otherwise</param>
[Theory]
[MemberData(nameof(GenerateDumpStatusTestData))]
public void DumpStatus_ToDumpStatus(DumpStatus? dumpStatus, bool expectNull)
{
string? longName = dumpStatus.LongName();
string? longNameSpaceless = longName?.Replace(" ", string.Empty);
string? possibleInteger = $"{(int?)dumpStatus}";
var actualNormal = longName.ToDumpStatus();
var actualSpaceless = longNameSpaceless.ToDumpStatus();
var actualInteger = possibleInteger.ToDumpStatus();
if (expectNull)
{
Assert.Null(actualNormal);
Assert.Null(actualSpaceless);
Assert.Null(actualInteger);
}
else
{
Assert.Equal(dumpStatus, actualNormal);
Assert.Equal(dumpStatus, actualSpaceless);
Assert.Equal(dumpStatus, actualInteger);
}
}
/// <summary>
/// Generate a test set of DumpStatus values
/// </summary>
/// <returns>MemberData-compatible list of DumpStatus values</returns>
public static TheoryData<DumpStatus?, bool> GenerateDumpStatusTestData()
{
var testData = new TheoryData<DumpStatus?, bool>() { { null, true } };
foreach (DumpStatus? dumpStatus in Enum.GetValues<DumpStatus>().Cast<DumpStatus?>())
{
testData.Add(dumpStatus, false);
}
return testData;
}
#endregion
}
}

View File

@@ -1,5 +1,4 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using SabreTools.RedumpLib.Data;
@@ -10,117 +9,6 @@ namespace SabreTools.RedumpLib.Test.RedumpOrg
{
public class ExtensionsTests
{
#region Dump Status
/// <summary>
/// Check that every DumpStatus has a long name provided
/// </summary>
/// <param name="dumpStatus">DumpStatus value to check</param>
/// <param name="expectNull">True to expect a null value, false otherwise</param>
[Theory]
[MemberData(nameof(GenerateDumpStatusTestData))]
public void DumpStatus_LongName(DumpStatus? dumpStatus, bool expectNull)
{
var actual = dumpStatus.LongName();
if (expectNull)
Assert.Null(actual);
else
Assert.NotNull(actual);
}
/// <summary>
/// Check that every DumpStatus has a short name provided
/// </summary>
/// <param name="dumpStatus">DumpStatus value to check</param>
/// <param name="expectNull">True to expect a null value, false otherwise</param>
[Theory]
[MemberData(nameof(GenerateDumpStatusTestData))]
public void DumpStatus_ShortName(DumpStatus? dumpStatus, bool expectNull)
{
var actual = dumpStatus.ShortName();
if (expectNull)
Assert.Null(actual);
else
Assert.NotNull(actual);
}
/// <summary>
/// Ensure that every DumpStatus that has a short name that is unique
/// </summary>
[Fact]
public void DumpStatus_ShortName_NoDuplicates()
{
var fullDumpStatuses = Enum.GetValues<DumpStatus>().Cast<DumpStatus>().ToList();
var filteredDumpStatuses = new Dictionary<string, DumpStatus?>();
int totalCount = 0;
foreach (DumpStatus? dumpStatus in fullDumpStatuses)
{
var code = dumpStatus.ShortName();
if (string.IsNullOrEmpty(code))
continue;
// Throw if the code already exists
if (filteredDumpStatuses.ContainsKey(code))
throw new DuplicateNameException($"Code {code} already in dictionary");
filteredDumpStatuses[code] = dumpStatus;
totalCount++;
}
Assert.Equal(totalCount, filteredDumpStatuses.Count);
}
/// <summary>
/// Check that every DumpStatus can be mapped from a string
/// </summary>
/// <param name="dumpStatus">DumpStatus value to check</param>
/// <param name="expectNull">True to expect a null value, false otherwise</param>
[Theory]
[MemberData(nameof(GenerateDumpStatusTestData))]
public void DumpStatus_ToDumpStatus(DumpStatus? dumpStatus, bool expectNull)
{
string? longName = dumpStatus.LongName();
string? longNameSpaceless = longName?.Replace(" ", string.Empty);
string? possibleInteger = $"{(int?)dumpStatus}";
var actualNormal = longName.ToDumpStatus();
var actualSpaceless = longNameSpaceless.ToDumpStatus();
var actualInteger = possibleInteger.ToDumpStatus();
if (expectNull)
{
Assert.Null(actualNormal);
Assert.Null(actualSpaceless);
Assert.Null(actualInteger);
}
else
{
Assert.Equal(dumpStatus, actualNormal);
Assert.Equal(dumpStatus, actualSpaceless);
Assert.Equal(dumpStatus, actualInteger);
}
}
/// <summary>
/// Generate a test set of DumpStatus values
/// </summary>
/// <returns>MemberData-compatible list of DumpStatus values</returns>
public static TheoryData<DumpStatus?, bool> GenerateDumpStatusTestData()
{
var testData = new TheoryData<DumpStatus?, bool>() { { null, true } };
foreach (DumpStatus? dumpStatus in Enum.GetValues<DumpStatus>().Cast<DumpStatus?>())
{
testData.Add(dumpStatus, false);
}
return testData;
}
#endregion
#region Language Selection
/// <summary>

View File

@@ -135,7 +135,7 @@ namespace SabreTools.RedumpLib.Test
DumpersAndStatus = new DumpersAndStatusSection()
{
Status = DumpStatus.TwoOrMoreGreen,
Status = DumpStatus.VerifiedGreen,
Dumpers = ["Dumper1", "Dumper2"],
OtherDumpers = "Dumper3",
},

View File

@@ -95,6 +95,32 @@ namespace SabreTools.RedumpLib.Data
WIP,
}
/// <summary>
/// Dump status
/// </summary>
public enum DumpStatus
{
// TODO: Verify new naming
[HumanReadable(LongName = "Unknown", ShortName = "grey")]
UnknownGrey = 1,
// TODO: Verify new naming
[HumanReadable(LongName = "Bad Dump", ShortName = "red")]
BadDumpRed = 2,
// Known as "Possible Bad Dump" on redump.org
[HumanReadable(LongName = "Questionable", ShortName = "yellow")]
QuestionableYellow = 3,
// Known as "Original Media" on redump.org
[HumanReadable(LongName = "Unverified", ShortName = "blue")]
UnverifiedBlue = 4,
// Known as "Two or More" on redump.org
[HumanReadable(LongName = "Verified", ShortName = "green")]
VerifiedGreen = 5,
}
/// <summary>
/// List of all disc langauges
/// </summary>

View File

@@ -998,6 +998,74 @@ namespace SabreTools.RedumpLib.Data
#endregion
#region Dump Status
/// <summary>
/// Get the human readable name for a DumpStatus
/// </summary>
/// <param name="dumpStatus"></param>
/// <returns></returns>
public static string? LongName(this DumpStatus dumpStatus)
=> AttributeHelper<DumpStatus>.GetHumanReadableAttribute(dumpStatus)?.LongName;
/// <summary>
/// Get the human readable name for a DumpStatus
/// </summary>
/// <param name="dumpStatus"></param>
/// <returns></returns>
public static string? LongName(this DumpStatus? dumpStatus)
=> AttributeHelper<DumpStatus?>.GetHumanReadableAttribute(dumpStatus)?.LongName;
/// <summary>
/// Get the URL path part for a DumpStatus
/// </summary>
/// <param name="dumpStatus"></param>
/// <returns></returns>
public static string? ShortName(this DumpStatus dumpStatus)
=> AttributeHelper<DumpStatus>.GetHumanReadableAttribute(dumpStatus)?.ShortName;
/// <summary>
/// Get the URL path part for a DumpStatus
/// </summary>
/// <param name="dumpStatus"></param>
/// <returns></returns>
public static string? ShortName(this DumpStatus? dumpStatus)
=> AttributeHelper<DumpStatus?>.GetHumanReadableAttribute(dumpStatus)?.ShortName;
/// <summary>
/// Get the Region enum value for a given string
/// </summary>
/// <param name="dumpStatus">String value to convert</param>
/// <returns>Region represented by the string, if possible</returns>
public static DumpStatus? ToDumpStatus(this string? dumpStatus)
{
// No value means no match
if (dumpStatus is null || dumpStatus.Length == 0)
return null;
dumpStatus = dumpStatus.ToLowerInvariant();
var dumpStatuses = (DumpStatus[])Enum.GetValues(typeof(DumpStatus));
// Check short names
int index = Array.FindIndex(dumpStatuses, s => dumpStatus == s.ShortName()?.ToLowerInvariant());
if (index > -1)
return dumpStatuses[index];
// Check long names
index = Array.FindIndex(dumpStatuses, s => dumpStatus == s.LongName()?.ToLowerInvariant()
|| dumpStatus == s.LongName()?.Replace(" ", string.Empty)?.ToLowerInvariant());
if (index > -1)
return dumpStatuses[index];
// Check numeric values
if (int.TryParse(dumpStatus, out int dumpStatusInt) && Enum.IsDefined(typeof(DumpStatus), dumpStatusInt))
return (DumpStatus)dumpStatusInt;
return null;
}
#endregion
#region Language
/// <summary>

View File

@@ -1,6 +1,5 @@
using System;
using Newtonsoft.Json;
using SabreTools.RedumpLib.RedumpOrg.Data;
namespace SabreTools.RedumpLib.Data.Sections
{

View File

@@ -10,7 +10,6 @@ using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using SabreTools.RedumpLib.Data;
using SabreTools.RedumpLib.RedumpInfo.Data;
using SabreTools.RedumpLib.Web;
using static SabreTools.RedumpLib.RedumpOrg.Data.Extensions;

View File

@@ -2,7 +2,6 @@ using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using SabreTools.RedumpLib.Data;
using SabreTools.RedumpLib.RedumpInfo.Data;
namespace SabreTools.RedumpLib.RedumpInfo.Converters
{

View File

@@ -2,7 +2,6 @@ using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using SabreTools.RedumpLib.Data;
using SabreTools.RedumpLib.RedumpInfo.Data;
namespace SabreTools.RedumpLib.RedumpInfo.Converters
{

View File

@@ -1,27 +0,0 @@
using SabreTools.RedumpLib.Attributes;
namespace SabreTools.RedumpLib.RedumpInfo.Data
{
/// <summary>
/// Dump status
/// </summary>
public enum DumpStatus
{
// TODO: Verify new naming
[HumanReadable(LongName = "Unknown", ShortName = "grey")]
UnknownGrey = 1,
// TODO: Verify new naming
[HumanReadable(LongName = "Bad Dump", ShortName = "red")]
BadDumpRed = 2,
[HumanReadable(LongName = "Questionable", ShortName = "yellow")]
Questionable,
[HumanReadable(LongName = "Unverified", ShortName = "blue")]
Unverified,
[HumanReadable(LongName = "Verified", ShortName = "green")]
Verified,
}
}

View File

@@ -1,79 +0,0 @@
using System;
using SabreTools.RedumpLib.Attributes;
namespace SabreTools.RedumpLib.RedumpInfo.Data
{
/// <summary>
/// Information pertaining to Redump systems
/// </summary>
public static class Extensions
{
#region Dump Status
/// <summary>
/// Get the human readable name for a DumpStatus
/// </summary>
/// <param name="dumpStatus"></param>
/// <returns></returns>
public static string? LongName(this DumpStatus dumpStatus)
=> AttributeHelper<DumpStatus>.GetHumanReadableAttribute(dumpStatus)?.LongName;
/// <summary>
/// Get the human readable name for a DumpStatus
/// </summary>
/// <param name="dumpStatus"></param>
/// <returns></returns>
public static string? LongName(this DumpStatus? dumpStatus)
=> AttributeHelper<DumpStatus?>.GetHumanReadableAttribute(dumpStatus)?.LongName;
/// <summary>
/// Get the URL path part for a DumpStatus
/// </summary>
/// <param name="dumpStatus"></param>
/// <returns></returns>
public static string? ShortName(this DumpStatus dumpStatus)
=> AttributeHelper<DumpStatus>.GetHumanReadableAttribute(dumpStatus)?.ShortName;
/// <summary>
/// Get the URL path part for a DumpStatus
/// </summary>
/// <param name="dumpStatus"></param>
/// <returns></returns>
public static string? ShortName(this DumpStatus? dumpStatus)
=> AttributeHelper<DumpStatus?>.GetHumanReadableAttribute(dumpStatus)?.ShortName;
/// <summary>
/// Get the Region enum value for a given string
/// </summary>
/// <param name="dumpStatus">String value to convert</param>
/// <returns>Region represented by the string, if possible</returns>
public static DumpStatus? ToDumpStatus(this string? dumpStatus)
{
// No value means no match
if (dumpStatus is null || dumpStatus.Length == 0)
return null;
dumpStatus = dumpStatus.ToLowerInvariant();
var dumpStatuses = (DumpStatus[])Enum.GetValues(typeof(DumpStatus));
// Check short names
int index = Array.FindIndex(dumpStatuses, s => dumpStatus == s.ShortName()?.ToLowerInvariant());
if (index > -1)
return dumpStatuses[index];
// Check long names
index = Array.FindIndex(dumpStatuses, s => dumpStatus == s.LongName()?.ToLowerInvariant()
|| dumpStatus == s.LongName()?.Replace(" ", string.Empty)?.ToLowerInvariant());
if (index > -1)
return dumpStatuses[index];
// Check numeric values
if (int.TryParse(dumpStatus, out int dumpStatusInt) && Enum.IsDefined(typeof(DumpStatus), dumpStatusInt))
return (DumpStatus)dumpStatusInt;
return null;
}
#endregion
}
}

View File

@@ -2,7 +2,6 @@ using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using SabreTools.RedumpLib.Data;
using SabreTools.RedumpLib.RedumpInfo.Data;
using SabreTools.RedumpLib.Web;
namespace SabreTools.RedumpLib.RedumpInfo

View File

@@ -1,7 +1,6 @@
using System;
using System.Text;
using SabreTools.RedumpLib.Data;
using SabreTools.RedumpLib.RedumpInfo.Data;
using static SabreTools.RedumpLib.RedumpOrg.Data.Extensions;
namespace SabreTools.RedumpLib.RedumpInfo
@@ -227,7 +226,7 @@ namespace SabreTools.RedumpLib.RedumpInfo
}
// Status
if (status is not null && status >= DumpStatus.UnknownGrey && status <= DumpStatus.Verified)
if (status is not null && status >= DumpStatus.UnknownGrey && status <= DumpStatus.VerifiedGreen)
sb.Append($"status={(int)status}&");
// System

View File

@@ -2,27 +2,6 @@ using SabreTools.RedumpLib.Attributes;
namespace SabreTools.RedumpLib.RedumpOrg.Data
{
/// <summary>
/// Dump status
/// </summary>
public enum DumpStatus
{
[HumanReadable(LongName = "Unknown", ShortName = "grey")]
UnknownGrey = 1,
[HumanReadable(LongName = "Bad Dump", ShortName = "red")]
BadDumpRed = 2,
[HumanReadable(LongName = "Possible Bad Dump", ShortName = "yellow")]
PossibleBadDumpYellow = 3,
[HumanReadable(LongName = "Original Media", ShortName = "blue")]
OriginalMediaBlue = 4,
[HumanReadable(LongName = "Two or More", ShortName = "green")]
TwoOrMoreGreen = 5,
}
/// <summary>
/// All possible language selections
/// </summary>

View File

@@ -10,74 +10,6 @@ namespace SabreTools.RedumpLib.RedumpOrg.Data
#pragma warning disable IDE0072
public static class Extensions
{
#region Dump Status
/// <summary>
/// Get the human readable name for a DumpStatus
/// </summary>
/// <param name="dumpStatus"></param>
/// <returns></returns>
public static string? LongName(this DumpStatus dumpStatus)
=> AttributeHelper<DumpStatus>.GetHumanReadableAttribute(dumpStatus)?.LongName;
/// <summary>
/// Get the human readable name for a DumpStatus
/// </summary>
/// <param name="dumpStatus"></param>
/// <returns></returns>
public static string? LongName(this DumpStatus? dumpStatus)
=> AttributeHelper<DumpStatus?>.GetHumanReadableAttribute(dumpStatus)?.LongName;
/// <summary>
/// Get the URL path part for a DumpStatus
/// </summary>
/// <param name="dumpStatus"></param>
/// <returns></returns>
public static string? ShortName(this DumpStatus dumpStatus)
=> AttributeHelper<DumpStatus>.GetHumanReadableAttribute(dumpStatus)?.ShortName;
/// <summary>
/// Get the URL path part for a DumpStatus
/// </summary>
/// <param name="dumpStatus"></param>
/// <returns></returns>
public static string? ShortName(this DumpStatus? dumpStatus)
=> AttributeHelper<DumpStatus?>.GetHumanReadableAttribute(dumpStatus)?.ShortName;
/// <summary>
/// Get the Region enum value for a given string
/// </summary>
/// <param name="dumpStatus">String value to convert</param>
/// <returns>Region represented by the string, if possible</returns>
public static DumpStatus? ToDumpStatus(this string? dumpStatus)
{
// No value means no match
if (dumpStatus is null || dumpStatus.Length == 0)
return null;
dumpStatus = dumpStatus.ToLowerInvariant();
var dumpStatuses = (DumpStatus[])Enum.GetValues(typeof(DumpStatus));
// Check short names
int index = Array.FindIndex(dumpStatuses, s => dumpStatus == s.ShortName()?.ToLowerInvariant());
if (index > -1)
return dumpStatuses[index];
// Check long names
index = Array.FindIndex(dumpStatuses, s => dumpStatus == s.LongName()?.ToLowerInvariant()
|| dumpStatus == s.LongName()?.Replace(" ", string.Empty)?.ToLowerInvariant());
if (index > -1)
return dumpStatuses[index];
// Check numeric values
if (int.TryParse(dumpStatus, out int dumpStatusInt) && Enum.IsDefined(typeof(DumpStatus), dumpStatusInt))
return (DumpStatus)dumpStatusInt;
return null;
}
#endregion
#region Language Selection
/// <summary>

View File

@@ -326,7 +326,7 @@ namespace SabreTools.RedumpLib.RedumpOrg
}
// Status
if (status is not null && status >= DumpStatus.UnknownGrey && status <= DumpStatus.TwoOrMoreGreen)
if (status is not null && status >= DumpStatus.UnknownGrey && status <= DumpStatus.VerifiedGreen)
sb.Append($"status/{(int)status}/");
// System / Disc Type Search