Files
turso/bindings/rust/src/lib.rs
Pekka Enberg af020c27d6 Initial take on Rust bindings
This implements libSQL compatible Rust API on top of Limbo's core. The
purpose of this is to allow libraries and apps that build on libSQL to
use Limbo.
2025-01-14 09:16:46 +02:00

129 lines
2.8 KiB
Rust

pub mod params;
mod value;
pub use params::params_from_iter;
use crate::params::*;
use crate::value::*;
use std::rc::Rc;
use std::sync::Arc;
#[derive(Debug, thiserror::Error)]
pub enum Error {
#[error("SQL conversion failure: `{0}`")]
ToSqlConversionFailure(crate::BoxError),
}
impl From<limbo_core::LimboError> for Error {
fn from(_err: limbo_core::LimboError) -> Self {
todo!();
}
}
pub(crate) type BoxError = Box<dyn std::error::Error + Send + Sync>;
pub type Result<T> = std::result::Result<T, Error>;
pub struct Builder {
path: String,
}
impl Builder {
pub fn new_local(path: &str) -> Self {
Self {
path: path.to_string(),
}
}
#[allow(unused_variables, clippy::arc_with_non_send_sync)]
pub async fn build(self) -> Result<Database> {
match self.path.as_str() {
":memory:" => {
let io: Arc<dyn limbo_core::IO> = Arc::new(limbo_core::MemoryIO::new()?);
let db = limbo_core::Database::open_file(io, self.path.as_str())?;
Ok(Database { inner: db })
}
_ => todo!(),
}
}
}
pub struct Database {
inner: Arc<limbo_core::Database>,
}
impl Database {
pub fn connect(self) -> Result<Connection> {
let conn = self.inner.connect();
Ok(Connection { inner: conn })
}
}
pub struct Connection {
inner: Rc<limbo_core::Connection>,
}
impl Connection {
pub async fn query(&self, sql: &str, params: impl IntoParams) -> Result<Rows> {
let mut stmt = self.prepare(sql).await?;
stmt.query(params).await
}
pub async fn execute(&self, sql: &str, params: impl IntoParams) -> Result<u64> {
let mut stmt = self.prepare(sql).await?;
stmt.execute(params).await
}
pub async fn prepare(&self, sql: &str) -> Result<Statement> {
let stmt = self.inner.prepare(sql)?;
Ok(Statement {
_inner: Rc::new(stmt),
})
}
}
pub struct Statement {
_inner: Rc<limbo_core::Statement>,
}
impl Statement {
pub async fn query(&mut self, params: impl IntoParams) -> Result<Rows> {
let _params = params.into_params()?;
todo!();
}
pub async fn execute(&mut self, params: impl IntoParams) -> Result<u64> {
let _params = params.into_params()?;
todo!();
}
}
pub trait IntoValue {
fn into_value(self) -> Result<Value>;
}
#[derive(Debug, Clone)]
pub enum Params {
None,
Positional(Vec<Value>),
Named(Vec<(String, Value)>),
}
pub struct Transaction {}
pub struct Rows {
_inner: Rc<limbo_core::Rows>,
}
impl Rows {
pub async fn next(&mut self) -> Result<Option<Row>> {
todo!();
}
}
pub struct Row {}
impl Row {
pub fn get_value(&self, _index: usize) -> Result<Value> {
todo!();
}
}