using Shogi.Contracts.Types; using DomainWhichPiece = Shogi.Domain.ValueObjects.WhichPiece; using DomainWhichPlayer = Shogi.Domain.ValueObjects.WhichPlayer; using Piece = Shogi.Contracts.Types.Piece; namespace Shogi.Api.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 Piece Map(Domain.ValueObjects.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.ToUpper(), kvp => MapNullable(kvp.Value)); } public Piece? MapNullable(Domain.ValueObjects.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); Piece Map(Domain.ValueObjects.Piece p); Piece? MapNullable(Domain.ValueObjects.Piece? p); Dictionary Map(IDictionary boardState); } }