diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/db.rs | 36 | ||||
-rw-r--r-- | src/main.rs | 86 |
2 files changed, 90 insertions, 32 deletions
diff --git a/src/db.rs b/src/db.rs index 93d73a8..a0cc2cf 100644 --- a/src/db.rs +++ b/src/db.rs @@ -1,23 +1,20 @@ use log::info; -use rand; use rusqlite; -use std::sync::mpsc; use std::time; const DB_PATH: &str = "/tmp/clinte.db"; #[derive(Debug)] pub struct Post { - id: u32, - title: String, - author: String, - body: String, + pub id: u32, + pub title: String, + pub author: String, + pub body: String, } #[derive(Debug)] pub struct Conn { - db: rusqlite::Connection, - rx: mpsc::Receiver<Cmd>, + pub conn: rusqlite::Connection, } #[derive(Debug)] @@ -42,7 +39,7 @@ impl Conn { conn.execute( "CREATE TABLE IF NOT EXISTS posts ( - id INTEGER PRIMARY KEY NOT NULL, + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, title TEXT NOT NULL, author TEXT NOT NULL, body TEXT NOT NULL @@ -59,11 +56,8 @@ impl Conn { conn } - pub fn new(rx: mpsc::Receiver<Cmd>) -> Self { - Conn { - db: Conn::init(), - rx, - } + pub fn new() -> Self { + Conn { conn: Conn::init() } } } @@ -80,7 +74,7 @@ impl Cmd { impl Post { pub fn new(title: &str, author: &str, body: &str) -> Self { - let id = rand::random::<u32>(); + let id = 0; let title = title.to_string(); let author = author.to_string(); let body = body.to_string(); @@ -91,16 +85,4 @@ impl Post { body, } } - pub fn id(&self) -> String { - format!("{}", self.id) - } - pub fn title(&self) -> String { - self.title.clone() - } - pub fn author(&self) -> String { - self.author.clone() - } - pub fn body(&self) -> String { - self.body.clone() - } } diff --git a/src/main.rs b/src/main.rs index 3f93d92..1b64c84 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,9 @@ use clap; use log::info; -use std::sync::mpsc; +use std::io; +use std::process; use std::time; +use users; mod db; mod logging; @@ -13,7 +15,7 @@ fn main() { .about("Command-line community notices system") .subcommand(clap::SubCommand::with_name("list").about("Display notices")) .subcommand(clap::SubCommand::with_name("post").about("Post a new notice")) - .subcommand( + /*.subcommand( clap::SubCommand::with_name("update") .about("Update a notice you've posted") .arg(clap::Arg::with_name("id").help("Numeric ID of the post")), @@ -22,7 +24,7 @@ fn main() { clap::SubCommand::with_name("delete") .about("Delete a notice you've posted") .arg(clap::Arg::with_name("id").help("Numeric ID of the post")), - ) + )*/ .get_matches(); let start = time::Instant::now(); @@ -30,9 +32,83 @@ fn main() { info!("clinte starting up!"); println!("clinte-0.1-dev"); println!("a community notices system"); + println!(); - let (_tx, rx) = mpsc::channel::<db::Cmd>(); - let db = db::Conn::new(rx); + let db = db::Conn::new(); info!("Startup completed in {:?}ms", start.elapsed().as_millis()); + + if let Some(_) = arg_matches.subcommand_matches("list") { + info!("Listing notes..."); + list_matches(&db); + process::exit(0); + } else if let Some(_) = arg_matches.subcommand_matches("post") { + info!("New post..."); + post(&db); + list_matches(&db); + process::exit(0); + } +} + +fn list_matches(db: &db::Conn) { + let mut stmt = db.conn.prepare("SELECT * FROM posts").unwrap(); + let out = stmt + .query_map(rusqlite::NO_PARAMS, |row| { + let id = row.get(0)?; + let title = row.get(1)?; + let author = row.get(2)?; + let body = row.get(3)?; + Ok(db::Post { + id, + title, + author, + body, + }) + }) + .unwrap(); + + out.for_each(|row| { + if let Ok(post) = row { + println!( + "{}. {} -> by {}\n{}", + post.id, post.title, post.author, post.body + ); + } + }); +} + +fn post(db: &db::Conn) { + let mut stmt = db + .conn + .prepare("INSERT INTO posts (title, author, body) VALUES (:title, :author, :body)") + .unwrap(); + + println!(); + println!("Title of the new post: "); + let mut title = String::new(); + io::stdin().read_line(&mut title).unwrap(); + let title = title.trim(); + let title = if title.len() > 30 { + &title[..30] + } else { + &title + } + + println!(); + println!("Body of the new post: "); + let mut body = String::new(); + io::stdin().read_line(&mut body).unwrap(); + let body = body.trim(); + let body = if body.len() > 500 { + &body[..500] + } else { + &body + } + + let user = users::get_current_username() + .unwrap() + .into_string() + .unwrap(); + + stmt.execute_named(&[(":title", &title), (":author", &user), (":body", &body)]); } |