drizzle_sqlite/values/owned/
mod.rs

1//! Owned SQLite value type and implementations
2
3mod conversions;
4mod drivers;
5
6use super::SQLiteValue;
7use crate::traits::FromSQLiteValue;
8use drizzle_core::{error::DrizzleError, sql::SQL, traits::SQLParam};
9use std::borrow::Cow;
10
11/// Represents a SQLite value (owned version)
12#[derive(Debug, Clone, PartialEq, PartialOrd, Default)]
13pub enum OwnedSQLiteValue {
14    /// Integer value (i64)
15    Integer(i64),
16    /// Real value (f64)
17    Real(f64),
18    /// Text value (owned string)
19    Text(String),
20    /// Blob value (owned binary data)
21    Blob(Box<[u8]>),
22    /// NULL value
23    #[default]
24    Null,
25}
26
27impl OwnedSQLiteValue {
28    /// Returns true if this value is NULL.
29    #[inline]
30    pub const fn is_null(&self) -> bool {
31        matches!(self, OwnedSQLiteValue::Null)
32    }
33
34    /// Returns the integer value if this is an INTEGER.
35    #[inline]
36    pub const fn as_i64(&self) -> Option<i64> {
37        match self {
38            OwnedSQLiteValue::Integer(value) => Some(*value),
39            _ => None,
40        }
41    }
42
43    /// Returns the real value if this is a REAL.
44    #[inline]
45    pub const fn as_f64(&self) -> Option<f64> {
46        match self {
47            OwnedSQLiteValue::Real(value) => Some(*value),
48            _ => None,
49        }
50    }
51
52    /// Returns the text value if this is TEXT.
53    #[inline]
54    pub fn as_str(&self) -> Option<&str> {
55        match self {
56            OwnedSQLiteValue::Text(value) => Some(value.as_str()),
57            _ => None,
58        }
59    }
60
61    /// Returns the blob value if this is BLOB.
62    #[inline]
63    pub fn as_bytes(&self) -> Option<&[u8]> {
64        match self {
65            OwnedSQLiteValue::Blob(value) => Some(value.as_ref()),
66            _ => None,
67        }
68    }
69
70    /// Returns a borrowed SQLiteValue view of this owned value.
71    #[inline]
72    pub fn as_value(&self) -> SQLiteValue<'_> {
73        match self {
74            OwnedSQLiteValue::Integer(value) => SQLiteValue::Integer(*value),
75            OwnedSQLiteValue::Real(value) => SQLiteValue::Real(*value),
76            OwnedSQLiteValue::Text(value) => SQLiteValue::Text(Cow::Borrowed(value)),
77            OwnedSQLiteValue::Blob(value) => SQLiteValue::Blob(Cow::Borrowed(value)),
78            OwnedSQLiteValue::Null => SQLiteValue::Null,
79        }
80    }
81
82    /// Convert this SQLite value to a Rust type using the `FromSQLiteValue` trait.
83    ///
84    /// This provides a unified conversion interface for all types that implement
85    /// `FromSQLiteValue`, including primitives and enum types.
86    pub fn convert<T: FromSQLiteValue>(self) -> Result<T, DrizzleError> {
87        match self {
88            OwnedSQLiteValue::Integer(i) => T::from_sqlite_integer(i),
89            OwnedSQLiteValue::Text(s) => T::from_sqlite_text(&s),
90            OwnedSQLiteValue::Real(r) => T::from_sqlite_real(r),
91            OwnedSQLiteValue::Blob(b) => T::from_sqlite_blob(&b),
92            OwnedSQLiteValue::Null => T::from_sqlite_null(),
93        }
94    }
95
96    /// Convert a reference to this SQLite value to a Rust type.
97    pub fn convert_ref<T: FromSQLiteValue>(&self) -> Result<T, DrizzleError> {
98        match self {
99            OwnedSQLiteValue::Integer(i) => T::from_sqlite_integer(*i),
100            OwnedSQLiteValue::Text(s) => T::from_sqlite_text(s),
101            OwnedSQLiteValue::Real(r) => T::from_sqlite_real(*r),
102            OwnedSQLiteValue::Blob(b) => T::from_sqlite_blob(b),
103            OwnedSQLiteValue::Null => T::from_sqlite_null(),
104        }
105    }
106}
107
108impl std::fmt::Display for OwnedSQLiteValue {
109    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
110        let value = match self {
111            OwnedSQLiteValue::Integer(i) => i.to_string(),
112            OwnedSQLiteValue::Real(r) => r.to_string(),
113            OwnedSQLiteValue::Text(s) => s.clone(),
114            OwnedSQLiteValue::Blob(b) => String::from_utf8_lossy(b).to_string(),
115            OwnedSQLiteValue::Null => String::new(),
116        };
117        write!(f, "{value}")
118    }
119}
120
121//------------------------------------------------------------------------------
122// Core From<SQLiteValue> conversions
123//------------------------------------------------------------------------------
124
125impl<'a> From<SQLiteValue<'a>> for OwnedSQLiteValue {
126    fn from(value: SQLiteValue<'a>) -> Self {
127        match value {
128            SQLiteValue::Integer(i) => Self::Integer(i),
129            SQLiteValue::Real(r) => Self::Real(r),
130            SQLiteValue::Text(cow) => Self::Text(cow.into_owned()),
131            SQLiteValue::Blob(cow) => Self::Blob(cow.into_owned().into_boxed_slice()),
132            SQLiteValue::Null => Self::Null,
133        }
134    }
135}
136
137impl<'a> From<&SQLiteValue<'a>> for OwnedSQLiteValue {
138    fn from(value: &SQLiteValue<'a>) -> Self {
139        match value {
140            SQLiteValue::Integer(i) => Self::Integer(*i),
141            SQLiteValue::Real(r) => Self::Real(*r),
142            SQLiteValue::Text(cow) => Self::Text(cow.clone().into_owned()),
143            SQLiteValue::Blob(cow) => Self::Blob(cow.clone().into_owned().into_boxed_slice()),
144            SQLiteValue::Null => Self::Null,
145        }
146    }
147}
148
149//------------------------------------------------------------------------------
150// Core traits required by Drizzle
151//------------------------------------------------------------------------------
152
153impl SQLParam for OwnedSQLiteValue {}
154
155impl<'a> From<OwnedSQLiteValue> for SQL<'a, OwnedSQLiteValue> {
156    fn from(value: OwnedSQLiteValue) -> Self {
157        SQL::param(value)
158    }
159}
160
161//------------------------------------------------------------------------------
162// Cow integration for SQL struct
163//------------------------------------------------------------------------------
164
165impl From<OwnedSQLiteValue> for Cow<'_, OwnedSQLiteValue> {
166    fn from(value: OwnedSQLiteValue) -> Self {
167        Cow::Owned(value)
168    }
169}
170
171impl<'a> From<&'a OwnedSQLiteValue> for Cow<'a, OwnedSQLiteValue> {
172    fn from(value: &'a OwnedSQLiteValue) -> Self {
173        Cow::Borrowed(value)
174    }
175}