tpchgen_cli/
csv.rs

1//! Implementations of [`Source`] for generating data in TBL format
2use 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
12/// Define a Source that writes the table in CSV format
13macro_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
44// Define .csv sources for all tables
45define_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);