UNPKG

fentastic

Version:

Validate and parse Forsyth-Edwards Notation (FEN) used to describe a chess game board position.

70 lines (69 loc) 2.57 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.parseCastlingAvailability = exports.validateCastlingAvailability = void 0; const ParseError_js_1 = require("./ParseError.js"); const fieldName = 'Castling availability'; const validateCastlingAvailability = (field) => { try { if (!field.tokens.length) { throw new ParseError_js_1.ParseError(fieldName, '', field.delimiter.index, '-|Q|K|q|k'); } if (field.tokens.length === 1 && field.value === '-') { return field; } if (field.tokens.length > 4) { const lastToken = field.tokens[field.tokens.length - 1]; throw new ParseError_js_1.ParseError(fieldName, field.tokens.length, lastToken.index, '1-4', 'field length to be', 'count'); } for (let i = 0; i < field.tokens.length; i++) { let nextValid = []; let nextError; switch (field.tokens[i].value) { case 'K': nextValid = ['Q', 'k', 'q']; nextError = 'Q|k|q'; break; case 'Q': nextValid = ['k', 'q']; nextError = 'k|q'; break; case 'k': nextValid = ['q']; nextError = 'q'; break; case 'q': nextValid = []; nextError = undefined; break; default: throw new ParseError_js_1.ParseError(fieldName, field.tokens[i].value, field.tokens[i].index, 'Q|K|q|k'); } const next = field.tokens[i + 1]; if (next && !nextValid.includes(next.value)) { throw new ParseError_js_1.ParseError(fieldName, next.value, next.index, nextError); } } } catch (e) { if (e instanceof ParseError_js_1.ParseError) { field.error = e; } else { throw e; } } return field; }; exports.validateCastlingAvailability = validateCastlingAvailability; const parseCastlingAvailability = (field) => { if (field.value === '-') { return undefined; } return { whiteKingside: field.value.includes('K'), whiteQueenside: field.value.includes('Q'), blackKingside: field.value.includes('k'), blackQueenside: field.value.includes('q') }; }; exports.parseCastlingAvailability = parseCastlingAvailability;