1use crate::type_info::D1TypeInfo;
2
3#[cfg_attr(feature = "offline", derive(serde::Serialize, serde::Deserialize))]
4pub struct D1Column {
5 pub(crate) ordinal: usize,
6 pub(crate) name: sqlx_core::ext::ustr::UStr,
7 pub(crate) type_info: D1TypeInfo,
8}
9
10impl std::fmt::Debug for D1Column {
11 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12 f.debug_struct("D1Column")
13 .field("ordinal", &self.ordinal)
14 .field("name", &(&*self.name))
15 .finish()
16 }
17}
18
19impl sqlx_core::column::Column for D1Column {
20 type Database = crate::D1;
21
22 fn name(&self) -> &str {
23 &self.name
24 }
25
26 fn ordinal(&self) -> usize {
27 self.ordinal
28 }
29
30 fn type_info(&self) -> &<Self::Database as sqlx_core::database::Database>::TypeInfo {
31 &self.type_info
32 }
33}
34
35impl sqlx_core::column::ColumnIndex<crate::row::D1Row> for &'_ str {
36 fn index(&self, row: &crate::row::D1Row) -> Result<usize, sqlx_core::Error> {
37 use sqlx_core::row::Row as _;
38 row.columns()
39 .iter()
40 .position(|c| &*c.name == *self)
41 .ok_or_else(|| sqlx_core::Error::ColumnNotFound(self.to_string()))
42 }
43}
44impl sqlx_core::column::ColumnIndex<crate::row::D1Row> for usize {
45 fn index(&self, row: &crate::row::D1Row) -> Result<usize, sqlx_core::Error> {
46 use sqlx_core::row::Row as _;
47 (*self <= row.columns().len())
48 .then_some(*self)
49 .ok_or_else(|| sqlx_core::Error::ColumnIndexOutOfBounds {
50 index: *self,
51 len: row.columns().len()
52 })
53 }
54}
55
56#[cfg(not(target_arch = "wasm32"))]
57impl D1Column {
58 pub(crate) fn from_sqlite(sqlite_column: sqlx_sqlite::SqliteColumn) -> Self {
59 use sqlx_core::column::Column as _;
60
61 Self {
62 ordinal: sqlite_column.ordinal(),
63 name: sqlite_column.name().to_string().into(),
64 type_info: D1TypeInfo::from_sqlite(sqlite_column.type_info().clone()),
65 }
66 }
67}