summary refs log tree commit diff stats
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs86
1 files changed, 81 insertions, 5 deletions
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)]);
 }