Skip to main content

connectorx/transports/
csv_arrow.rs

1//! Transport from CSV Source to Arrow Destination.
2
3use crate::destinations::arrow::{
4    typesystem::{ArrowTypeSystem, DateTimeWrapperMicro},
5    ArrowDestination, ArrowDestinationError,
6};
7use crate::sources::csv::{CSVSource, CSVSourceError, CSVTypeSystem};
8use crate::typesystem::TypeConversion;
9use chrono::{DateTime, Utc};
10use thiserror::Error;
11
12/// Convert CSV data types to Arrow data types.
13pub struct CSVArrowTransport;
14
15#[derive(Error, Debug)]
16pub enum CSVArrowTransportError {
17    #[error(transparent)]
18    Source(#[from] CSVSourceError),
19
20    #[error(transparent)]
21    Destination(#[from] ArrowDestinationError),
22
23    #[error(transparent)]
24    ConnectorX(#[from] crate::errors::ConnectorXError),
25}
26
27impl_transport!(
28    name = CSVArrowTransport,
29    error = CSVArrowTransportError,
30    systems = CSVTypeSystem => ArrowTypeSystem,
31    route = CSVSource => ArrowDestination,
32    mappings = {
33        { F64[f64]                => Float64[f64]              | conversion auto}
34        { I64[i64]                => Int64[i64]                | conversion auto}
35        { Bool[bool]              => Boolean[bool]             | conversion auto}
36        { String[String]          => LargeUtf8[String]         | conversion auto}
37        { DateTime[DateTime<Utc>] => DateTimeTzMicro[DateTimeWrapperMicro] | conversion option}
38    }
39);
40
41impl TypeConversion<DateTime<Utc>, DateTimeWrapperMicro> for CSVArrowTransport {
42    fn convert(val: DateTime<Utc>) -> DateTimeWrapperMicro {
43        DateTimeWrapperMicro(val)
44    }
45}