@loom-io/converter
Version:
Combines loom-io converters to convert from or to files
73 lines (72 loc) • 2.23 kB
JavaScript
import { NoValidFileConverterException } from "./exceptions.js";
const defaultOptions = {
failOnNoConverter: true,
};
export class CombinedConverter {
converters;
config;
constructor(converters, options = {}) {
this.config = {
...defaultOptions,
...options,
};
this.converters = Array.from(new Set(Array.isArray(converters) ? converters : [converters]));
}
converterSetAction(action, ...converters) {
const convertersSet = new Set(this.converters);
converters.forEach((converter) => {
convertersSet[action](converter);
});
this.converters = Array.from(convertersSet);
}
set options(options) {
this.config = options;
}
get options() {
return this.config;
}
addConverter(converter, ...converters) {
this.converterSetAction("add", converter, ...converters);
}
removeConverter(converter, ...converters) {
this.converterSetAction("delete", converter, ...converters);
}
async getConverter(file) {
try {
return await Promise.any(this.converters.map(async (converter) => {
if (await converter.verify(file)) {
return Promise.resolve(converter);
}
return Promise.reject();
}));
// eslint-disable-next-line @typescript-eslint/no-unused-vars
}
catch (error) {
if (this.config.failOnNoConverter) {
throw new NoValidFileConverterException(file.name);
}
}
}
async verify(file) {
try {
await this.getConverter(file);
return true;
// eslint-disable-next-line @typescript-eslint/no-unused-vars
}
catch (error) {
return false;
}
}
async unify(file, content) {
const converter = await this.getConverter(file);
if (!converter)
return;
await converter.unify(file, content);
}
async parse(file) {
const converter = await this.getConverter(file);
if (!converter)
return;
return converter.parse(file);
}
}