fentastic
Version:
Validate and parse Forsyth-Edwards Notation (FEN) used to describe a chess game board position.
73 lines (72 loc) • 3.29 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseFen = exports.validateFen = exports.InputError = exports.ParseError = void 0;
const token_js_1 = require("./token.js");
const createFields_js_1 = require("./createFields.js");
const parsePieceField_js_1 = require("./parsePieceField.js");
const parseActiveColor_js_1 = require("./parseActiveColor.js");
const parseCastlingAvailability_js_1 = require("./parseCastlingAvailability.js");
const parseEnPassantTargetSquare_js_1 = require("./parseEnPassantTargetSquare.js");
const parseClocks_js_1 = require("./parseClocks.js");
const ParseError_js_1 = require("./ParseError.js");
Object.defineProperty(exports, "ParseError", { enumerable: true, get: function () { return ParseError_js_1.ParseError; } });
const validateInputFen_js_1 = require("./validateInputFen.js");
Object.defineProperty(exports, "InputError", { enumerable: true, get: function () { return validateInputFen_js_1.InputError; } });
const whiteSpaceUtils_js_1 = require("./whiteSpaceUtils.js");
const handleErrors = (e, inputFen) => {
if (e instanceof ParseError_js_1.ParseError || e instanceof validateInputFen_js_1.InputError) {
return { fen: inputFen, valid: false, errors: [e] };
}
else if (e instanceof ParseError_js_1.ParseErrors) {
return { fen: inputFen, valid: false, errors: e.errors };
}
throw e;
};
const validateFen = (inputFen) => {
let fen;
try {
fen = (0, validateInputFen_js_1.validateInputFen)(inputFen);
const tokens = (0, token_js_1.createTokens)(fen);
(0, whiteSpaceUtils_js_1.validateWhiteSpace)(tokens);
const fields = (0, createFields_js_1.createFields)(tokens);
(0, createFields_js_1.validateFields)(fields);
return { fen, valid: true };
}
catch (e) {
return handleErrors(e, inputFen);
}
};
exports.validateFen = validateFen;
const defaultOptions = {
correctWhiteSpace: false
};
const parseFen = (inputFen, options = defaultOptions) => {
let fen;
try {
fen = (0, validateInputFen_js_1.validateInputFen)(inputFen);
let tokens = (0, token_js_1.createTokens)(fen);
if (options.correctWhiteSpace) {
tokens = (0, whiteSpaceUtils_js_1.correctWhiteSpace)(tokens);
}
else {
(0, whiteSpaceUtils_js_1.validateWhiteSpace)(tokens);
}
let fields = (0, createFields_js_1.createFields)(tokens);
fields = (0, createFields_js_1.validateFields)(fields);
return {
fen,
valid: true,
fields: fields.map((f) => f.value),
piecePlacement: (0, parsePieceField_js_1.parsePieceField)(fields[0]),
activeColor: (0, parseActiveColor_js_1.parseActiveColor)(fields[1]),
castlingAvailability: (0, parseCastlingAvailability_js_1.parseCastlingAvailability)(fields[2]),
enPassantTargetSquare: (0, parseEnPassantTargetSquare_js_1.parseEnPassantTargetSquare)(fields[3]),
halfmoveClock: (0, parseClocks_js_1.parseHalfMoveClock)(fields[4]),
fullmoveNumber: (0, parseClocks_js_1.parseFullMoveNumber)(fields[5])
};
}
catch (e) {
return handleErrors(e, inputFen);
}
};
exports.parseFen = parseFen;