import 'package:mchess/api/move.dart'; enum MessageType { boardState, move, invalidMove, colorDetermined; String toJson() => name; static MessageType fromJson(String json) => values.byName(json); } enum ApiColor { black, white; String toJson() => name; static ApiColor fromJson(String json) => values.byName(json); } class ApiWebsocketMessage { final MessageType type; final ApiMove? move; final ApiColor? turnColor; final ApiColor? playerColor; final String? reason; final String? position; final ApiCoordinate? squareInCheck; ApiWebsocketMessage({ required this.type, required this.move, required this.turnColor, required this.playerColor, required this.reason, required this.position, required this.squareInCheck, }); factory ApiWebsocketMessage.fromJson(Map json) { final type = MessageType.fromJson(json['messageType']); ApiWebsocketMessage ret; switch (type) { case MessageType.boardState: ret = ApiWebsocketMessage( type: type, move: ApiMove.fromJson(json['move']), turnColor: ApiColor.fromJson(json['turnColor']), reason: null, position: json['position'], squareInCheck: null, playerColor: ApiColor.fromJson(json['playerColor']), ); case MessageType.colorDetermined: ret = ApiWebsocketMessage( type: type, move: null, turnColor: null, reason: null, position: null, squareInCheck: null, playerColor: ApiColor.fromJson(json['playerColor']), ); break; case MessageType.move: ret = ApiWebsocketMessage( type: type, move: ApiMove.fromJson(json['move']), turnColor: null, reason: null, position: json['position'], squareInCheck: json['squareInCheck'], playerColor: null); break; case MessageType.invalidMove: ret = ApiWebsocketMessage( type: type, move: ApiMove.fromJson(json['move']), turnColor: null, reason: json['reason'], position: null, squareInCheck: json['squareInCheck'], playerColor: null, ); } return ret; } Map toJson() => { 'messageType': type, 'move': move, 'color': turnColor, }; }