use crate::generators::{Customer, LineItem, Nation, Order, Part, PartSupp, Region, Supplier};
use core::fmt;
use std::fmt::Display;
pub struct NationCsv<'a> {
inner: Nation<'a>,
delimiter: char,
}
impl<'a> NationCsv<'a> {
pub fn new(inner: Nation<'a>) -> Self {
Self {
inner,
delimiter: ',',
}
}
pub fn with_delimiter(inner: Nation<'a>, delimiter: char) -> Self {
Self { inner, delimiter }
}
pub fn header() -> &'static str {
"n_nationkey,n_name,n_regionkey,n_comment"
}
pub fn header_with_delimiter(delimiter: char) -> String {
format!("n_nationkey{delimiter}n_name{delimiter}n_regionkey{delimiter}n_comment")
}
}
impl Display for NationCsv<'_> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let d = self.delimiter;
write!(
f,
"{}{d}{}{d}{}{d}\"{}\"",
self.inner.n_nationkey, self.inner.n_name, self.inner.n_regionkey, self.inner.n_comment
)
}
}
pub struct RegionCsv<'a> {
inner: Region<'a>,
delimiter: char,
}
impl<'a> RegionCsv<'a> {
pub fn new(inner: Region<'a>) -> Self {
Self {
inner,
delimiter: ',',
}
}
pub fn with_delimiter(inner: Region<'a>, delimiter: char) -> Self {
Self { inner, delimiter }
}
pub fn header() -> &'static str {
"r_regionkey,r_name,r_comment"
}
pub fn header_with_delimiter(delimiter: char) -> String {
format!("r_regionkey{delimiter}r_name{delimiter}r_comment")
}
}
impl Display for RegionCsv<'_> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let d = self.delimiter;
write!(
f,
"{}{d}{}{d}\"{}\"",
self.inner.r_regionkey, self.inner.r_name, self.inner.r_comment
)
}
}
pub struct PartCsv<'a> {
inner: Part<'a>,
delimiter: char,
}
impl<'a> PartCsv<'a> {
pub fn new(inner: Part<'a>) -> Self {
Self {
inner,
delimiter: ',',
}
}
pub fn with_delimiter(inner: Part<'a>, delimiter: char) -> Self {
Self { inner, delimiter }
}
pub fn header() -> &'static str {
"p_partkey,p_name,p_mfgr,p_brand,p_type,p_size,p_container,p_retailprice,p_comment"
}
pub fn header_with_delimiter(delimiter: char) -> String {
format!("p_partkey{delimiter}p_name{delimiter}p_mfgr{delimiter}p_brand{delimiter}p_type{delimiter}p_size{delimiter}p_container{delimiter}p_retailprice{delimiter}p_comment")
}
}
impl Display for PartCsv<'_> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let d = self.delimiter;
write!(
f,
"{}{d}{}{d}{}{d}{}{d}{}{d}{}{d}{}{d}{}{d}\"{}\"",
self.inner.p_partkey,
self.inner.p_name,
self.inner.p_mfgr,
self.inner.p_brand,
self.inner.p_type,
self.inner.p_size,
self.inner.p_container,
self.inner.p_retailprice,
self.inner.p_comment
)
}
}
pub struct SupplierCsv {
inner: Supplier,
delimiter: char,
}
impl SupplierCsv {
pub fn new(inner: Supplier) -> Self {
Self {
inner,
delimiter: ',',
}
}
pub fn with_delimiter(inner: Supplier, delimiter: char) -> Self {
Self { inner, delimiter }
}
pub fn header() -> &'static str {
"s_suppkey,s_name,s_address,s_nationkey,s_phone,s_acctbal,s_comment"
}
pub fn header_with_delimiter(delimiter: char) -> String {
format!("s_suppkey{delimiter}s_name{delimiter}s_address{delimiter}s_nationkey{delimiter}s_phone{delimiter}s_acctbal{delimiter}s_comment")
}
}
impl Display for SupplierCsv {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let d = self.delimiter;
write!(
f,
"{}{d}{}{d}\"{}\"{d}{}{d}{}{d}{}{d}\"{}\"",
self.inner.s_suppkey,
self.inner.s_name,
self.inner.s_address,
self.inner.s_nationkey,
self.inner.s_phone,
self.inner.s_acctbal,
self.inner.s_comment
)
}
}
pub struct CustomerCsv<'a> {
inner: Customer<'a>,
delimiter: char,
}
impl<'a> CustomerCsv<'a> {
pub fn new(inner: Customer<'a>) -> Self {
Self {
inner,
delimiter: ',',
}
}
pub fn with_delimiter(inner: Customer<'a>, delimiter: char) -> Self {
Self { inner, delimiter }
}
pub fn header() -> &'static str {
"c_custkey,c_name,c_address,c_nationkey,c_phone,c_acctbal,c_mktsegment,c_comment"
}
pub fn header_with_delimiter(delimiter: char) -> String {
format!("c_custkey{delimiter}c_name{delimiter}c_address{delimiter}c_nationkey{delimiter}c_phone{delimiter}c_acctbal{delimiter}c_mktsegment{delimiter}c_comment")
}
}
impl Display for CustomerCsv<'_> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let d = self.delimiter;
write!(
f,
"{}{d}{}{d}\"{}\"{d}{}{d}{}{d}{}{d}{}{d}\"{}\"",
self.inner.c_custkey,
self.inner.c_name,
self.inner.c_address,
self.inner.c_nationkey,
self.inner.c_phone,
self.inner.c_acctbal,
self.inner.c_mktsegment,
self.inner.c_comment
)
}
}
pub struct PartSuppCsv<'a> {
inner: PartSupp<'a>,
delimiter: char,
}
impl<'a> PartSuppCsv<'a> {
pub fn new(inner: PartSupp<'a>) -> Self {
Self {
inner,
delimiter: ',',
}
}
pub fn with_delimiter(inner: PartSupp<'a>, delimiter: char) -> Self {
Self { inner, delimiter }
}
pub fn header() -> &'static str {
"ps_partkey,ps_suppkey,ps_availqty,ps_supplycost,ps_comment"
}
pub fn header_with_delimiter(delimiter: char) -> String {
format!("ps_partkey{delimiter}ps_suppkey{delimiter}ps_availqty{delimiter}ps_supplycost{delimiter}ps_comment")
}
}
impl Display for PartSuppCsv<'_> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let d = self.delimiter;
write!(
f,
"{}{d}{}{d}{}{d}{}{d}\"{}\"",
self.inner.ps_partkey,
self.inner.ps_suppkey,
self.inner.ps_availqty,
self.inner.ps_supplycost,
self.inner.ps_comment
)
}
}
pub struct OrderCsv<'a> {
inner: Order<'a>,
delimiter: char,
}
impl<'a> OrderCsv<'a> {
pub fn new(inner: Order<'a>) -> Self {
Self {
inner,
delimiter: ',',
}
}
pub fn with_delimiter(inner: Order<'a>, delimiter: char) -> Self {
Self { inner, delimiter }
}
pub fn header() -> &'static str {
"o_orderkey,o_custkey,o_orderstatus,o_totalprice,o_orderdate,o_orderpriority,o_clerk,o_shippriority,o_comment"
}
pub fn header_with_delimiter(delimiter: char) -> String {
format!("o_orderkey{delimiter}o_custkey{delimiter}o_orderstatus{delimiter}o_totalprice{delimiter}o_orderdate{delimiter}o_orderpriority{delimiter}o_clerk{delimiter}o_shippriority{delimiter}o_comment")
}
}
impl Display for OrderCsv<'_> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let d = self.delimiter;
write!(
f,
"{}{d}{}{d}{}{d}{}{d}{}{d}{}{d}{}{d}{}{d}\"{}\"",
self.inner.o_orderkey,
self.inner.o_custkey,
self.inner.o_orderstatus,
self.inner.o_totalprice,
self.inner.o_orderdate,
self.inner.o_orderpriority,
self.inner.o_clerk,
self.inner.o_shippriority,
self.inner.o_comment
)
}
}
pub struct LineItemCsv<'a> {
inner: LineItem<'a>,
delimiter: char,
}
impl<'a> LineItemCsv<'a> {
pub fn new(inner: LineItem<'a>) -> Self {
Self {
inner,
delimiter: ',',
}
}
pub fn with_delimiter(inner: LineItem<'a>, delimiter: char) -> Self {
Self { inner, delimiter }
}
pub fn header() -> &'static str {
"l_orderkey,l_partkey,l_suppkey,l_linenumber,l_quantity,l_extendedprice,l_discount,l_tax,l_returnflag,l_linestatus,l_shipdate,l_commitdate,l_receiptdate,l_shipinstruct,l_shipmode,l_comment"
}
pub fn header_with_delimiter(delimiter: char) -> String {
format!("l_orderkey{delimiter}l_partkey{delimiter}l_suppkey{delimiter}l_linenumber{delimiter}l_quantity{delimiter}l_extendedprice{delimiter}l_discount{delimiter}l_tax{delimiter}l_returnflag{delimiter}l_linestatus{delimiter}l_shipdate{delimiter}l_commitdate{delimiter}l_receiptdate{delimiter}l_shipinstruct{delimiter}l_shipmode{delimiter}l_comment")
}
}
impl Display for LineItemCsv<'_> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let d = self.delimiter;
write!(
f,
"{}{d}{}{d}{}{d}{}{d}{}{d}{}{d}{}{d}{}{d}{}{d}{}{d}{}{d}{}{d}{}{d}{}{d}{}{d}\"{}\"",
self.inner.l_orderkey,
self.inner.l_partkey,
self.inner.l_suppkey,
self.inner.l_linenumber,
self.inner.l_quantity,
self.inner.l_extendedprice,
self.inner.l_discount,
self.inner.l_tax,
self.inner.l_returnflag,
self.inner.l_linestatus,
self.inner.l_shipdate,
self.inner.l_commitdate,
self.inner.l_receiptdate,
self.inner.l_shipinstruct,
self.inner.l_shipmode,
self.inner.l_comment
)
}
}