Skip to main content

diesel_libsql/
value.rs

1//! Owned value type extracted from libsql rows.
2
3/// An eagerly-extracted, owned value from a libsql row.
4///
5/// Unlike `diesel::sqlite::SqliteValue` which wraps C pointers,
6/// this type owns all its data.
7#[derive(Debug, Clone)]
8pub enum LibSqlValue {
9    /// SQL NULL
10    Null,
11    /// SQL INTEGER (i64)
12    Integer(i64),
13    /// SQL REAL (f64)
14    Real(f64),
15    /// SQL TEXT (owned String)
16    Text(String),
17    /// SQL BLOB (owned bytes)
18    Blob(Vec<u8>),
19}
20
21impl LibSqlValue {
22    /// Read as text. Panics if not Text.
23    pub fn read_text(&self) -> &str {
24        match self {
25            LibSqlValue::Text(s) => s.as_str(),
26            _ => panic!("Expected Text value, got {:?}", self),
27        }
28    }
29
30    /// Read as i32 (from integer, truncating).
31    pub fn read_integer(&self) -> i32 {
32        match self {
33            LibSqlValue::Integer(i) => *i as i32,
34            _ => panic!("Expected Integer value, got {:?}", self),
35        }
36    }
37
38    /// Read as i64.
39    pub fn read_long(&self) -> i64 {
40        match self {
41            LibSqlValue::Integer(i) => *i,
42            _ => panic!("Expected Integer value, got {:?}", self),
43        }
44    }
45
46    /// Read as f64.
47    pub fn read_double(&self) -> f64 {
48        match self {
49            LibSqlValue::Real(f) => *f,
50            LibSqlValue::Integer(i) => *i as f64,
51            _ => panic!("Expected Real value, got {:?}", self),
52        }
53    }
54
55    /// Read as blob.
56    pub fn read_blob(&self) -> &[u8] {
57        match self {
58            LibSqlValue::Blob(b) => b.as_slice(),
59            _ => panic!("Expected Blob value, got {:?}", self),
60        }
61    }
62
63    /// Returns true if this value is null.
64    pub fn is_null(&self) -> bool {
65        matches!(self, LibSqlValue::Null)
66    }
67}