fentastic
Version:
Validate and parse Forsyth-Edwards Notation (FEN) used to describe a chess game board position.
70 lines (69 loc) • 2.57 kB
JavaScript
;
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;