use crate::structs::*; use lazy_static::lazy_static; use regex::Regex; use slug::slugify; use sqlx::{ sqlite::{Sqlite, SqliteRow}, Done, Executor, Row, }; use std::collections::HashSet; type SqlResult = sqlx::Result; // ___ _ _ // | _ \_ _(_)_ ____ _| |_ ___ // | _/ '_| \ V / _` | _/ -_) // |_| |_| |_|\_/\__,_|\__\___| // // I'm putting a lot of faith in Rust's ability to inline stuff. I'm // sure this is okay. But really, this lets the API be clean and // coherent and easily readable, and hides away the gnarliness of some // of the SQL queries. lazy_static! { static ref select_kasten_by_title_sql: String = str::replace( include_str!("sql/select_kasten_by_parameter.sql"), "QUERYPARAMETER", "zetteln.title"); } lazy_static! { static ref select_kasten_by_id_sql: String = str::replace( include_str!("sql/select_kasten_by_parameter.sql"), "QUERYPARAMETER", "zetteln.id"); } pub(crate) async fn reset_database<'a, E>(executor: E) -> SqlResult<()> where E: Executor<'a, Database = Sqlite>, { let initialize_sql = include_str!("sql/initialize_database.sql"); sqlx::query(initialize_sql).execute(executor).await.map(|_| ()) } pub(crate) async fn select_kasten_by_slug<'a, E>(executor: E, slug: &str) -> SqlResult> where E: Executor<'a, Database = Sqlite>, { Ok(sqlx::query_as(&select_kasten_by_id_sql) .bind(&slug) .fetch_all(executor) .await?) }