Skip to main content

connectorx/transports/
dummy_arrow.rs

1//! Transport from Dummy Source to Arrow Destination.
2
3use crate::destinations::arrow::{
4    typesystem::{ArrowTypeSystem, NaiveDateTimeWrapperMicro},
5    ArrowDestination, ArrowDestinationError,
6};
7use crate::sources::dummy::{DummySource, DummyTypeSystem};
8use crate::typesystem::TypeConversion;
9use chrono::{DateTime, NaiveDate, NaiveDateTime, Utc};
10use thiserror::Error;
11
12/// Convert Dummy data types to Arrow data types.
13pub struct DummyArrowTransport;
14
15#[derive(Error, Debug)]
16pub enum DummyArrowTransportError {
17    #[error(transparent)]
18    Destination(#[from] ArrowDestinationError),
19
20    #[error(transparent)]
21    ConnectorX(#[from] crate::errors::ConnectorXError),
22}
23
24impl_transport!(
25    name = DummyArrowTransport,
26    error = DummyArrowTransportError,
27    systems = DummyTypeSystem => ArrowTypeSystem,
28    route = DummySource => ArrowDestination,
29    mappings = {
30        { F64[f64]                => Float64[f64]               | conversion auto}
31        { I64[i64]                => Int64[i64]                 | conversion auto}
32        { Bool[bool]              => Boolean[bool]              | conversion auto}
33        { String[String]          => LargeUtf8[String]          | conversion auto}
34        { DateTime[DateTime<Utc>] => Date64Micro[NaiveDateTimeWrapperMicro]      | conversion option}
35    }
36);
37
38impl TypeConversion<DateTime<Utc>, NaiveDateTimeWrapperMicro> for DummyArrowTransport {
39    fn convert(val: DateTime<Utc>) -> NaiveDateTimeWrapperMicro {
40        NaiveDateTimeWrapperMicro(val.naive_utc())
41    }
42}
43
44impl TypeConversion<NaiveDateTime, DateTime<Utc>> for DummyArrowTransport {
45    fn convert(val: NaiveDateTime) -> DateTime<Utc> {
46        DateTime::from_naive_utc_and_offset(val, Utc)
47    }
48}
49
50impl TypeConversion<NaiveDate, DateTime<Utc>> for DummyArrowTransport {
51    fn convert(val: NaiveDate) -> DateTime<Utc> {
52        DateTime::from_naive_utc_and_offset(
53            val.and_hms_opt(0, 0, 0)
54                .unwrap_or_else(|| panic!("and_hms_opt return None")),
55            Utc,
56        )
57    }
58}