import type { IFormatter, FormatterError, OutputFormat } from '../../interfaces/formatter.interface.js'; import type { FeedItem } from '../../interfaces/feed.types.js'; import { TerminalFormatter } from './terminal.formatter.js'; import { JsonFormatter } from './json.formatter.js'; export class Formatter implements IFormatter { private terminalFormatter: TerminalFormatter; private jsonFormatter: JsonFormatter; constructor() { this.terminalFormatter = new TerminalFormatter(); this.jsonFormatter = new JsonFormatter(); } async format(items: FeedItem[], format: OutputFormat): Promise { try { switch (format) { case 'terminal': return this.terminalFormatter.format(items); case 'json': return this.jsonFormatter.format(items); case 'html': // HTML not implemented yet per requirements throw this.createError('UNKNOWN', 'HTML format not implemented'); default: throw this.createError('SERIALIZE_ERROR', `Unknown format: ${format}`); } } catch (error) { if (this.isFormatterError(error)) { throw error; } throw this.createError('UNKNOWN', error instanceof Error ? error.message : 'Unknown error during formatting'); } } private createError(code: FormatterError['code'], message: string): FormatterError { return { code, message }; } private isFormatterError(error: unknown): error is FormatterError { return ( typeof error === 'object' && error !== null && 'code' in error && 'message' in error && (error as FormatterError).code !== undefined ); } }