41 lines
1.1 KiB
Rust
41 lines
1.1 KiB
Rust
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<User>{
|
|
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<User>{
|
|
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<User>{
|
|
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<Vec<User>>{
|
|
|
|
let mut stmt = conn.prepare("SELECT id, name, public_key FROM users")?;
|
|
let ret: Vec<User> = stmt.query_map([], _user_from_row)?
|
|
.filter(Result::is_ok)
|
|
.map(Result::unwrap)
|
|
.collect();
|
|
return Ok(ret);
|
|
} |