Skip to content

Commit 35bb5c9

Browse files
committed
Better GOG ID parsing
1 parent 3e52c15 commit 35bb5c9

File tree

4 files changed

+38
-22
lines changed

4 files changed

+38
-22
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com) and this p
1111
## [4.7.3](https://github.com/erri120/GameFinder/compare/v4.7.2...v4.7.3) - 2025-06-16
1212

1313
- Heroic: fix parser exception when `buildID` is empty
14+
- GOG: Better ID parsing
1415

1516
## [4.7.2](https://github.com/erri120/GameFinder/compare/v4.7.1...v4.7.2) - 2025-05-21
1617

src/GameFinder.StoreHandlers.GOG/GOGHandler.cs

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -97,15 +97,8 @@ private OneOf<GOGGame, ErrorMessage> ParseSubKey(IRegistryKey gogKey, string sub
9797
return new ErrorMessage($"Unable to open {gogKey}\\{subKeyName}");
9898
}
9999

100-
if (!subKey.TryGetString("gameID", out var sId))
101-
{
102-
return new ErrorMessage($"{subKey.GetName()} doesn't have a string value \"gameID\"");
103-
}
104-
105-
if (!long.TryParse(sId, NumberStyles.Integer, CultureInfo.InvariantCulture, out var id))
106-
{
107-
return new ErrorMessage($"The value \"gameID\" of {subKey.GetName()} is not a number: \"{sId}\"");
108-
}
100+
var idResult = GetId(subKey, subKeyName);
101+
if (idResult.IsT1) return idResult.AsT1;
109102

110103
if (!subKey.TryGetString("gameName", out var name))
111104
{
@@ -128,7 +121,7 @@ private OneOf<GOGGame, ErrorMessage> ParseSubKey(IRegistryKey gogKey, string sub
128121
}
129122

130123
var game = new GOGGame(
131-
GOGGameId.From(id),
124+
GOGGameId.From(idResult.AsT0),
132125
name,
133126
_fileSystem.FromUnsanitizedFullPath(path),
134127
buildId
@@ -141,4 +134,37 @@ private OneOf<GOGGame, ErrorMessage> ParseSubKey(IRegistryKey gogKey, string sub
141134
return new ErrorMessage(e, $"Exception while parsing registry key {gogKey}\\{subKeyName}");
142135
}
143136
}
137+
138+
private static OneOf<long, ErrorMessage> GetId(IRegistryKey subKey, string subKeyName)
139+
{
140+
ErrorMessage? subKeyError = null;
141+
ErrorMessage? idError = null;
142+
143+
if (!long.TryParse(subKeyName, CultureInfo.InvariantCulture, out var subKeyId))
144+
{
145+
subKeyError = new ErrorMessage($"`{subKeyName}` of `{subKey.GetName()}` is not a number!");
146+
}
147+
148+
long id = -1;
149+
if (subKey.TryGetString("gameID", out var sID))
150+
{
151+
if (!long.TryParse(sID, CultureInfo.InvariantCulture, out id))
152+
{
153+
idError = new ErrorMessage($"The value \"gameID\" of {subKey.GetName()} is not a number: \"{sID}\"");
154+
}
155+
}
156+
else
157+
{
158+
idError = new ErrorMessage($"{subKey.GetName()} doesn't have a string value \"gameID\"");
159+
}
160+
161+
if (subKeyError.HasValue && idError.HasValue)
162+
{
163+
return new ErrorMessage($"{subKeyError.Value} | {idError.Value}");
164+
}
165+
166+
if (subKeyError.HasValue && !idError.HasValue) return id;
167+
if (!subKeyError.HasValue && idError.HasValue) return subKeyId;
168+
return id;
169+
}
144170
}

tests/GameFinder.StoreHandlers.GOG.Tests/Test_ShouldError_InvalidValues.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,6 @@ public void Test_ShouldError_InvalidGameId(IFileSystem fileSystem, InMemoryRegis
1616
invalidKey.AddValue("gameId", gameId);
1717

1818
var error = handler.ShouldOnlyBeOneError();
19-
error.Should().Be($"The value \"gameID\" of {invalidKey.GetName()} is not a number: \"{gameId}\"");
19+
error.Message.Should().EndWith($"The value \"gameID\" of {invalidKey.GetName()} is not a number: \"{gameId}\"");
2020
}
2121
}

tests/GameFinder.StoreHandlers.GOG.Tests/Test_ShouldError_MissingValues.cs

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,6 @@ namespace GameFinder.StoreHandlers.GOG.Tests;
88

99
public partial class GOGTests
1010
{
11-
[Theory, AutoFileSystem]
12-
public void Test_ShouldError_MissingGameId(IFileSystem fileSystem, InMemoryRegistry registry, string keyName)
13-
{
14-
var (handler, gogKey) = SetupHandler(fileSystem, registry);
15-
16-
var invalidKey = gogKey.AddSubKey(keyName);
17-
18-
var error = handler.ShouldOnlyBeOneError();
19-
error.Should().Be($"{invalidKey.GetName()} doesn't have a string value \"gameID\"");
20-
}
21-
2211
[Theory, AutoFileSystem]
2312
public void Test_ShouldError_MissingGameName(IFileSystem fileSystem, InMemoryRegistry registry, string keyName, long gameId)
2413
{

0 commit comments

Comments
 (0)