sqlx_exasol/
column.rs

1use std::{fmt::Display, sync::Arc};
2
3use serde::{Deserialize, Deserializer};
4use sqlx_core::{column::Column, database::Database};
5
6use crate::{database::Exasol, type_info::ExaTypeInfo};
7
8/// Implementor of [`Column`].
9#[derive(Debug, Clone, Deserialize)]
10#[serde(rename_all = "camelCase")]
11pub struct ExaColumn {
12    #[serde(skip)]
13    pub(crate) ordinal: usize,
14    #[serde(deserialize_with = "ExaColumn::lowercase_name")]
15    pub(crate) name: Arc<str>,
16    pub(crate) data_type: ExaTypeInfo,
17}
18
19impl ExaColumn {
20    fn lowercase_name<'de, D>(deserializer: D) -> Result<Arc<str>, D::Error>
21    where
22        D: Deserializer<'de>,
23    {
24        // NOTE: We can borrow because we always deserialize from an owned buffer.
25        <&str>::deserialize(deserializer)
26            .map(str::to_lowercase)
27            .map(From::from)
28    }
29}
30
31impl Display for ExaColumn {
32    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
33        write!(f, "{}: {}", self.name, self.data_type)
34    }
35}
36
37impl Column for ExaColumn {
38    type Database = Exasol;
39
40    fn ordinal(&self) -> usize {
41        self.ordinal
42    }
43
44    fn name(&self) -> &str {
45        &self.name
46    }
47
48    fn type_info(&self) -> &<Self::Database as Database>::TypeInfo {
49        &self.data_type
50    }
51}