From 3e55beeedba8e73beb61aa5b4aebc84edd97623d Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 29 Jun 2026 08:56:11 +0100 Subject: [PATCH] Collapse trade cargo selector surface state --- Aetheria.State.Verify/Program.cs | 9 ++-- ...RuntimeTradeCargoSelectorSurfaceBuilder.cs | 49 +++++-------------- 2 files changed, 17 insertions(+), 41 deletions(-) diff --git a/Aetheria.State.Verify/Program.cs b/Aetheria.State.Verify/Program.cs index 5bcdfc4ff..d957c4ab5 100644 --- a/Aetheria.State.Verify/Program.cs +++ b/Aetheria.State.Verify/Program.cs @@ -5935,7 +5935,6 @@ static void RequireTradeCargoSelectorUseEveSurface(string root) "public readonly struct AetheriaRuntimeTradeCargoSelectorCommand", "public static class AetheriaRuntimeTradeCargoSelectorSurfaceCommands", "public static bool TryRead(", - "AetheriaRuntimeTradeCargoSelectorSurfaceState", "AetheriaRuntimeTradeCargoTargetOption", "AetheriaRuntimeTradeCargoModelOption", "AetheriaRuntimeTradeCargoTargetKind", @@ -5945,7 +5944,7 @@ static void RequireTradeCargoSelectorUseEveSurface(string root) "public static string ShipBayCommand(", "public static AetheriaRuntimeTradeCargoSelectorSurfaceModel Build(", "public bool TryResolve(string command, out AetheriaRuntimeTradeCargoSelection selection)", - "public static AetheriaRuntimeSurfaceDocument Build(", + "private static AetheriaRuntimeSurfaceDocument Build(", "providerKind: \"trade.menu\"", "The observing client lists available cargo targets; the shared runtime surface owns the cargo selector contract." }; @@ -5959,11 +5958,13 @@ static void RequireTradeCargoSelectorUseEveSurface(string root) string.Join(", ", missingBuilderSymbols)); } - if (tradeCargoSelectorSurfaceBuilder.Contains("public AetheriaRuntimeTradeCargoSelectorSurfaceState State { get; }", StringComparison.Ordinal) || + if (tradeCargoSelectorSurfaceBuilder.Contains("AetheriaRuntimeTradeCargoSelectorSurfaceState", StringComparison.Ordinal) || + tradeCargoSelectorSurfaceBuilder.Contains("public AetheriaRuntimeTradeCargoSelectorSurfaceState State { get; }", StringComparison.Ordinal) || + tradeCargoSelectorSurfaceBuilder.Contains("public static AetheriaRuntimeSurfaceDocument Build(", StringComparison.Ordinal) || tradeCargoSelectorSurfaceBuilder.Contains("public static AetheriaRuntimeTradeCargoSelectorSurfaceModel Compose(", StringComparison.Ordinal)) { throw new InvalidOperationException( - "Shared runtime trade cargo selector builder must return a model with a finished surface document; do not re-expose Compose or a public State handoff."); + "Shared runtime trade cargo selector builder must return a model with a finished surface document; do not rebuild a shadow SurfaceState projection layer."); } } diff --git a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeTradeCargoSelectorSurfaceBuilder.cs b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeTradeCargoSelectorSurfaceBuilder.cs index 324f34162..82ced25df 100644 --- a/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeTradeCargoSelectorSurfaceBuilder.cs +++ b/Packages/org.gamecult.aetheria.state/Runtime/AetheriaRuntimeTradeCargoSelectorSurfaceBuilder.cs @@ -19,23 +19,6 @@ namespace GameCult.Aetheria.State.Verse public string Command { get; } } - public sealed class AetheriaRuntimeTradeCargoSelectorSurfaceState - { - public AetheriaRuntimeTradeCargoSelectorSurfaceState( - string currentTarget, - IReadOnlyList targets, - string updatedAtUtc) - { - CurrentTarget = currentTarget ?? ""; - Targets = targets ?? Array.Empty(); - UpdatedAtUtc = updatedAtUtc ?? ""; - } - - public string CurrentTarget { get; } - public IReadOnlyList Targets { get; } - public string UpdatedAtUtc { get; } - } - public enum AetheriaRuntimeTradeCargoTargetKind { Unknown = 0, @@ -101,11 +84,7 @@ namespace GameCult.Aetheria.State.Verse AetheriaRuntimeSurfaceDocument document, IReadOnlyDictionary selections) { - Document = document ?? AetheriaRuntimeTradeCargoSelectorSurfaceBuilder.Build( - new AetheriaRuntimeTradeCargoSelectorSurfaceState( - "", - Array.Empty(), - "")); + Document = document ?? throw new ArgumentNullException(nameof(document)); Selections = selections ?? new Dictionary(StringComparer.Ordinal); } @@ -166,24 +145,20 @@ namespace GameCult.Aetheria.State.Verse target.BayIndex); } - var state = new AetheriaRuntimeTradeCargoSelectorSurfaceState( - currentTarget, - options, - updatedAtUtc); - - return new AetheriaRuntimeTradeCargoSelectorSurfaceModel(Build(state), selections); + return new AetheriaRuntimeTradeCargoSelectorSurfaceModel( + Build(currentTarget, options, updatedAtUtc), + selections); } - public static AetheriaRuntimeSurfaceDocument Build( - AetheriaRuntimeTradeCargoSelectorSurfaceState state, + private static AetheriaRuntimeSurfaceDocument Build( + string currentTarget, + IReadOnlyList options, + string updatedAtUtc, long version = 1) { - state ??= new AetheriaRuntimeTradeCargoSelectorSurfaceState( - "", - Array.Empty(), - ""); + options ??= Array.Empty(); - var targets = state.Targets + var targets = options .OrderBy(target => target.Label, StringComparer.Ordinal) .ToArray(); @@ -192,7 +167,7 @@ namespace GameCult.Aetheria.State.Verse providerKind: "trade.menu", title: "Trade Target Cargo Selector", version: version, - updatedAtUtc: state.UpdatedAtUtc, + updatedAtUtc: updatedAtUtc ?? "", surface: new AetheriaRuntimeSurfaceTree( SurfaceId, Node( @@ -202,7 +177,7 @@ namespace GameCult.Aetheria.State.Verse Card( $"{SurfaceId}.card", "Target Cargo", - Metric($"{SurfaceId}.current", "Current", state.CurrentTarget), + Metric($"{SurfaceId}.current", "Current", currentTarget), Text( $"{SurfaceId}.note", "The observing client lists available cargo targets; the shared runtime surface owns the cargo selector contract."),