diff --git a/SabreTools.RedumpLib.Test/RedumpInfo/ExtensionsTests.cs b/SabreTools.RedumpLib.Test/RedumpInfo/ExtensionsTests.cs
index 326bec8..2562974 100644
--- a/SabreTools.RedumpLib.Test/RedumpInfo/ExtensionsTests.cs
+++ b/SabreTools.RedumpLib.Test/RedumpInfo/ExtensionsTests.cs
@@ -617,6 +617,113 @@ namespace SabreTools.RedumpLib.Test.RedumpInfo
#endregion
+ #region Region
+
+ ///
+ /// Check that every Region has a long name provided
+ ///
+ /// Region value to check
+ /// True to expect a null value, false otherwise
+ [Theory]
+ [MemberData(nameof(GenerateRegionTestData))]
+ public void Region_LongName(Region? region, bool expectNull)
+ {
+ var actual = region.LongName();
+
+ if (expectNull)
+ Assert.Null(actual);
+ else
+ Assert.NotNull(actual);
+ }
+
+ ///
+ /// Check that every Region has a short name provided
+ ///
+ /// Region value to check
+ /// True to expect a null value, false otherwise
+ [Theory]
+ [MemberData(nameof(GenerateRegionTestData))]
+ public void Region_ShortName(Region? region, bool expectNull)
+ {
+ var actual = region.ShortName();
+
+ if (expectNull)
+ Assert.Null(actual);
+ else
+ Assert.NotNull(actual);
+ }
+
+ ///
+ /// Ensure that every Region that has a short name that is unique
+ ///
+ [Fact]
+ public void Region_ShortName_NoDuplicates()
+ {
+ var fullRegions = Enum.GetValues().Cast().ToList();
+ var filteredRegions = new Dictionary();
+
+ int totalCount = 0;
+ foreach (Region? region in fullRegions)
+ {
+ var code = region.ShortName();
+ if (string.IsNullOrEmpty(code))
+ continue;
+
+ // Throw if the code already exists
+ if (filteredRegions.ContainsKey(code))
+ throw new DuplicateNameException($"Code {code} already in dictionary");
+
+ filteredRegions[code] = region;
+ totalCount++;
+ }
+
+ Assert.Equal(totalCount, filteredRegions.Count);
+ }
+
+ ///
+ /// Check that every Region can be mapped from a string
+ ///
+ /// Region value to check
+ /// True to expect a null value, false otherwise
+ [Theory]
+ [MemberData(nameof(GenerateRegionTestData))]
+ public void Region_ToRegion(Region? region, bool expectNull)
+ {
+ string? longName = region.LongName();
+ string? longNameSpaceless = longName?.Replace(" ", string.Empty);
+
+ var actualNormal = longName.ToRegion();
+ var actualSpaceless = longNameSpaceless.ToRegion();
+
+ if (expectNull)
+ {
+ Assert.Null(actualNormal);
+ Assert.Null(actualSpaceless);
+ }
+ else
+ {
+ Assert.Equal(region, actualNormal);
+ Assert.Equal(region, actualSpaceless);
+ }
+ }
+
+ ///
+ /// Generate a test set of Region values
+ ///
+ /// MemberData-compatible list of Region values
+ public static TheoryData GenerateRegionTestData()
+ {
+ var testData = new TheoryData() { { null, true } };
+ foreach (Region? region in Enum.GetValues().Cast())
+ {
+ testData.Add(region, false);
+ }
+
+ return testData;
+ }
+
+ #endregion
+
#region System
///
diff --git a/SabreTools.RedumpLib/RedumpInfo/Client.cs b/SabreTools.RedumpLib/RedumpInfo/Client.cs
index 92a352c..0a01d15 100644
--- a/SabreTools.RedumpLib/RedumpInfo/Client.cs
+++ b/SabreTools.RedumpLib/RedumpInfo/Client.cs
@@ -412,7 +412,7 @@ namespace SabreTools.RedumpLib.RedumpInfo
string? dumper = null,
string? edition = null,
string? quicksearch = null,
- RedumpOrg.Data.Region? region = null,
+ Region? region = null,
RedumpOrg.Data.SortCategory? sort = null,
RedumpOrg.Data.SortDirection? sortDir = null,
DumpStatus? status = null,
@@ -507,7 +507,7 @@ namespace SabreTools.RedumpLib.RedumpInfo
string? dumper = null,
string? edition = null,
string? quicksearch = null,
- RedumpOrg.Data.Region? region = null,
+ Region? region = null,
RedumpOrg.Data.SortCategory? sort = null,
RedumpOrg.Data.SortDirection? sortDir = null,
DumpStatus? status = null,
diff --git a/SabreTools.RedumpLib/RedumpInfo/Converters/RegionConverter.cs b/SabreTools.RedumpLib/RedumpInfo/Converters/RegionConverter.cs
new file mode 100644
index 0000000..4333be8
--- /dev/null
+++ b/SabreTools.RedumpLib/RedumpInfo/Converters/RegionConverter.cs
@@ -0,0 +1,35 @@
+using System;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using SabreTools.RedumpLib.RedumpInfo.Data;
+
+namespace SabreTools.RedumpLib.RedumpInfo.Converters
+{
+ ///
+ /// Serialize Region enum values
+ ///
+ public class RegionConverter : JsonConverter
+ {
+ public override bool CanRead { get { return true; } }
+
+ public override Region? ReadJson(JsonReader reader, Type objectType, Region? existingValue, bool hasExistingValue, JsonSerializer serializer)
+ {
+ // If we have a value already, don't overwrite it
+ if (hasExistingValue)
+ return existingValue;
+
+ // Read the value
+ if (reader.Value is not string value)
+ return null;
+
+ // Try to parse the value
+ return value.ToRegion();
+ }
+
+ public override void WriteJson(JsonWriter writer, Region? value, JsonSerializer serializer)
+ {
+ JToken t = JToken.FromObject(value.ShortName() ?? string.Empty);
+ t.WriteTo(writer);
+ }
+ }
+}
diff --git a/SabreTools.RedumpLib/RedumpInfo/Data/Enumerations.cs b/SabreTools.RedumpLib/RedumpInfo/Data/Enumerations.cs
index a82cc96..ab1ffc8 100644
--- a/SabreTools.RedumpLib/RedumpInfo/Data/Enumerations.cs
+++ b/SabreTools.RedumpLib/RedumpInfo/Data/Enumerations.cs
@@ -759,6 +759,944 @@ namespace SabreTools.RedumpLib.RedumpInfo.Data
#endregion
}
+ ///
+ /// List of all known regions
+ ///
+ ///
+ /// https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
+ ///
+ public enum Region
+ {
+ #region Aggregates - Redump Only
+
+ [HumanReadable(LongName = "Asia", ShortName = "xa")]
+ Asia,
+
+ [HumanReadable(LongName = "Europe", ShortName = "eu")]
+ Europe,
+
+ [HumanReadable(LongName = "Export", ShortName = "xp")]
+ Export,
+
+ [HumanReadable(LongName = "Latin America", ShortName = "xl")]
+ LatinAmerica,
+
+ [HumanReadable(LongName = "Scandinavia", ShortName = "xs")]
+ Scandinavia,
+
+ [HumanReadable(LongName = "World", ShortName = "un")]
+ World,
+
+ #endregion
+
+ #region A
+
+ [HumanReadable(LongName = "Afghanistan", ShortName = "af")]
+ Afghanistan,
+
+ [HumanReadable(LongName = "Åland Islands", ShortName = "ax")]
+ AlandIslands,
+
+ [HumanReadable(LongName = "Albania", ShortName = "al")]
+ Albania,
+
+ [HumanReadable(LongName = "Algeria", ShortName = "dz")]
+ Algeria,
+
+ [HumanReadable(LongName = "American Samoa", ShortName = "as")]
+ AmericanSamoa,
+
+ [HumanReadable(LongName = "Andorra", ShortName = "ad")]
+ Andorra,
+
+ [HumanReadable(LongName = "Angola", ShortName = "ao")]
+ Angola,
+
+ [HumanReadable(LongName = "Anguilla", ShortName = "ai")]
+ Anguilla,
+
+ [HumanReadable(LongName = "Antarctica", ShortName = "aq")]
+ Antarctica,
+
+ [HumanReadable(LongName = "Antigua and Barbuda", ShortName = "ag")]
+ AntiguaAndBarbuda,
+
+ [HumanReadable(LongName = "Argentina", ShortName = "ar")]
+ Argentina,
+
+ [HumanReadable(LongName = "Armenia", ShortName = "am")]
+ Armenia,
+
+ [HumanReadable(LongName = "Aruba", ShortName = "aw")]
+ Aruba,
+
+ [HumanReadable(LongName = "Ascension Island", ShortName = "ac")]
+ AscensionIsland,
+
+ [HumanReadable(LongName = "Australia", ShortName = "au")]
+ Australia,
+
+ [HumanReadable(LongName = "Austria", ShortName = "at")]
+ Austria,
+
+ [HumanReadable(LongName = "Azerbaijan", ShortName = "az")]
+ Azerbaijan,
+
+ #endregion
+
+ #region B
+
+ [HumanReadable(LongName = "Bahamas", ShortName = "bs")]
+ Bahamas,
+
+ [HumanReadable(LongName = "Bahrain", ShortName = "bh")]
+ Bahrain,
+
+ [HumanReadable(LongName = "Bangladesh", ShortName = "bd")]
+ Bangladesh,
+
+ [HumanReadable(LongName = "Barbados", ShortName = "bb")]
+ Barbados,
+
+ [HumanReadable(LongName = "Belarus", ShortName = "by")]
+ Belarus,
+
+ [HumanReadable(LongName = "Belgium", ShortName = "be")]
+ Belgium,
+
+ [HumanReadable(LongName = "Belize", ShortName = "bz")]
+ Belize,
+
+ [HumanReadable(LongName = "Benin", ShortName = "bj")]
+ Benin,
+
+ [HumanReadable(LongName = "Bermuda", ShortName = "bm")]
+ Bermuda,
+
+ [HumanReadable(LongName = "Bhutan", ShortName = "bt")]
+ Bhutan,
+
+ [HumanReadable(LongName = "Bolivia", ShortName = "bo")]
+ Bolivia,
+
+ [HumanReadable(LongName = "Bonaire, Sint Eustatius and Saba", ShortName = "bq")]
+ Bonaire,
+
+ [HumanReadable(LongName = "Bosnia and Herzegovina", ShortName = "ba")]
+ BosniaAndHerzegovina,
+
+ [HumanReadable(LongName = "Botswana", ShortName = "bw")]
+ Botswana,
+
+ [HumanReadable(LongName = "Bouvet Island", ShortName = "bv")]
+ BouvetIsland,
+
+ [HumanReadable(LongName = "Brazil", ShortName = "br")]
+ Brazil,
+
+ [HumanReadable(LongName = "British Indian Ocean Territory", ShortName = "io")]
+ BritishIndianOceanTerritory,
+
+ [HumanReadable(LongName = "Brunei Darussalam", ShortName = "bn")]
+ BruneiDarussalam,
+
+ [HumanReadable(LongName = "Bulgaria", ShortName = "bg")]
+ Bulgaria,
+
+ [HumanReadable(LongName = "Burkina Faso", ShortName = "bf")]
+ BurkinaFaso,
+
+ [HumanReadable(LongName = "Burundi", ShortName = "bi")]
+ Burundi,
+
+ #endregion
+
+ #region C
+
+ [HumanReadable(LongName = "Cabo Verde", ShortName = "cv")]
+ CaboVerde,
+
+ [HumanReadable(LongName = "Cambodia", ShortName = "kh")]
+ Cambodia,
+
+ [HumanReadable(LongName = "Cameroon", ShortName = "cm")]
+ Cameroon,
+
+ [HumanReadable(LongName = "Canada", ShortName = "ca")]
+ Canada,
+
+ [HumanReadable(LongName = "Canary Islands", ShortName = "ic")]
+ CanaryIslands,
+
+ [HumanReadable(LongName = "Cayman Islands", ShortName = "ky")]
+ CaymanIslands,
+
+ [HumanReadable(LongName = "Central African Republic", ShortName = "cf")]
+ CentralAfricanRepublic,
+
+ [HumanReadable(LongName = "Ceuta, Melilla", ShortName = "ea")]
+ CeutaMelilla,
+
+ [HumanReadable(LongName = "Chad", ShortName = "td")]
+ Chad,
+
+ [HumanReadable(LongName = "Chile", ShortName = "cl")]
+ Chile,
+
+ [HumanReadable(LongName = "China", ShortName = "cn")]
+ China,
+
+ [HumanReadable(LongName = "Christmas Island", ShortName = "cx")]
+ ChristmasIsland,
+
+ [HumanReadable(LongName = "Clipperton Island", ShortName = "cp")]
+ ClippertonIsland,
+
+ [HumanReadable(LongName = "Cocos (Keeling) Islands", ShortName = "cc")]
+ CocosIslands,
+
+ [HumanReadable(LongName = "Colombia", ShortName = "co")]
+ Colombia,
+
+ [HumanReadable(LongName = "Comoros", ShortName = "km")]
+ Comoros,
+
+ [HumanReadable(LongName = "Congo", ShortName = "cg")]
+ Congo,
+
+ [HumanReadable(LongName = "Cook Islands", ShortName = "ck")]
+ CookIslands,
+
+ [HumanReadable(LongName = "Costa Rica", ShortName = "cr")]
+ CostaRica,
+
+ [HumanReadable(LongName = "Côte d'Ivoire", ShortName = "ci")]
+ CoteDIvoire,
+
+ [HumanReadable(LongName = "Croatia", ShortName = "hr")]
+ Croatia,
+
+ [HumanReadable(LongName = "Cuba", ShortName = "cu")]
+ Cuba,
+
+ [HumanReadable(LongName = "Curaçao", ShortName = "cw")]
+ Curacao,
+
+ [HumanReadable(LongName = "Cyprus", ShortName = "cy")]
+ Cyprus,
+
+ [HumanReadable(LongName = "Czechia", ShortName = "cz")]
+ Czechia,
+
+ [HumanReadable(LongName = "Czechoslovakia", ShortName = "cs")]
+ Czechoslovakia,
+
+ #endregion
+
+ #region D
+
+ // Zaire was "Zr"
+ [HumanReadable(LongName = "Democratic Republic of the Congo (Zaire)", ShortName = "cd")]
+ DemocraticRepublicOfTheCongo,
+
+ [HumanReadable(LongName = "Denmark", ShortName = "dk")]
+ Denmark,
+
+ [HumanReadable(LongName = "Diego Garcia", ShortName = "dg")]
+ DiegoGarcia,
+
+ [HumanReadable(LongName = "Djibouti", ShortName = "dj")]
+ Djibouti,
+
+ [HumanReadable(LongName = "Dominica", ShortName = "dm")]
+ Dominica,
+
+ [HumanReadable(LongName = "Dominican Republic", ShortName = "do")]
+ DominicanRepublic,
+
+ #endregion
+
+ #region E
+
+ [HumanReadable(LongName = "Ecuador", ShortName = "ec")]
+ Ecuador,
+
+ [HumanReadable(LongName = "Egypt", ShortName = "eg")]
+ Egypt,
+
+ [HumanReadable(LongName = "El Salvador", ShortName = "sv")]
+ ElSalvador,
+
+ [HumanReadable(LongName = "Equatorial Guinea", ShortName = "gq")]
+ EquatorialGuinea,
+
+ [HumanReadable(LongName = "Eritrea", ShortName = "er")]
+ Eritrea,
+
+ [HumanReadable(LongName = "Estonia", ShortName = "ee")]
+ Estonia,
+
+ [HumanReadable(LongName = "Eswatini", ShortName = "sz")]
+ Eswatini,
+
+ [HumanReadable(LongName = "Ethiopia", ShortName = "et")]
+ Ethiopia,
+
+ // Commented out to avoid confusion
+ //[HumanReadable(LongName = "European Union", ShortName="eu")]
+ //EuropeanUnion,
+
+ // Commented out to avoid confusion
+ //[HumanReadable(LongName = "Eurozone", ShortName="ez")]
+ //Eurozone,
+
+ #endregion
+
+ #region F
+
+ [HumanReadable(LongName = "Falkland Islands (Malvinas)", ShortName = "fk")]
+ FalklandIslands,
+
+ [HumanReadable(LongName = "Faroe Islands", ShortName = "fo")]
+ FaroeIslands,
+
+ [HumanReadable(LongName = "Federated States of Micronesia", ShortName = "fm")]
+ FederatedStatesOfMicronesia,
+
+ [HumanReadable(LongName = "Fiji", ShortName = "fj")]
+ Fiji,
+
+ // Formerly "Sf"
+ [HumanReadable(LongName = "Finland", ShortName = "fi")]
+ Finland,
+
+ [HumanReadable(LongName = "France", ShortName = "fr")]
+ France,
+
+ // Commented out to avoid confusion
+ //[HumanReadable(LongName = "France, Metropolitan", ShortName="fx")]
+ //FranceMetropolitan,
+
+ [HumanReadable(LongName = "French Guiana", ShortName = "gf")]
+ FrenchGuiana,
+
+ [HumanReadable(LongName = "French Polynesia", ShortName = "pf")]
+ FrenchPolynesia,
+
+ [HumanReadable(LongName = "French Southern Territories", ShortName = "tf")]
+ FrenchSouthernTerritories,
+
+ #endregion
+
+ #region G
+
+ [HumanReadable(LongName = "Gabon", ShortName = "ga")]
+ Gabon,
+
+ [HumanReadable(LongName = "Gambia", ShortName = "gm")]
+ Gambia,
+
+ [HumanReadable(LongName = "Georgia", ShortName = "ge")]
+ Georgia,
+
+ [HumanReadable(LongName = "Germany", ShortName = "de")]
+ Germany,
+
+ [HumanReadable(LongName = "Ghana", ShortName = "gh")]
+ Ghana,
+
+ [HumanReadable(LongName = "Gibraltar", ShortName = "gi")]
+ Gibraltar,
+
+ [HumanReadable(LongName = "Greece", ShortName = "gr")]
+ Greece,
+
+ [HumanReadable(LongName = "Greenland", ShortName = "gl")]
+ Greenland,
+
+ [HumanReadable(LongName = "Grenada", ShortName = "gd")]
+ Grenada,
+
+ [HumanReadable(LongName = "Guadeloupe", ShortName = "gp")]
+ Guadeloupe,
+
+ [HumanReadable(LongName = "Guam", ShortName = "gu")]
+ Guam,
+
+ [HumanReadable(LongName = "Guatemala", ShortName = "gt")]
+ Guatemala,
+
+ [HumanReadable(LongName = "Guernsey", ShortName = "gg")]
+ Guernsey,
+
+ [HumanReadable(LongName = "Guinea", ShortName = "gn")]
+ Guinea,
+
+ [HumanReadable(LongName = "Guinea-Bissau", ShortName = "gw")]
+ GuineaBissau,
+
+ [HumanReadable(LongName = "Guyana", ShortName = "gy")]
+ Guyana,
+
+ #endregion
+
+ #region H
+
+ [HumanReadable(LongName = "Haiti", ShortName = "ht")]
+ Haiti,
+
+ [HumanReadable(LongName = "Heard Island and McDonald Islands", ShortName = "hm")]
+ HeardIslandAndMcDonaldIslands,
+
+ [HumanReadable(LongName = "Holy See (Vatican City)", ShortName = "va")]
+ HolySee,
+
+ [HumanReadable(LongName = "Honduras", ShortName = "hn")]
+ Honduras,
+
+ [HumanReadable(LongName = "Hong Kong", ShortName = "hk")]
+ HongKong,
+
+ [HumanReadable(LongName = "Hungary", ShortName = "hu")]
+ Hungary,
+
+ #endregion
+
+ #region I
+
+ [HumanReadable(LongName = "Iceland", ShortName = "is")]
+ Iceland,
+
+ [HumanReadable(LongName = "India", ShortName = "in")]
+ India,
+
+ [HumanReadable(LongName = "Indonesia", ShortName = "id")]
+ Indonesia,
+
+ [HumanReadable(LongName = "Iran", ShortName = "ir")]
+ Iran,
+
+ [HumanReadable(LongName = "Iraq", ShortName = "iq")]
+ Iraq,
+
+ [HumanReadable(LongName = "Ireland", ShortName = "ie")]
+ Ireland,
+
+ [HumanReadable(LongName = "Island of Sark", ShortName = "cq")]
+ IslandOfSark,
+
+ [HumanReadable(LongName = "Isle of Man", ShortName = "im")]
+ IsleOfMan,
+
+ [HumanReadable(LongName = "Israel", ShortName = "il")]
+ Israel,
+
+ [HumanReadable(LongName = "Italy", ShortName = "it")]
+ Italy,
+
+ #endregion
+
+ #region J
+
+ [HumanReadable(LongName = "Jamaica", ShortName = "jm")]
+ Jamaica,
+
+ [HumanReadable(LongName = "Japan", ShortName = "jp")]
+ Japan,
+
+ [HumanReadable(LongName = "Jersey", ShortName = "je")]
+ Jersey,
+
+ [HumanReadable(LongName = "Jordan", ShortName = "jo")]
+ Jordan,
+
+ #endregion
+
+ #region K
+
+ [HumanReadable(LongName = "Kazakhstan", ShortName = "kz")]
+ Kazakhstan,
+
+ [HumanReadable(LongName = "Kenya", ShortName = "ke")]
+ Kenya,
+
+ [HumanReadable(LongName = "Kiribati", ShortName = "ki")]
+ Kiribati,
+
+ [HumanReadable(LongName = "Korea (Democratic People's Republic of Korea)", ShortName = "kp")]
+ NorthKorea,
+
+ [HumanReadable(LongName = "Korea (Republic of Korea)", ShortName = "kr")]
+ SouthKorea,
+
+ [HumanReadable(LongName = "Kuwait", ShortName = "kw")]
+ Kuwait,
+
+ [HumanReadable(LongName = "Kyrgyzstan", ShortName = "kg")]
+ Kyrgyzstan,
+
+ #endregion
+
+ #region L
+
+ [HumanReadable(LongName = "(Laos) Lao People's Democratic Republic", ShortName = "la")]
+ Laos,
+
+ [HumanReadable(LongName = "Latvia", ShortName = "lv")]
+ Latvia,
+
+ [HumanReadable(LongName = "Lebanon", ShortName = "lb")]
+ Lebanon,
+
+ [HumanReadable(LongName = "Lesotho", ShortName = "ls")]
+ Lesotho,
+
+ [HumanReadable(LongName = "Liberia", ShortName = "lr")]
+ Liberia,
+
+ [HumanReadable(LongName = "Libya", ShortName = "ly")]
+ Libya,
+
+ [HumanReadable(LongName = "Liechtenstein", ShortName = "li")]
+ Liechtenstein,
+
+ [HumanReadable(LongName = "Lithuania", ShortName = "lt")]
+ Lithuania,
+
+ [HumanReadable(LongName = "Luxembourg", ShortName = "lu")]
+ Luxembourg,
+
+ #endregion
+
+ #region M
+
+ [HumanReadable(LongName = "Macao", ShortName = "mo")]
+ Macao,
+
+ [HumanReadable(LongName = "Madagascar", ShortName = "mg")]
+ Madagascar,
+
+ [HumanReadable(LongName = "Malawi", ShortName = "mw")]
+ Malawi,
+
+ [HumanReadable(LongName = "Malaysia", ShortName = "my")]
+ Malaysia,
+
+ [HumanReadable(LongName = "Maldives", ShortName = "mv")]
+ Maldives,
+
+ [HumanReadable(LongName = "Mali", ShortName = "ml")]
+ Mali,
+
+ [HumanReadable(LongName = "Malta", ShortName = "mt")]
+ Malta,
+
+ [HumanReadable(LongName = "Marshall Islands", ShortName = "mh")]
+ MarshallIslands,
+
+ [HumanReadable(LongName = "Martinique", ShortName = "mq")]
+ Martinique,
+
+ [HumanReadable(LongName = "Mauritania", ShortName = "mr")]
+ Mauritania,
+
+ [HumanReadable(LongName = "Mauritius", ShortName = "mu")]
+ Mauritius,
+
+ [HumanReadable(LongName = "Mayotte", ShortName = "yt")]
+ Mayotte,
+
+ [HumanReadable(LongName = "Mexico", ShortName = "mx")]
+ Mexico,
+
+ [HumanReadable(LongName = "Monaco", ShortName = "mc")]
+ Monaco,
+
+ [HumanReadable(LongName = "Mongolia", ShortName = "mn")]
+ Mongolia,
+
+ [HumanReadable(LongName = "Montenegro", ShortName = "me")]
+ Montenegro,
+
+ [HumanReadable(LongName = "Montserrat", ShortName = "ms")]
+ Montserrat,
+
+ [HumanReadable(LongName = "Morocco", ShortName = "ma")]
+ Morocco,
+
+ [HumanReadable(LongName = "Mozambique", ShortName = "mz")]
+ Mozambique,
+
+ // Burma was "Bu"
+ [HumanReadable(LongName = "Myanmar (Burma)", ShortName = "mm")]
+ Myanmar,
+
+ #endregion
+
+ #region N
+
+ [HumanReadable(LongName = "Namibia", ShortName = "na")]
+ Namibia,
+
+ [HumanReadable(LongName = "Nauru", ShortName = "nr")]
+ Nauru,
+
+ [HumanReadable(LongName = "Nepal", ShortName = "np")]
+ Nepal,
+
+ [HumanReadable(LongName = "Netherlands", ShortName = "nl")]
+ Netherlands,
+
+ [HumanReadable(LongName = "Netherlands Antilles", ShortName = "an")]
+ NetherlandsAntilles,
+
+ // Commented out to avoid confusion
+ //[HumanReadable(LongName = "Neutral Zone", ShortName="nt")]
+ //NeutralZone,
+
+ [HumanReadable(LongName = "New Caledonia", ShortName = "nc")]
+ NewCaledonia,
+
+ [HumanReadable(LongName = "New Zealand", ShortName = "nz")]
+ NewZealand,
+
+ [HumanReadable(LongName = "Nicaragua", ShortName = "ni")]
+ Nicaragua,
+
+ [HumanReadable(LongName = "Niger", ShortName = "ne")]
+ Niger,
+
+ [HumanReadable(LongName = "Nigeria", ShortName = "ng")]
+ Nigeria,
+
+ [HumanReadable(LongName = "Niue", ShortName = "nu")]
+ Niue,
+
+ [HumanReadable(LongName = "Norfolk Island", ShortName = "nf")]
+ NorfolkIsland,
+
+ [HumanReadable(LongName = "North Macedonia", ShortName = "mk")]
+ NorthMacedonia,
+
+ [HumanReadable(LongName = "Northern Mariana Islands", ShortName = "mp")]
+ NorthernMarianaIslands,
+
+ [HumanReadable(LongName = "Norway", ShortName = "no")]
+ Norway,
+
+ #endregion
+
+ #region O
+
+ [HumanReadable(LongName = "Oman", ShortName = "om")]
+ Oman,
+
+ #endregion
+
+ #region P
+
+ [HumanReadable(LongName = "Pakistan", ShortName = "pk")]
+ Pakistan,
+
+ [HumanReadable(LongName = "Palau", ShortName = "pw")]
+ Palau,
+
+ [HumanReadable(LongName = "Panama", ShortName = "pa")]
+ Panama,
+
+ [HumanReadable(LongName = "Papua New Guinea", ShortName = "pg")]
+ PapuaNewGuinea,
+
+ [HumanReadable(LongName = "Paraguay", ShortName = "py")]
+ Paraguay,
+
+ [HumanReadable(LongName = "Peru", ShortName = "pe")]
+ Peru,
+
+ [HumanReadable(LongName = "Philippines", ShortName = "ph")]
+ Philippines,
+
+ [HumanReadable(LongName = "Pitcairn", ShortName = "pn")]
+ Pitcairn,
+
+ [HumanReadable(LongName = "Poland", ShortName = "pl")]
+ Poland,
+
+ [HumanReadable(LongName = "Portugal", ShortName = "pt")]
+ Portugal,
+
+ [HumanReadable(LongName = "Puerto Rico", ShortName = "pr")]
+ PuertoRico,
+
+ #endregion
+
+ #region Q
+
+ [HumanReadable(LongName = "Qatar", ShortName = "qa")]
+ Qatar,
+
+ #endregion
+
+ #region R
+
+ [HumanReadable(LongName = "Republic of Moldova", ShortName = "md")]
+ RepublicOfMoldova,
+
+ [HumanReadable(LongName = "Réunion", ShortName = "re")]
+ Reunion,
+
+ [HumanReadable(LongName = "Romania", ShortName = "ro")]
+ Romania,
+
+ [HumanReadable(LongName = "Russian Federation", ShortName = "ru")]
+ RussianFederation,
+
+ [HumanReadable(LongName = "Rwanda", ShortName = "rw")]
+ Rwanda,
+
+ #endregion
+
+ #region S
+
+ [HumanReadable(LongName = "Saint Barthélemy", ShortName = "bl")]
+ SaintBarthelemy,
+
+ [HumanReadable(LongName = "Saint Helena, Ascension and Tristan da Cunha", ShortName = "sh")]
+ SaintHelena,
+
+ [HumanReadable(LongName = "Saint Kitts and Nevis", ShortName = "kn")]
+ SaintKittsAndNevis,
+
+ [HumanReadable(LongName = "Saint Lucia", ShortName = "lc")]
+ SaintLucia,
+
+ [HumanReadable(LongName = "Saint Martin", ShortName = "mf")]
+ SaintMartin,
+
+ [HumanReadable(LongName = "Saint Pierre and Miquelon", ShortName = "pm")]
+ SaintPierreAndMiquelon,
+
+ [HumanReadable(LongName = "Saint Vincent and the Grenadines", ShortName = "vc")]
+ SaintVincentAndTheGrenadines,
+
+ [HumanReadable(LongName = "Samoa", ShortName = "ws")]
+ Samoa,
+
+ [HumanReadable(LongName = "San Marino", ShortName = "sm")]
+ SanMarino,
+
+ [HumanReadable(LongName = "Sao Tome and Principe", ShortName = "st")]
+ SaoTomeAndPrincipe,
+
+ [HumanReadable(LongName = "Saudi Arabia", ShortName = "sa")]
+ SaudiArabia,
+
+ [HumanReadable(LongName = "Senegal", ShortName = "sn")]
+ Senegal,
+
+ [HumanReadable(LongName = "Serbia", ShortName = "rs")]
+ Serbia,
+
+ [HumanReadable(LongName = "Seychelles", ShortName = "sc")]
+ Seychelles,
+
+ [HumanReadable(LongName = "Sierra Leone", ShortName = "sl")]
+ SierraLeone,
+
+ [HumanReadable(LongName = "Singapore", ShortName = "sg")]
+ Singapore,
+
+ [HumanReadable(LongName = "Sint Maarten", ShortName = "sx")]
+ SintMaarten,
+
+ [HumanReadable(LongName = "Slovakia", ShortName = "sk")]
+ Slovakia,
+
+ [HumanReadable(LongName = "Slovenia", ShortName = "si")]
+ Slovenia,
+
+ [HumanReadable(LongName = "Solomon Islands", ShortName = "sb")]
+ SolomonIslands,
+
+ [HumanReadable(LongName = "Somalia", ShortName = "so")]
+ Somalia,
+
+ [HumanReadable(LongName = "South Africa", ShortName = "za")]
+ SouthAfrica,
+
+ [HumanReadable(LongName = "South Georgia and the South Sandwich Islands", ShortName = "gs")]
+ SouthGeorgia,
+
+ [HumanReadable(LongName = "South Sudan", ShortName = "ss")]
+ SouthSudan,
+
+ [HumanReadable(LongName = "Spain", ShortName = "es")]
+ Spain,
+
+ [HumanReadable(LongName = "Sri Lanka", ShortName = "lk")]
+ SriLanka,
+
+ [HumanReadable(LongName = "State of Palestine", ShortName = "ps")]
+ StateOfPalestine,
+
+ [HumanReadable(LongName = "Sudan", ShortName = "sd")]
+ Sudan,
+
+ [HumanReadable(LongName = "Suriname", ShortName = "sr")]
+ Suriname,
+
+ [HumanReadable(LongName = "Svalbard and Jan Mayen", ShortName = "sj")]
+ SvalbardAndJanMayen,
+
+ [HumanReadable(LongName = "Sweden", ShortName = "se")]
+ Sweden,
+
+ [HumanReadable(LongName = "Switzerland", ShortName = "ch")]
+ Switzerland,
+
+ [HumanReadable(LongName = "Syrian Arab Republic", ShortName = "sy")]
+ SyrianArabRepublic,
+
+ #endregion
+
+ #region T
+
+ [HumanReadable(LongName = "Taiwan", ShortName = "tw")]
+ Taiwan,
+
+ [HumanReadable(LongName = "Tajikistan", ShortName = "tj")]
+ Tajikistan,
+
+ [HumanReadable(LongName = "Thailand", ShortName = "th")]
+ Thailand,
+
+ // East Timor was "Tp"
+ [HumanReadable(LongName = "Timor-Leste (East Timor)", ShortName = "tl")]
+ TimorLeste,
+
+ [HumanReadable(LongName = "Togo", ShortName = "tg")]
+ Togo,
+
+ [HumanReadable(LongName = "Tokelau", ShortName = "tk")]
+ Tokelau,
+
+ [HumanReadable(LongName = "Tonga", ShortName = "to")]
+ Tonga,
+
+ [HumanReadable(LongName = "Trinidad and Tobago", ShortName = "tt")]
+ TrinidadAndTobago,
+
+ [HumanReadable(LongName = "Tristan da Cunha", ShortName = "ta")]
+ TristanDaCunha,
+
+ [HumanReadable(LongName = "Tunisia", ShortName = "tn")]
+ Tunisia,
+
+ [HumanReadable(LongName = "Turkey", ShortName = "tr")]
+ Turkey,
+
+ [HumanReadable(LongName = "Turkmenistan", ShortName = "tm")]
+ Turkmenistan,
+
+ [HumanReadable(LongName = "Turks and Caicos Islands", ShortName = "tc")]
+ TurksAndCaicosIslands,
+
+ [HumanReadable(LongName = "Tuvalu", ShortName = "tv")]
+ Tuvalu,
+
+ #endregion
+
+ #region U
+
+ [HumanReadable(LongName = "Uganda", ShortName = "ug")]
+ Uganda,
+
+ // Should be both "Gb" and "Uk"
+ // United Kingdom of Great Britain and Northern Ireland
+ [HumanReadable(LongName = "UK", ShortName = "gb")]
+ UnitedKingdom,
+
+ [HumanReadable(LongName = "Ukraine", ShortName = "ua")]
+ Ukraine,
+
+ [HumanReadable(LongName = "United Arab Emirates", ShortName = "ae")]
+ UnitedArabEmirates,
+
+ // Commented out to avoid confusion
+ //[HumanReadable(LongName = "United Nations", ShortName="un")]
+ //UnitedNations,
+
+ [HumanReadable(LongName = "United Republic of Tanzania", ShortName = "tz")]
+ UnitedRepublicOfTanzania,
+
+ [HumanReadable(LongName = "United States Minor Outlying Islands", ShortName = "um")]
+ UnitedStatesMinorOutlyingIslands,
+
+ [HumanReadable(LongName = "Uruguay", ShortName = "uy")]
+ Uruguay,
+
+ // United States of America
+ [HumanReadable(LongName = "USA", ShortName = "us")]
+ UnitedStatesOfAmerica,
+
+ [HumanReadable(LongName = "USSR", ShortName = "su")]
+ USSR,
+
+ [HumanReadable(LongName = "Uzbekistan", ShortName = "uz")]
+ Uzbekistan,
+
+ #endregion
+
+ #region V
+
+ [HumanReadable(LongName = "Vanuatu", ShortName = "vu")]
+ Vanuatu,
+
+ [HumanReadable(LongName = "Venezuela", ShortName = "ve")]
+ Venezuela,
+
+ [HumanReadable(LongName = "Viet Nam", ShortName = "vn")]
+ VietNam,
+
+ [HumanReadable(LongName = "Virgin Islands (British)", ShortName = "vg")]
+ BritishVirginIslands,
+
+ [HumanReadable(LongName = "Virgin Islands (US)", ShortName = "vi")]
+ USVirginIslands,
+
+ #endregion
+
+ #region W
+
+ [HumanReadable(LongName = "Wallis and Futuna", ShortName = "wf")]
+ WallisAndFutuna,
+
+ [HumanReadable(LongName = "Western Sahara", ShortName = "eh")]
+ WesternSahara,
+
+ #endregion
+
+ #region Y
+
+ [HumanReadable(LongName = "Yemen", ShortName = "ye")]
+ Yemen,
+
+ [HumanReadable(LongName = "Yugoslavia", ShortName = "yu")]
+ Yugoslavia,
+
+ #endregion
+
+ #region Z
+
+ [HumanReadable(LongName = "Zambia", ShortName = "zm")]
+ Zambia,
+
+ [HumanReadable(LongName = "Zimbabwe", ShortName = "zw")]
+ Zimbabwe,
+
+ #endregion
+ }
+
///
/// List of system categories
///
diff --git a/SabreTools.RedumpLib/RedumpInfo/Data/Extensions.cs b/SabreTools.RedumpLib/RedumpInfo/Data/Extensions.cs
index ea591c6..343f8dc 100644
--- a/SabreTools.RedumpLib/RedumpInfo/Data/Extensions.cs
+++ b/SabreTools.RedumpLib/RedumpInfo/Data/Extensions.cs
@@ -1194,6 +1194,70 @@ namespace SabreTools.RedumpLib.RedumpInfo.Data
#endregion
+ #region Region
+
+ ///
+ /// Get the Redump longnames for each known region
+ ///
+ ///
+ ///
+ public static string? LongName(this Region region)
+ => AttributeHelper.GetHumanReadableAttribute(region)?.LongName;
+
+ ///
+ /// Get the Redump longnames for each known region
+ ///
+ ///
+ ///
+ public static string? LongName(this Region? region)
+ => AttributeHelper.GetHumanReadableAttribute(region)?.LongName;
+
+ ///
+ /// Get the Redump shortnames for each known region
+ ///
+ ///
+ ///
+ public static string? ShortName(this Region region)
+ => AttributeHelper.GetHumanReadableAttribute(region)?.ShortName;
+
+ ///
+ /// Get the Redump shortnames for each known region
+ ///
+ ///
+ ///
+ public static string? ShortName(this Region? region)
+ => AttributeHelper.GetHumanReadableAttribute(region)?.ShortName;
+
+ ///
+ /// Get the Region enum value for a given string
+ ///
+ /// String value to convert
+ /// Region represented by the string, if possible
+ public static Region? ToRegion(this string? region)
+ {
+ // No value means no match
+ if (region is null || region.Length == 0)
+ return null;
+
+ region = region.ToLowerInvariant();
+ var redumpSystems = (Region[])Enum.GetValues(typeof(Region));
+
+ // Check short names
+ int index = Array.FindIndex(redumpSystems, s => region == s.ShortName()?.ToLowerInvariant());
+ if (index > -1)
+ return redumpSystems[index];
+
+ // Check long names
+ index = Array.FindIndex(redumpSystems, s => region == s.LongName()?.ToLowerInvariant()
+ || region == s.LongName()?.Replace(" ", string.Empty)?.ToLowerInvariant());
+ if (index > -1)
+ return redumpSystems[index];
+
+ return null;
+ }
+
+ #endregion
+
#region System
///
diff --git a/SabreTools.RedumpLib/RedumpInfo/Discs.cs b/SabreTools.RedumpLib/RedumpInfo/Discs.cs
index 990b417..493bc9b 100644
--- a/SabreTools.RedumpLib/RedumpInfo/Discs.cs
+++ b/SabreTools.RedumpLib/RedumpInfo/Discs.cs
@@ -34,7 +34,7 @@ namespace SabreTools.RedumpLib.RedumpInfo
string? dumper = null,
string? edition = null,
string? quicksearch = null,
- RedumpOrg.Data.Region? region = null,
+ Region? region = null,
RedumpOrg.Data.SortCategory? sort = null,
RedumpOrg.Data.SortDirection? sortDir = null,
DumpStatus? status = null,
@@ -159,7 +159,7 @@ namespace SabreTools.RedumpLib.RedumpInfo
string? dumper = null,
string? edition = null,
string? quicksearch = null,
- RedumpOrg.Data.Region? region = null,
+ Region? region = null,
RedumpOrg.Data.SortCategory? sort = null,
RedumpOrg.Data.SortDirection? sortDir = null,
DumpStatus? status = null,
diff --git a/SabreTools.RedumpLib/RedumpInfo/UrlBuilder.cs b/SabreTools.RedumpLib/RedumpInfo/UrlBuilder.cs
index 820d375..d873f98 100644
--- a/SabreTools.RedumpLib/RedumpInfo/UrlBuilder.cs
+++ b/SabreTools.RedumpLib/RedumpInfo/UrlBuilder.cs
@@ -142,7 +142,7 @@ namespace SabreTools.RedumpLib.RedumpInfo
string? dumper = null,
string? edition = null,
string? quicksearch = null,
- RedumpOrg.Data.Region? region = null,
+ Region? region = null,
RedumpOrg.Data.SortCategory? sort = null,
RedumpOrg.Data.SortDirection? sortDir = null,
DumpStatus? status = null,