import { SpecifyError, specifyErrors } from '../errors/index.js';
import { ParserFunction } from './definitions/ParserFunction.js';
import { ParsersEngineDataBox } from './definitions/parsersEngineDataBox.js';
import { ParserToolbox } from './ParserToolbox.js';
export function chainParserFunctions<
A extends ParsersEngineDataBox,
B extends ParsersEngineDataBox,
>(ab: ParserFunction): ParserFunction;
export function chainParserFunctions<
A extends ParsersEngineDataBox,
B extends ParsersEngineDataBox,
C extends ParsersEngineDataBox,
>(ab: ParserFunction, bc: ParserFunction): ParserFunction;
export function chainParserFunctions<
A extends ParsersEngineDataBox,
B extends ParsersEngineDataBox,
C extends ParsersEngineDataBox,
D extends ParsersEngineDataBox,
>(
ab: ParserFunction,
bc: ParserFunction,
cd: ParserFunction,
): ParserFunction;
export function chainParserFunctions<
A extends ParsersEngineDataBox,
B extends ParsersEngineDataBox,
C extends ParsersEngineDataBox,
D extends ParsersEngineDataBox,
E extends ParsersEngineDataBox,
>(
ab: ParserFunction,
bc: ParserFunction,
cd: ParserFunction,
de: ParserFunction,
): ParserFunction;
export function chainParserFunctions<
A extends ParsersEngineDataBox,
B extends ParsersEngineDataBox,
C extends ParsersEngineDataBox,
D extends ParsersEngineDataBox,
E extends ParsersEngineDataBox,
F extends ParsersEngineDataBox,
>(
ab: ParserFunction,
bc: ParserFunction,
cd: ParserFunction,
de: ParserFunction,
ef: ParserFunction,
): ParserFunction;
/**
* Creates a pipeline of Parser functions that will be sequentially executed SDTF -> A -> B -> C...
* Each Parser function must implement the ParserFunction signature: (data: ParsersEngineDataBox, toolbox: ParserToolbox) => Promise
* @example
* const pipeline = chainParserFunctions(
* parsers.svgo(),
* parsers.svgToJsx({ output: { type: ... } }),
* async (dataBox, toolbox) => {
* // custom code
* return dataBox;
* }
* );
* @param parserFunctions
*/
export function chainParserFunctions(...parserFunctions: ParserFunction[]) {
if (!parserFunctions || parserFunctions.length === 0) {
throw new SpecifyError({
errorKey: specifyErrors.PARSERS_ENGINE_PARSER_EXECUTION_FAILED.errorKey,
publicMessage: `No parsers provided to chainParserFunctions.`,
});
}
// We use a named function to allow execution/debug to capture the function name
async function executeParsersPipeline(dataBox: ParsersEngineDataBox, toolbox: ParserToolbox) {
let result: ParsersEngineDataBox = dataBox;
for (const parser of parserFunctions) {
result = await parser(result, toolbox);
}
return result;
}
return executeParsersPipeline;
}