type OutputFormat = 'csv' | 'ndjson'
abstract class Output<Format extends OutputFormat> {
format: Format
constructor(format: string) {
this.format = format
}
abstract encode(data: any[]): string
}
class CSV extends Output<'csv'> {
constructor() {
super('csv')
}
encode(data: any[]) {
return data.map((row) => row.join(',')).join('\n')
}
}
class NDJSON extends Output<'ndjson'> {
constructor() {
super('ndjson')
}
encode(data: any[]) {
return data.map((row) => JSON.stringify(row)).join('\n')
}
}
function getOutput<F extends 'csv' | 'ndjson'>(format: F): Output<F> {
switch (format) {
case 'csv': return new CSV()
case 'ndjson': return new NDJSON()
}
}