Files
git.stella-ops.org/src/BinaryIndex/__Libraries/StellaOps.BinaryIndex.Disassembly/DisassemblyPluginRegistry.cs
StellaOps Bot ca578801fd save progress
2026-01-03 00:49:19 +02:00

79 lines
2.7 KiB
C#

// Copyright (c) StellaOps. All rights reserved.
// Licensed under AGPL-3.0-or-later. See LICENSE in the project root.
using Microsoft.Extensions.Logging;
namespace StellaOps.BinaryIndex.Disassembly;
/// <summary>
/// Default implementation of the disassembly plugin registry.
/// </summary>
public sealed class DisassemblyPluginRegistry : IDisassemblyPluginRegistry
{
private readonly ILogger<DisassemblyPluginRegistry> _logger;
private readonly List<IDisassemblyPlugin> _plugins;
/// <summary>
/// Creates a new plugin registry with the given plugins.
/// </summary>
/// <param name="plugins">The registered plugins.</param>
/// <param name="logger">Logger instance.</param>
public DisassemblyPluginRegistry(
IEnumerable<IDisassemblyPlugin> plugins,
ILogger<DisassemblyPluginRegistry> logger)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
_plugins = (plugins ?? throw new ArgumentNullException(nameof(plugins)))
.OrderByDescending(p => p.Capabilities.Priority)
.ToList();
_logger.LogInformation(
"Disassembly plugin registry initialized with {Count} plugins: {Plugins}",
_plugins.Count,
string.Join(", ", _plugins.Select(p => p.Capabilities.PluginId)));
}
/// <inheritdoc />
public IReadOnlyList<IDisassemblyPlugin> Plugins => _plugins;
/// <inheritdoc />
public IDisassemblyPlugin? FindPlugin(CpuArchitecture architecture, BinaryFormat format)
{
var plugin = _plugins.FirstOrDefault(p => p.Capabilities.CanHandle(architecture, format));
if (plugin != null)
{
_logger.LogDebug(
"Selected plugin {Plugin} for architecture {Arch} and format {Format}",
plugin.Capabilities.PluginId, architecture, format);
}
else
{
_logger.LogWarning(
"No plugin found for architecture {Arch} and format {Format}",
architecture, format);
}
return plugin;
}
/// <inheritdoc />
public IEnumerable<IDisassemblyPlugin> FindPluginsForArchitecture(CpuArchitecture architecture)
{
return _plugins.Where(p => p.Capabilities.SupportsArchitecture(architecture));
}
/// <inheritdoc />
public IEnumerable<IDisassemblyPlugin> FindPluginsForFormat(BinaryFormat format)
{
return _plugins.Where(p => p.Capabilities.SupportsFormat(format));
}
/// <inheritdoc />
public IDisassemblyPlugin? GetPlugin(string pluginId)
{
return _plugins.FirstOrDefault(p =>
p.Capabilities.PluginId.Equals(pluginId, StringComparison.OrdinalIgnoreCase));
}
}