sqlx-d1-core 0.4.0

core implementation for sqlx-d1 - SQLx for Cloudflare D1
Documentation
use crate::{column::D1Column, value::D1Value};
use sqlx_core::value::Value;

pub struct D1Row {
    columns: Vec<D1Column>,
    values: Vec<D1Value>,
}

impl sqlx_core::row::Row for D1Row {
    type Database = crate::D1;

    fn columns(&self) -> &[<Self::Database as sqlx_core::database::Database>::Column] {
        &self.columns
    }

    fn try_get_raw<I>(
        &self,
        index: I,
    ) -> Result<<Self::Database as sqlx_core::database::Database>::ValueRef<'_>, sqlx_core::Error>
    where
        I: sqlx_core::column::ColumnIndex<Self>,
    {
        let index = index.index(self)?;
        Ok(self.values[index].as_ref())
    }
}

#[cfg(target_arch = "wasm32")]
impl D1Row {
    pub(crate) fn from_raw(raw: worker::wasm_bindgen::JsValue) -> Result<Self, sqlx_core::Error> {
        use worker::js_sys::{Array, Object};
        use worker::wasm_bindgen::JsCast;

        #[cfg(feature = "DEBUG")]
        {
            worker::console_debug!("[D1Row::from_raw] raw = `{raw:?}`");
        }

        let entries = Object::entries(raw.unchecked_ref::<Object>());
        let len = entries.length() as usize;

        let (mut columns, mut values) = (Vec::with_capacity(len), Vec::with_capacity(len));
        for (i, pair) in entries.iter().enumerate() {
            let pair = pair.unchecked_into::<Array>();
            let (key, value) = (pair.get(0), pair.get(1));
            columns.push(D1Column {
                ordinal: i,
                name: key.as_string().unwrap().into(),
                type_info: crate::type_info::D1TypeInfo::from_raw(&value),
            });
            values.push(value.into());
        }

        #[cfg(feature = "DEBUG")]
        {
            worker::console_debug!("[D1Row::from_raw] columns = `{columns:?}`");
            worker::console_debug!("[D1Row::from_raw] values = `{values:?}`");
        }

        Ok(Self { columns, values })
    }
}