Skip to main content

cratestack_rusqlite/value/
columns.rs

1//! Newtype wrappers for ergonomic `row.get::<_, _>(idx)` when a column is
2//! stored as TEXT but should be decoded into a richer Rust type.
3
4use cratestack_core::Value;
5use rusqlite::types::{FromSql, FromSqlResult, ValueRef};
6
7use super::decode::{decode_datetime, decode_decimal, decode_json, decode_uuid};
8
9#[derive(Debug, Clone, Copy)]
10pub struct UuidColumn(pub uuid::Uuid);
11
12impl FromSql for UuidColumn {
13    fn column_result(value: ValueRef<'_>) -> FromSqlResult<Self> {
14        let raw = value.as_str()?;
15        decode_uuid(raw).map(UuidColumn)
16    }
17}
18
19#[derive(Debug, Clone, Copy)]
20pub struct DateTimeColumn(pub chrono::DateTime<chrono::Utc>);
21
22impl FromSql for DateTimeColumn {
23    fn column_result(value: ValueRef<'_>) -> FromSqlResult<Self> {
24        let raw = value.as_str()?;
25        decode_datetime(raw).map(DateTimeColumn)
26    }
27}
28
29#[derive(Debug, Clone)]
30pub struct JsonColumn(pub Value);
31
32impl FromSql for JsonColumn {
33    fn column_result(value: ValueRef<'_>) -> FromSqlResult<Self> {
34        let raw = value.as_str()?;
35        decode_json(raw).map(JsonColumn)
36    }
37}
38
39#[derive(Debug, Clone)]
40pub struct DecimalColumn(pub cratestack_core::Decimal);
41
42impl FromSql for DecimalColumn {
43    fn column_result(value: ValueRef<'_>) -> FromSqlResult<Self> {
44        let raw = value.as_str()?;
45        decode_decimal(raw).map(DecimalColumn)
46    }
47}