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#[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 <&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}