diff --git a/members/diesel-demo/src/lib.rs b/members/diesel-demo/src/lib.rs index 53b9de4..728c5d0 100644 --- a/members/diesel-demo/src/lib.rs +++ b/members/diesel-demo/src/lib.rs @@ -1,6 +1,8 @@ pub mod models; pub mod schema; +use self::schema::posts::dsl::*; + use std::io::Write; use std::{env, io}; @@ -11,9 +13,6 @@ use dotenvy::dotenv; use libpt::log::{error, info, warn}; -use self::models::*; -use self::schema::posts::dsl::*; - pub fn establish_connection() -> anyhow::Result { dotenv()?; @@ -22,21 +21,41 @@ pub fn establish_connection() -> anyhow::Result { .inspect_err(|e| error!("Error connecting to {}:\n{e:#?}", database_url))?) } -pub fn load_posts(conn: &mut SqliteConnection) -> anyhow::Result> { +pub fn load_all_posts(conn: &mut SqliteConnection) -> anyhow::Result> { + Ok(posts.select(models::Post::as_select()).load(conn)?) +} + +pub fn load_relevant_posts(conn: &mut SqliteConnection) -> anyhow::Result> { Ok(posts - .filter(published.eq(true)) + .filter(schema::posts::published.eq(true)) .limit(5) - .select(Post::as_select()) + .select(models::Post::as_select()) .load(conn)?) } -pub fn print_posts(posts_to_print: &Vec) { +// NOTE: formatting breaks when you use japanese fullwidth (or probably other longer chars too) +// characters. Works well for the regular alphabet +pub fn print_posts(posts_to_print: &Vec) { if !posts_to_print.is_empty() { - info!("Displaying {} posts", posts_to_print.len()); + info!("{} posts are in the database", posts_to_print.len()); + println!( + "{: <12}| {: <30} | {: <40}[...] | {: <12} | {: <5}", + "id", "title", "body (truncated)", "body len", "is published?" + ); + println!("{:=^140}", ""); for post in posts_to_print { - println!("{}", post.title); - println!("-----------\n"); - println!("{}", post.body); + let mut short_title = post.body.clone(); + short_title.truncate(30); + let mut short_body = post.body.clone(); + short_body.truncate(40); + println!( + "{: <12}| {: <30} | {: <40}[...] | {: <12} | {: <5}", + post.id, + short_title, + short_body, + post.body.len(), + post.published + ); } } else { warn!("Tried to display posts, but there are no posts stored in the database"); diff --git a/members/diesel-demo/src/main.rs b/members/diesel-demo/src/main.rs index 037df2c..4ce0e46 100644 --- a/members/diesel-demo/src/main.rs +++ b/members/diesel-demo/src/main.rs @@ -6,7 +6,7 @@ use diesel_demo as lib; fn main() -> anyhow::Result<()> { let _logger = log::Logger::builder() - .max_level(log::Level::TRACE) + .max_level(log::Level::DEBUG) .show_time(false) .build(); debug!("logger initialized"); @@ -38,7 +38,8 @@ fn repl(conn: &mut SqliteConnection) -> anyhow::Result<()> { } else if buf.starts_with("EXIT") { break; } else if buf.starts_with("LIST") { - let posts = lib::load_posts(conn)?; + let posts = lib::load_all_posts(conn)?; + trace!("loaded posts for display: {posts:#?}"); lib::print_posts(&posts); } else if buf.starts_with("NEW") { let post = PostDraft::interactive_create()?;