refactor(core): preserve exception in PluginDiscoveryResult + order deterministically

Addresses code quality review of 9161868:
- PluginDiscoveryResult.Error is now Exception? rather than string?,
  preserving stack traces across the plugin boundary for logging
- PluginDiscovery.Scan orders subdirectories by ordinal string comparison
  so plugin load order is reproducible across platforms
This commit is contained in:
Erik 2026-04-10 09:40:17 +02:00
parent 91618682e2
commit 42480cc751

View file

@ -3,7 +3,7 @@ namespace AcDream.Core.Plugins;
public sealed record PluginDiscoveryResult( public sealed record PluginDiscoveryResult(
string PluginDirectory, string PluginDirectory,
PluginManifest? Manifest, PluginManifest? Manifest,
string? Error) Exception? Error)
{ {
public bool Success => Manifest is not null && Error is null; public bool Success => Manifest is not null && Error is null;
} }
@ -16,7 +16,7 @@ public static class PluginDiscovery
return Array.Empty<PluginDiscoveryResult>(); return Array.Empty<PluginDiscoveryResult>();
var results = new List<PluginDiscoveryResult>(); var results = new List<PluginDiscoveryResult>();
foreach (var subdir in Directory.EnumerateDirectories(pluginsRootDirectory)) foreach (var subdir in Directory.EnumerateDirectories(pluginsRootDirectory).OrderBy(p => p, StringComparer.Ordinal))
{ {
var manifestPath = Path.Combine(subdir, "plugin.json"); var manifestPath = Path.Combine(subdir, "plugin.json");
if (!File.Exists(manifestPath)) if (!File.Exists(manifestPath))
@ -30,7 +30,7 @@ public static class PluginDiscovery
} }
catch (Exception ex) catch (Exception ex)
{ {
results.Add(new PluginDiscoveryResult(subdir, null, ex.Message)); results.Add(new PluginDiscoveryResult(subdir, null, ex));
} }
} }
return results; return results;