UNPKG

fentastic

Version:

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

73 lines (72 loc) 3.29 kB
"use strict"; 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;