tpchgen_cli/
tbl.rs

1//! Implementations of [`Source`] for generating data in TBL format
2
3use super::generate::Source;
4use std::io::Write;
5use tpchgen::generators::{
6    CustomerGenerator, LineItemGenerator, NationGenerator, OrderGenerator, PartGenerator,
7    PartSuppGenerator, RegionGenerator, SupplierGenerator,
8};
9
10/// Define a Source that writes the table in TBL format
11macro_rules! define_tbl_source {
12    ($SOURCE_NAME:ident, $GENERATOR_TYPE:ty) => {
13        pub struct $SOURCE_NAME {
14            inner: $GENERATOR_TYPE,
15        }
16
17        impl $SOURCE_NAME {
18            pub fn new(inner: $GENERATOR_TYPE) -> Self {
19                Self { inner }
20            }
21        }
22
23        impl Source for $SOURCE_NAME {
24            fn header(&self, buffer: Vec<u8>) -> Vec<u8> {
25                // TBL source does not have a header
26                buffer
27            }
28
29            fn create(self, mut buffer: Vec<u8>) -> Vec<u8> {
30                for item in self.inner.iter() {
31                    // The default Display impl writes TBL format
32                    writeln!(&mut buffer, "{item}").expect("writing to memory is infallible");
33                }
34                buffer
35            }
36        }
37    };
38}
39
40// Define .tbl sources for all tables
41define_tbl_source!(NationTblSource, NationGenerator<'static>);
42define_tbl_source!(RegionTblSource, RegionGenerator<'static>);
43define_tbl_source!(PartTblSource, PartGenerator<'static>);
44define_tbl_source!(SupplierTblSource, SupplierGenerator<'static>);
45define_tbl_source!(PartSuppTblSource, PartSuppGenerator<'static>);
46define_tbl_source!(CustomerTblSource, CustomerGenerator<'static>);
47define_tbl_source!(OrderTblSource, OrderGenerator<'static>);
48define_tbl_source!(LineItemTblSource, LineItemGenerator<'static>);