61 lines
1.7 KiB
JavaScript
61 lines
1.7 KiB
JavaScript
/**
|
|
* Formatter Registry
|
|
* ------------------
|
|
* Maps format names to formatter modules.
|
|
* Each formatter exports: format(measurement, metadata) => string|object
|
|
*
|
|
* Usage:
|
|
* const { getFormatter, registerFormatter } = require('./formatters');
|
|
* const fmt = getFormatter('json');
|
|
* const output = fmt.format('pump1', { fields: {...}, tags: {...} });
|
|
*/
|
|
|
|
const influxdbFormatter = require('./influxdbFormatter');
|
|
const jsonFormatter = require('./jsonFormatter');
|
|
const csvFormatter = require('./csvFormatter');
|
|
const processFormatter = require('./processFormatter');
|
|
|
|
// Built-in registry
|
|
const registry = {
|
|
influxdb: influxdbFormatter,
|
|
json: jsonFormatter,
|
|
csv: csvFormatter,
|
|
process: processFormatter,
|
|
};
|
|
|
|
/**
|
|
* Retrieve a formatter by name.
|
|
* @param {string} name - Format name (e.g. 'influxdb', 'json', 'csv')
|
|
* @returns {object} Formatter with a .format() method
|
|
* @throws {Error} If the format name is not registered
|
|
*/
|
|
function getFormatter(name) {
|
|
const formatter = registry[name];
|
|
if (!formatter) {
|
|
throw new Error(`Unknown output format: "${name}". Registered formats: ${Object.keys(registry).join(', ')}`);
|
|
}
|
|
return formatter;
|
|
}
|
|
|
|
/**
|
|
* Register a custom formatter at runtime.
|
|
* @param {string} name - Format name
|
|
* @param {object} formatter - Object with a .format(measurement, metadata) method
|
|
*/
|
|
function registerFormatter(name, formatter) {
|
|
if (typeof formatter.format !== 'function') {
|
|
throw new Error('Formatter must have a .format(measurement, metadata) method');
|
|
}
|
|
registry[name] = formatter;
|
|
}
|
|
|
|
/**
|
|
* List all registered format names.
|
|
* @returns {string[]}
|
|
*/
|
|
function getRegisteredFormats() {
|
|
return Object.keys(registry);
|
|
}
|
|
|
|
module.exports = { getFormatter, registerFormatter, getRegisteredFormats };
|