diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main.rs | 33 | ||||
-rw-r--r-- | src/posts.rs | 79 |
2 files changed, 95 insertions, 17 deletions
diff --git a/src/main.rs b/src/main.rs index b837d47..2c9122f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,6 +6,7 @@ use users; mod db; mod logging; +mod posts; fn main() { let arg_matches = clap::App::new("clinte") @@ -124,13 +125,7 @@ fn post(db: &db::Conn) { &body }; - let user = users::get_current_username() - .unwrap() - .into_string() - .unwrap(); - - stmt.execute_named(&[(":title", &title), (":author", &user), (":body", &body)]) - .unwrap(); + posts::new(&mut stmt, title, body).unwrap(); println!(); } @@ -181,15 +176,7 @@ fn update(db: &db::Conn) { io::stdin().read_line(&mut new_body).unwrap(); println!(); - let new_title = new_title.trim(); - let new_body = new_body.trim(); - - let title_stmt = format!("UPDATE posts SET title = :title WHERE id = {}", id_num_in); - let mut stmt = db.conn.prepare(&title_stmt).unwrap(); - stmt.execute_named(&[(":title", &new_title)]).unwrap(); - let body_stmt = format!("UPDATE posts SET body = :body WHERE id = {}", id_num_in); - let mut stmt = db.conn.prepare(&body_stmt).unwrap(); - stmt.execute_named(&[(":body", &new_body)]).unwrap(); + posts::update(&new_title, &new_body, id_num_in, &db).unwrap(); } fn delete(db: &db::Conn) { @@ -221,5 +208,17 @@ fn delete(db: &db::Conn) { return; } - del_stmt.execute(rusqlite::NO_PARAMS).unwrap(); + posts::exec_stmt_no_params(&mut del_stmt).unwrap(); +} + +#[cfg(test)] +mod tests { + use super::*; + + // Just a "Don't Panic" test + #[test] + fn display() { + let db = db::Conn::new(); + list_matches(&db); + } } diff --git a/src/posts.rs b/src/posts.rs new file mode 100644 index 0000000..28ffac6 --- /dev/null +++ b/src/posts.rs @@ -0,0 +1,79 @@ +use crate::db; +use rusqlite; +use std::error::Error; +use users; + +type Result<T> = std::result::Result<T, Box<dyn Error>>; + +pub fn new(stmt: &mut rusqlite::Statement, title: &str, body: &str) -> Result<()> { + let user = users::get_current_username() + .unwrap() + .into_string() + .unwrap(); + + stmt.execute_named(&[(":title", &title), (":author", &user), (":body", &body)])?; + Ok(()) +} + +pub fn update(new_title: &str, new_body: &str, id_num_in: u32, db: &db::Conn) -> Result<()> { + let new_title = new_title.trim(); + let new_body = new_body.trim(); + + let title_stmt = format!("UPDATE posts SET title = :title WHERE id = {}", id_num_in); + let mut stmt = db.conn.prepare(&title_stmt)?; + stmt.execute_named(&[(":title", &new_title)])?; + let body_stmt = format!("UPDATE posts SET body = :body WHERE id = {}", id_num_in); + let mut stmt = db.conn.prepare(&body_stmt)?; + + stmt.execute_named(&[(":body", &new_body)])?; + + Ok(()) +} + +pub fn exec_stmt_no_params(stmt: &mut rusqlite::Statement) -> Result<()> { + stmt.execute(rusqlite::NO_PARAMS)?; + + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn post_new() { + let db = db::Conn::new(); + let mut stmt = db + .conn + .prepare("INSERT INTO posts (title, author, body) VALUES (:title, :author, :body)") + .unwrap(); + + let title = String::from("TEST TITLE"); + + new(&mut stmt, &title, "TEST BODY").unwrap(); + + let mut stmt = db + .conn + .prepare("SELECT * FROM posts WHERE title = :title") + .unwrap(); + + let out: String = stmt + .query_row_named(&[(":title", &title)], |row| row.get::<usize, String>(1)) + .unwrap(); + + assert_eq!("TEST TITLE", &out); + } + + #[test] + fn post_upd8() { + post_new(); + let db = db::Conn::new(); + update("NEW TITLE", "TEST BODY", 1, &db).unwrap(); + + let mut stmt = db.conn.prepare("SELECT * FROM posts WHERE id = 1").unwrap(); + + let out: String = stmt + .query_row(rusqlite::NO_PARAMS, |row| row.get::<usize, String>(1)) + .unwrap(); + assert_eq!("NEW TITLE", &out); + } +} |