blob: b9b5a9d307a1154088ff8ae187a0b2c7a489c5f9 [file] [log] [blame]
//! CSV formatting support for the row struct objects generated by the library.
use crate::generators::{Building, Customer, Driver, Trip, Vehicle, Zone};
use core::fmt;
use std::fmt::Display;
/// Write [`Vehicle`]s in CSV format.
///
/// # Example
/// ```
/// # use spatialbench::generators::VehicleGenerator;
/// # use spatialbench::csv::VehicleCsv;
/// # use std::fmt::Write;
/// // Output the first 3 rows in CSV format
/// let generator = VehicleGenerator::new(1.0, 1, 1);
/// let mut csv = String::new();
/// writeln!(&mut csv, "{}", VehicleCsv::header()).unwrap(); // write header
/// for line in generator.iter().take(3) {
/// // write line using CSV formatter
/// writeln!(&mut csv, "{}", VehicleCsv::new(line)).unwrap();
/// }
/// assert_eq!(
/// csv,
/// "v_vehiclekey,v_mfgr,v_brand,v_type, v_licence\n\
/// 1,Manufacturer#1,Brand#13,PROMO BURNISHED COPPER,\"ly. slyly ironi\"\n\
/// 2,Manufacturer#1,Brand#13,LARGE BRUSHED BRASS,\"lar accounts amo\"\n\
/// 3,Manufacturer#4,Brand#42,STANDARD POLISHED BRASS,\"egular deposits hag\"\n"
/// );
/// ```
pub struct VehicleCsv<'a> {
inner: Vehicle<'a>,
}
impl<'a> VehicleCsv<'a> {
pub fn new(inner: Vehicle<'a>) -> Self {
Self { inner }
}
/// Returns the CSV header for the Vehicle table
pub fn header() -> &'static str {
"v_vehiclekey,v_mfgr,v_brand,v_type, v_licence"
}
}
impl Display for VehicleCsv<'_> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(
f,
// note must quote the comment field as it may contain commas
"{},{},{},{},\"{}\"",
self.inner.v_vehiclekey,
self.inner.v_mfgr,
self.inner.v_brand,
self.inner.v_type,
self.inner.v_license
)
}
}
/// Write [`Driver`]s in CSV format.
///
/// # Example
/// ```
/// # use spatialbench::generators::DriverGenerator;
/// # use spatialbench::csv::DriverCsv;
/// # use std::fmt::Write;
/// // Output the first 3 rows in CSV format
/// let generator = DriverGenerator::new(1.0, 1, 1);
/// let mut csv = String::new();
/// writeln!(&mut csv, "{}", DriverCsv::header()).unwrap(); // write header
/// for line in generator.iter().take(3) {
/// // write line using CSV formatter
/// writeln!(&mut csv, "{}", DriverCsv::new(line)).unwrap();
/// }
/// assert_eq!(
/// csv,
/// "d_driverkey,d_name,d_address,d_region,d_nation,d_phone\n\
/// 1,Driver#000000001,\" N kD4on9OM Ipw3,gf0JBoQDd7tgrzrddZ\",AMERICA,PERU,27-918-335-1736\n\
/// 2,Driver#000000002,\"89eJ5ksX3ImxJQBvxObC,\",AFRICA,ETHIOPIA,15-679-861-2259\n\
/// 3,Driver#000000003,\"q1,G3Pj6OjIuUYfUoH18BFTKP5aU9bEV3\",AMERICA,ARGENTINA,11-383-516-1199\n"
/// );
/// ```
pub struct DriverCsv {
inner: Driver,
}
impl DriverCsv {
pub fn new(inner: Driver) -> Self {
Self { inner }
}
/// Returns the CSV header for the Driver table
pub fn header() -> &'static str {
"d_driverkey,d_name,d_address,d_region,d_nation,d_phone"
}
}
impl Display for DriverCsv {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(
f,
// note must quote the address and comment fields as they may contain commas
"{},{},\"{}\",{},{},{}",
self.inner.d_driverkey,
self.inner.d_name,
self.inner.d_address,
self.inner.d_region,
self.inner.d_nation,
self.inner.d_phone,
)
}
}
/// Write [`Customer`]s in CSV format.
///
/// # Example
/// ```
/// # use spatialbench::generators::CustomerGenerator;
/// # use spatialbench::csv::CustomerCsv;
/// # use std::fmt::Write;
/// // Output the first 3 rows in CSV format
/// let generator = CustomerGenerator::new(1.0, 1, 1);
/// let mut csv = String::new();
/// writeln!(&mut csv, "{}", CustomerCsv::header()).unwrap(); // write header
/// for line in generator.iter().take(3) {
/// // write line using CSV formatter
/// writeln!(&mut csv, "{}", CustomerCsv::new(line)).unwrap();
/// }
/// assert_eq!(
/// csv,
/// "c_custkey,c_name,c_address,c_region,c_nation,c_phone\n\
/// 1,Customer#000000001,\"IVhzIApeRb ot,c,E\",AFRICA,MOROCCO,25-989-741-2988\n\
/// 2,Customer#000000002,\"XSTf4,NCwDVaWNe6tEgvwfmRchLXak\",MIDDLE EAST,JORDAN,23-768-687-3665\n\
/// 3,Customer#000000003,\"MG9kdTD2WBHm\",AMERICA,ARGENTINA,11-719-748-3364\n"
/// );
/// ```
pub struct CustomerCsv<'a> {
inner: Customer<'a>,
}
impl<'a> CustomerCsv<'a> {
pub fn new(inner: Customer<'a>) -> Self {
Self { inner }
}
/// Returns the CSV header for the Customer table
pub fn header() -> &'static str {
"c_custkey,c_name,c_address,c_region,c_nation,c_phone"
}
}
impl Display for CustomerCsv<'_> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(
f,
// note must quote the address and comment fields as they may contain commas
"{},{},\"{}\",{},{},{}",
self.inner.c_custkey,
self.inner.c_name,
self.inner.c_address,
self.inner.c_region,
self.inner.c_nation,
self.inner.c_phone,
)
}
}
/// Write [`Trip`]s in CSV format.
///
/// # Example
/// ```
/// # use spatialbench::generators::TripGenerator;
/// # use spatialbench::csv::TripCsv;
/// # use std::fmt::Write;
/// // Output the first 3 rows in CSV format
/// let generator = TripGenerator::new(1.0, 1, 1);
/// let mut csv = String::new();
/// writeln!(&mut csv, "{}", TripCsv::header()).unwrap(); // write header
/// for line in generator.iter().take(3) {
/// // write line using CSV formatter
/// writeln!(&mut csv, "{}", TripCsv::new(line)).unwrap();
/// }
/// ```
pub struct TripCsv {
inner: Trip,
}
impl TripCsv {
pub fn new(inner: Trip) -> Self {
Self { inner }
}
/// Returns the CSV header for the Trip table
pub fn header() -> &'static str {
"t_tripkey,t_custkey,t_driverkey,t_vehiclekey,t_pickuptime,t_dropofftime,t_fare,t_tip,t_totalamount,t_distance,t_pickupx,t_pickupy"
}
}
impl Display for TripCsv {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(
f,
// note must quote location and comment fields as they may contain commas
"{},{},{},{},{},{},{},{},{},{},\"{:?}\",\"{:?}\"",
self.inner.t_tripkey,
self.inner.t_custkey,
self.inner.t_driverkey,
self.inner.t_vehiclekey,
self.inner.t_pickuptime,
self.inner.t_dropofftime,
self.inner.t_fare,
self.inner.t_tip,
self.inner.t_totalamount,
self.inner.t_distance,
self.inner.t_pickuploc,
self.inner.t_dropoffloc,
)
}
}
/// Write [`Building`]s in CSV format.
///
/// # Example
/// ```
/// # use spatialbench::generators::BuildingGenerator;
/// # use spatialbench::csv::BuildingCsv;
/// # use std::fmt::Write;
/// // Output the first 3 rows in CSV format
/// let generator = BuildingGenerator::new(1.0, 1, 1);
/// let mut csv = String::new();
/// writeln!(&mut csv, "{}", BuildingCsv::header()).unwrap(); // write header
/// for line in generator.iter().take(3) {
/// // write line using CSV formatter
/// writeln!(&mut csv, "{}", BuildingCsv::new(line)).unwrap();
/// }
/// ```
pub struct BuildingCsv<'a> {
inner: Building<'a>,
}
impl<'a> BuildingCsv<'a> {
pub fn new(inner: Building<'a>) -> Self {
Self { inner }
}
/// Returns the CSV header for the Building table
pub fn header() -> &'static str {
"b_buildingkey,b_name,b_boundary"
}
}
impl Display for BuildingCsv<'_> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(
f,
// note must quote the comment field as it may contain commas
"{},{},\"{:?}\"",
self.inner.b_buildingkey, self.inner.b_name, self.inner.b_boundary,
)
}
}
/// Write [`Zone`]s in CSV format.
///
/// # Example
/// ```
/// # use spatialbench::generators::ZoneGenerator;
/// # use spatialbench::csv::ZoneCsv;
/// # use std::fmt::Write;
/// // Output the first 3 rows in CSV format
/// let generator = ZoneGenerator::new(0.001, 1, 1);
/// let mut csv = String::new();
/// writeln!(&mut csv, "{}", ZoneCsv::header()).unwrap(); // write header
/// for line in generator.iter().take(3) {
/// // write line using CSV formatter
/// writeln!(&mut csv, "{}", ZoneCsv::new(line)).unwrap();
/// }
/// ```
pub struct ZoneCsv {
inner: Zone,
}
impl ZoneCsv {
pub fn new(inner: Zone) -> Self {
Self { inner }
}
/// Returns the CSV header for the Zone table
pub fn header() -> &'static str {
"z_zonekey,z_gersid,z_country,z_region,z_name,z_subtype,z_boundary"
}
}
impl Display for ZoneCsv {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(
f,
"{},{},{},{},{},{},\"{:?}\"",
self.inner.z_zonekey,
self.inner.z_gersid,
self.inner.z_country,
self.inner.z_region,
self.inner.z_name,
self.inner.z_subtype,
self.inner.z_boundary,
)
}
}