sqlx_exasol_impl/
column.rs1use std::{borrow::Cow, fmt::Display};
2
3use serde::{Deserialize, Deserializer, Serialize};
4use sqlx_core::{column::Column, database::Database, ext::ustr::UStr};
5
6use crate::{database::Exasol, type_info::ExaTypeInfo};
7
8#[derive(Debug, Clone, Deserialize, Serialize)]
10#[serde(rename_all = "camelCase")]
11pub struct ExaColumn {
12 #[serde(default)]
13 pub(crate) ordinal: usize,
14 #[serde(deserialize_with = "ExaColumn::lowercase_name")]
15 pub(crate) name: UStr,
16 pub(crate) data_type: ExaTypeInfo,
17}
18
19impl ExaColumn {
20 fn lowercase_name<'de, D>(deserializer: D) -> Result<UStr, D::Error>
21 where
22 D: Deserializer<'de>,
23 {
24 #[derive(Deserialize)]
31 struct CowStr<'a>(#[serde(borrow)] Cow<'a, str>);
32
33 CowStr::deserialize(deserializer)
34 .map(|c| c.0.to_lowercase())
35 .map(From::from)
36 }
37}
38
39impl Display for ExaColumn {
40 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
41 write!(f, "{}: {}", self.name, self.data_type)
42 }
43}
44
45impl Column for ExaColumn {
46 type Database = Exasol;
47
48 fn ordinal(&self) -> usize {
49 self.ordinal
50 }
51
52 fn name(&self) -> &str {
53 &self.name
54 }
55
56 fn type_info(&self) -> &<Self::Database as Database>::TypeInfo {
57 &self.data_type
58 }
59}