rusqlite 0.39.0

Ergonomic wrapper for SQLite
Documentation
use rusqlite::{Connection, Result};
#[cfg(all(target_family = "wasm", target_os = "unknown"))]
use wasm_bindgen::prelude::wasm_bindgen;

#[cfg(all(target_family = "wasm", target_os = "unknown"))]
#[wasm_bindgen]
extern "C" {
    #[wasm_bindgen(js_namespace = console)]
    fn log(s: &str);
}

#[cfg(all(target_family = "wasm", target_os = "unknown"))]
macro_rules! println {
    ($($t:tt)*) => (log(&format_args!($($t)*).to_string()))
}

struct Person {
    id: i32,
    name: String,
}

#[cfg_attr(all(target_family = "wasm", target_os = "unknown"), wasm_bindgen(main))]
fn main() -> Result<()> {
    let conn = Connection::open_in_memory()?;

    conn.execute(
        "CREATE TABLE IF NOT EXISTS persons (
            id INTEGER PRIMARY KEY,
            name TEXT NOT NULL
        )",
        (), // empty list of parameters.
    )?;

    conn.execute(
        "INSERT INTO persons (name) VALUES (?1), (?2), (?3)",
        ["Steven", "John", "Alex"].map(|n| n.to_string()),
    )?;

    let mut stmt = conn.prepare("SELECT id, name FROM persons")?;
    let rows = stmt.query_map([], |row| {
        Ok(Person {
            id: row.get(0)?,
            name: row.get(1)?,
        })
    })?;

    println!("Found persons:");

    for person in rows {
        match person {
            Ok(p) => println!("ID: {}, Name: {}", p.id, p.name),
            Err(e) => eprintln!("Error: {e:?}"),
        }
    }

    Ok(())
}