1use super::generate::Source;
3use std::io::Write;
4use tpchgen::csv::{
5 CustomerCsv, LineItemCsv, NationCsv, OrderCsv, PartCsv, PartSuppCsv, RegionCsv, SupplierCsv,
6};
7use tpchgen::generators::{
8 CustomerGenerator, LineItemGenerator, NationGenerator, OrderGenerator, PartGenerator,
9 PartSuppGenerator, RegionGenerator, SupplierGenerator,
10};
11
12macro_rules! define_csv_source {
14 ($SOURCE_NAME:ident, $GENERATOR_TYPE:ty, $FORMATTER:ty) => {
15 pub struct $SOURCE_NAME {
16 inner: $GENERATOR_TYPE,
17 }
18
19 impl $SOURCE_NAME {
20 pub fn new(inner: $GENERATOR_TYPE) -> Self {
21 Self { inner }
22 }
23 }
24
25 impl Source for $SOURCE_NAME {
26 fn header(&self, buffer: Vec<u8>) -> Vec<u8> {
27 let mut buffer = buffer;
28 writeln!(&mut buffer, "{}", <$FORMATTER>::header())
29 .expect("writing to memory is infallible");
30 buffer
31 }
32
33 fn create(self, mut buffer: Vec<u8>) -> Vec<u8> {
34 for item in self.inner.iter() {
35 let formatter = <$FORMATTER>::new(item);
36 writeln!(&mut buffer, "{formatter}").expect("writing to memory is infallible");
37 }
38 buffer
39 }
40 }
41 };
42}
43
44define_csv_source!(NationCsvSource, NationGenerator<'static>, NationCsv);
46define_csv_source!(RegionCsvSource, RegionGenerator<'static>, RegionCsv);
47define_csv_source!(PartCsvSource, PartGenerator<'static>, PartCsv);
48define_csv_source!(SupplierCsvSource, SupplierGenerator<'static>, SupplierCsv);
49define_csv_source!(PartSuppCsvSource, PartSuppGenerator<'static>, PartSuppCsv);
50define_csv_source!(CustomerCsvSource, CustomerGenerator<'static>, CustomerCsv);
51define_csv_source!(OrderCsvSource, OrderGenerator<'static>, OrderCsv);
52define_csv_source!(LineItemCsvSource, LineItemGenerator<'static>, LineItemCsv);