using Gameboard.ShogiUI.Sockets.ServiceModels.Types; using System; using System.Collections.Generic; using System.Linq; using DomainWhichPiece = Shogi.Domain.WhichPiece; using DomainWhichPlayer = Shogi.Domain.WhichPlayer; namespace Gameboard.ShogiUI.Sockets.Managers { public class ModelMapper : IModelMapper { public WhichPlayer Map(DomainWhichPlayer whichPlayer) { return whichPlayer switch { DomainWhichPlayer.Player1 => WhichPlayer.Player1, DomainWhichPlayer.Player2 => WhichPlayer.Player2, _ => throw new ArgumentException("Unrecognized value for WhichPlayer", nameof(whichPlayer)) }; } public WhichPlayer? Map(DomainWhichPlayer? whichPlayer) { return whichPlayer.HasValue ? Map(whichPlayer.Value) : null; } public WhichPiece Map(DomainWhichPiece whichPiece) { return whichPiece switch { DomainWhichPiece.King => WhichPiece.King, DomainWhichPiece.GoldGeneral => WhichPiece.GoldGeneral, DomainWhichPiece.SilverGeneral => WhichPiece.SilverGeneral, DomainWhichPiece.Bishop => WhichPiece.Bishop, DomainWhichPiece.Rook => WhichPiece.Rook, DomainWhichPiece.Knight => WhichPiece.Knight, DomainWhichPiece.Lance => WhichPiece.Lance, DomainWhichPiece.Pawn => WhichPiece.Pawn, _ => throw new ArgumentException("Unrecognized value", nameof(whichPiece)), }; } public DomainWhichPiece Map(WhichPiece whichPiece) { return whichPiece switch { WhichPiece.King => DomainWhichPiece.King, WhichPiece.GoldGeneral => DomainWhichPiece.GoldGeneral, WhichPiece.SilverGeneral => DomainWhichPiece.SilverGeneral, WhichPiece.Bishop => DomainWhichPiece.Bishop, WhichPiece.Rook => DomainWhichPiece.Rook, WhichPiece.Knight => DomainWhichPiece.Knight, WhichPiece.Lance => DomainWhichPiece.Lance, WhichPiece.Pawn => DomainWhichPiece.Pawn, _ => throw new ArgumentException("Unrecognized value", nameof(whichPiece)), }; } public SessionMetadata Map(Shogi.Domain.SessionMetadata session) { return new SessionMetadata { Name = session.Name, Player1 = session.Player1, Player2 = session.Player2, IsPrivate = session.IsPrivate }; } public Piece Map(Shogi.Domain.Pieces.Piece piece) { return new Piece { IsPromoted = piece.IsPromoted, Owner = Map(piece.Owner), WhichPiece = Map(piece.WhichPiece) }; } public Dictionary Map(IDictionary boardState) { return boardState.ToDictionary(kvp => kvp.Key, kvp => MapNullable(kvp.Value)); } public Piece? MapNullable(Shogi.Domain.Pieces.Piece? piece) { if (piece == null) return null; return Map(piece); } } public interface IModelMapper { WhichPlayer Map(DomainWhichPlayer whichPlayer); WhichPlayer? Map(DomainWhichPlayer? whichPlayer); WhichPiece Map(DomainWhichPiece whichPiece); DomainWhichPiece Map(WhichPiece value); SessionMetadata Map(Shogi.Domain.SessionMetadata session); Piece Map(Shogi.Domain.Pieces.Piece p); Piece? MapNullable(Shogi.Domain.Pieces.Piece? p); Dictionary Map(IDictionary boardState); } }