Files
SVSimServer/SVSim.BattleNode/Sessions/Dispatch/WireKeys.cs
gamer147 7e167b1cef refactor(battlenode): centralize inbound wire-key literals in WireKeys (§C)
Behavior-preserving; 231 BattleNode tests green (capture-conformance suite drives
real prod frames, so a wrong constant would fail).

New Sessions/Dispatch/WireKeys.cs holds the 28 inbound-body read keys (orderList /
keyAction / targetList / uList field names). KnownListBuilder, PlayActionsHandler,
EchoHandler, and BattleFrames.ExtractIdxList now read through it instead of repeated
inline strings, so a parse-side typo ("isSelf" vs "IsSelf") can no longer silently
degrade token resolution. Outbound [JsonPropertyName] attributes left as-is (already
single-source per DTO).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 07:30:02 -04:00

51 lines
2.0 KiB
C#

namespace SVSim.BattleNode.Sessions.Dispatch;
/// <summary>
/// Single source of truth for the inbound-body (RawBody / orderList) wire-key strings the dispatch
/// path reads off the client's frames. These are the SENDER's JSON keys (mirroring the client's
/// <c>SendCardDataMaker</c> / <c>CardObj</c> serialization); a one-character typo at a read site
/// (<c>"isSelf"</c> vs <c>"IsSelf"</c>) silently degrades token resolution with no error, so every
/// read goes through a constant here instead of a repeated literal. Outbound keys stay on the
/// per-DTO <c>[JsonPropertyName]</c> attributes (already single-sourced there).
/// </summary>
internal static class WireKeys
{
// Top-level inbound body keys
public const string OrderList = "orderList";
public const string KeyAction = "keyAction";
public const string PlayIdx = "playIdx";
public const string Type = "type";
public const string TargetList = "targetList";
public const string UList = "uList";
// orderList op keys
public const string Move = "move";
public const string Add = "add";
public const string Idx = "idx";
public const string To = "to";
public const string IsSelf = "isSelf";
public const string Card = "card";
public const string CardId = "cardId";
public const string Candidates = "candidates";
public const string IsChoice = "isChoice";
public const string BaseIdx = "baseIdx";
// keyAction.selectCard keys
public const string SelectCard = "selectCard";
public const string Open = "open";
// targetList entry keys
public const string TargetIdx = "targetIdx";
// uList entry keys
public const string IdxList = "idxList";
public const string From = "from";
public const string Skill = "skill";
public const string Clan = "clan";
public const string Cost = "cost";
public const string SkillKeyCardIdx = "skillKeyCardIdx";
public const string RandomTargetIdx = "randomTargetIdx";
public const string IsInvoke = "isInvoke";
public const string AttachTarget = "attachTarget";
}