use rusqlite::{Connection, params, Result, Transaction, Row}; use serde::{Serialize}; #[derive(Debug, Serialize)] pub struct User { pub id: i32, name: String, public_key: String, } pub fn create_user(tx: & Transaction, name: &String, public_key: &String) -> Result{ tx.execute("INSERT INTO users (name, public_key) VALUES (?1, ?2)", (name, public_key))?; return get_user_by_id(tx, tx.last_insert_rowid() as i32); } fn _user_from_row(row: &Row) -> Result{ Ok(User { id: row.get(0)?, name: row.get(1)?, public_key: row.get(2)?, }) } fn get_user_by_id(tx: & Transaction, id: i32) -> Result{ let q = "SELECT id, name, public_key FROM users WHERE id = ?1"; tx.query_row(q, params![id], _user_from_row) } pub fn list_users(conn: & Connection) -> Result>{ let mut stmt = conn.prepare("SELECT id, name, public_key FROM users")?; let ret: Vec = stmt.query_map([], _user_from_row)? .filter(Result::is_ok) .map(Result::unwrap) .collect(); return Ok(ret); }