uorm 0.9.3

Rust 下的轻量级 ORM 框架,借鉴了 Java MyBatis 的设计理念,强调 SQL 与业务逻辑分离。它结合 Rust 的类型系统与宏机制,支持编写原生 SQL 并自动映射结果,兼容 async/await,兼顾性能与可控性。
Documentation
use crate::udbc::value::Value;
use rusqlite::types::{Value as SqliteValue, ValueRef};

pub fn from_sqlite_value(v: ValueRef<'_>) -> Value {
    match v {
        ValueRef::Null => Value::Null,
        ValueRef::Integer(i) => Value::I64(i),
        ValueRef::Real(f) => Value::F64(f),
        ValueRef::Text(b) => match std::str::from_utf8(b) {
            Ok(s) => Value::Str(s.to_string()),
            Err(_) => Value::Bytes(b.to_vec()),
        },
        ValueRef::Blob(b) => Value::Bytes(b.to_vec()),
    }
}

pub fn to_sqlite_value(v: &Value) -> SqliteValue {
    match v {
        Value::Null => SqliteValue::Null,
        Value::Bool(b) => SqliteValue::Integer(if *b { 1 } else { 0 }),
        Value::I8(i) => SqliteValue::Integer(*i as i64),
        Value::I16(i) => SqliteValue::Integer(*i as i64),
        Value::I32(i) => SqliteValue::Integer(*i as i64),
        Value::I64(i) => SqliteValue::Integer(*i),
        Value::I128(i) => SqliteValue::Text(i.to_string()),
        Value::U8(u) => SqliteValue::Integer(*u as i64),
        Value::U16(u) => SqliteValue::Integer(*u as i64),
        Value::U32(u) => SqliteValue::Integer(*u as i64),
        Value::U64(u) => SqliteValue::Text(u.to_string()),
        Value::U128(u) => SqliteValue::Text(u.to_string()),
        Value::F32(f) => SqliteValue::Real(*f as f64),
        Value::F64(f) => SqliteValue::Real(*f),
        Value::Char(c) => SqliteValue::Text(c.to_string()),
        Value::Str(s) => SqliteValue::Text(s.clone()),
        Value::Bytes(b) => SqliteValue::Blob(b.clone()),
        Value::Date(d) => SqliteValue::Text(d.to_string()),
        Value::Time(t) => SqliteValue::Text(t.to_string()),
        Value::DateTime(dt) => SqliteValue::Text(dt.to_string()),
        Value::DateTimeUtc(dt) => SqliteValue::Text(dt.to_rfc3339()),
        Value::Decimal(d) => SqliteValue::Text(d.to_string()),
        Value::List(_) | Value::Map(_) => SqliteValue::Null,
    }
}