Add nested dir support for Logiqx, fix existing dir support

This commit is contained in:
Matt Nadareski
2025-07-27 20:48:49 -04:00
parent 48ecdff5f7
commit 29f1f63ef8
2 changed files with 50 additions and 20 deletions

View File

@@ -28,10 +28,11 @@ namespace SabreTools.Serialization.Test.CrossModel
Validate(newDf.Header);
Assert.NotNull(newDf.Game);
var newGame = Assert.Single(newDf.Game);
Validate(newGame);
Assert.Equal(2, newDf.Game.Length);
Validate(newDf.Game[0], nested: false);
Validate(newDf.Game[1], nested: true);
// TODO: Unsupported
// TODO: Unsupported for round-trip
Assert.Null(newDf.Dir);
}
@@ -59,10 +60,11 @@ namespace SabreTools.Serialization.Test.CrossModel
Validate(newDf.Header);
Assert.NotNull(newDf.Game);
var newGame = Assert.Single(newDf.Game);
Validate(newGame);
Assert.Equal(2, newDf.Game.Length);
Validate(newDf.Game[0], nested: false);
Validate(newDf.Game[1], nested: true);
// TODO: Unsupported
// TODO: Unsupported for round-trip
Assert.Null(newDf.Dir);
}
@@ -253,6 +255,18 @@ namespace SabreTools.Serialization.Test.CrossModel
gameBase.Driver = driver;
gameBase.SoftwareList = [softwarelist];
var subdir = new Models.Logiqx.Dir
{
Name = "XXXXXX",
Game = [gameBase],
};
var dir = new Models.Logiqx.Dir
{
Name = "XXXXXX",
Subdir = [subdir],
};
return new Models.Logiqx.Datafile
{
Build = "XXXXXX",
@@ -260,7 +274,7 @@ namespace SabreTools.Serialization.Test.CrossModel
SchemaLocation = "XXXXXX",
Header = header,
Game = [gameBase],
// Dir = [dir], // TODO: Unsupported
Dir = [dir],
};
}
@@ -317,10 +331,13 @@ namespace SabreTools.Serialization.Test.CrossModel
/// <summary>
/// Validate a GameBase
/// </summary>
private static void Validate(Models.Logiqx.GameBase? gb)
private static void Validate(Models.Logiqx.GameBase? gb, bool nested)
{
Assert.NotNull(gb);
Assert.Equal("XXXXXX", gb.Name);
if (nested)
Assert.Equal("XXXXXX\\XXXXXX\\XXXXXX", gb.Name);
else
Assert.Equal("XXXXXX", gb.Name);
Assert.Equal("XXXXXX", gb.SourceFile);
Assert.Equal("XXXXXX", gb.IsBios);
Assert.Equal("XXXXXX", gb.IsDevice);

View File

@@ -94,27 +94,40 @@ namespace SabreTools.Serialization.CrossModel
/// <summary>
/// Convert from <see cref="Models.Logiqx.Dir"/> to an array of <see cref="Models.Metadata.Machine"/>
/// </summary>
private static Models.Metadata.Machine[] ConvertDirToInternalModel(Dir item)
private static Models.Metadata.Machine[] ConvertDirToInternalModel(Dir item, string? parent = null)
{
if (item.Game == null || item.Game.Length == 0)
return [];
// Get the directory name
string? dirName = item.Name;
if (parent != null)
dirName = $"{parent}\\{item.Name}";
return Array.ConvertAll(item.Game, g =>
{
var machine = ConvertMachineToInternalModel(g);
machine[Models.Metadata.Machine.DirNameKey] = item.Name;
return machine;
});
// Handle machine items
Models.Metadata.Machine[] machines = [];
if (item.Game != null && item.Game.Length > 0)
machines = Array.ConvertAll(item.Game, g => ConvertMachineToInternalModel(g, dirName));
// Handle dir items
List<Models.Metadata.Machine> dirs = [];
foreach (var subdir in item.Subdir ?? [])
{
dirs.AddRange(ConvertDirToInternalModel(subdir, dirName));
}
return [.. machines, .. dirs];
}
/// <summary>
/// Convert from <see cref="Models.Logiqx.GameBase"/> to <see cref="Models.Metadata.Machine"/>
/// </summary>
private static Models.Metadata.Machine ConvertMachineToInternalModel(GameBase item)
private static Models.Metadata.Machine ConvertMachineToInternalModel(GameBase item, string? dir = null)
{
string? machineName = item.Name;
if (machineName != null && dir != null)
machineName = $"{dir}\\{machineName}";
var machine = new Models.Metadata.Machine
{
[Models.Metadata.Machine.NameKey] = item.Name,
[Models.Metadata.Machine.NameKey] = machineName,
[Models.Metadata.Machine.SourceFileKey] = item.SourceFile,
[Models.Metadata.Machine.IsBiosKey] = item.IsBios,
[Models.Metadata.Machine.IsDeviceKey] = item.IsDevice,