using System.Text.Json;
using System.Text.Json.Serialization;
namespace Content.Packaging;
///
/// Helper class for working with .deps.json files.
///
public sealed class DepsHandler
{
public readonly Dictionary Libraries = new();
public DepsHandler(DepsData data)
{
if (data.Targets.Count != 1)
throw new Exception("Expected exactly one target");
var target = data.Targets.Single().Value;
foreach (var (libNameAndVersion, libInfo) in target)
{
var split = libNameAndVersion.Split('/', 2);
Libraries.Add(split[0], libInfo);
}
}
public static DepsHandler Load(string depsFile)
{
using var f = File.OpenRead(depsFile);
var depsData = JsonSerializer.Deserialize(f) ?? throw new InvalidOperationException("Deps are null!");
return new DepsHandler(depsData);
}
public HashSet RecursiveGetLibrariesFrom(string start)
{
var found = new HashSet();
RecursiveAddLibraries(start, found);
return found;
}
private void RecursiveAddLibraries(string start, HashSet set)
{
if (!set.Add(start))
return;
var lib = Libraries[start];
if (lib.Dependencies == null)
return;
foreach (var dep in lib.Dependencies.Keys)
{
RecursiveAddLibraries(dep, set);
}
}
public sealed class DepsData
{
[JsonInclude, JsonPropertyName("targets")]
public required Dictionary> Targets;
}
public sealed class LibraryInfo
{
[JsonInclude, JsonPropertyName("dependencies")]
public Dictionary? Dependencies;
[JsonInclude, JsonPropertyName("runtime")]
public Dictionary? Runtime;
// Paths are like lib/netstandard2.0/JetBrains.Annotations.dll
public IEnumerable GetDllNames()
{
return Runtime == null ? [] : Runtime.Keys.Select(p => p.Split('/')[^1]);
}
}
}