1extern crate vdb;
2
3use std::io;
4use std::io::Write;
5
6use vdb::{Db, Entry};
7
8fn list_entries(db: &mut Db) {
9 let row_ids = db.find_row_ids_by_name("title");
10 let entries = db.entries_from_row_ids(&row_ids, &["title", "text"]);
11 if entries.is_empty() {
12 println!();
13 println!("No entries.");
14 } else {
15 for entry in &entries {
16 if entry.len() >= 2 {
17 println!("{}: {}", entry[0].value, entry[1].value);
18 }
19 }
20 }
21}
22
23fn new_entry(db: &mut Db) {
24 println!("Enter title:");
25 print!("> ");
26 io::stdout().flush().unwrap();
27
28 let mut input = "".to_string();
29 let title = {
30 let _bytes_read = io::stdin().read_line(&mut input).unwrap();
31 input.trim()
32 };
33 if !title.is_empty() {
34 println!("Enter text:");
35 print!("> ");
36 io::stdout().flush().unwrap();
37 let mut input = "".to_string();
38 let _bytes_read = io::stdin().read_line(&mut input).unwrap();
39 let text = input.trim();
40 db.add_row(vec![
41 Entry::new_string("title", title),
42 Entry::new_string("text", text),
43 ]);
44 } else {
45 println!("Abort.");
46 }
47}
48
49fn delete_entry(db: &mut Db) {
50 println!("Enter title to delete:");
51 print!("> ");
52 io::stdout().flush().unwrap();
53
54 let mut input = "".to_string();
55 let title = {
56 let _bytes_read = io::stdin().read_line(&mut input).unwrap();
57 input.trim()
58 };
59 if !title.is_empty() {
60 let row_ids = db.find_row_ids_by_value("title", &Db::db_string(title));
61 db.delete_rows(&row_ids);
62 } else {
63 println!("Abort.");
64 }
65}
66
67fn print_menu() {
68 println!();
69 println!("Main menu");
70 println!("---------");
71 println!("l) list entries");
72 println!("e) enter new entry");
73 println!("d) delete entry");
74 println!("q) save & quit");
75
76 print!("> ");
77 io::stdout().flush().unwrap();
78}
79
80fn main_loop(db: &mut Db) {
81 let mut input = "".to_string();
82 print_menu();
83 while let Ok(_bytes_read) = io::stdin().read_line(&mut input) {
84 let trimmed = input.trim();
85 match trimmed {
86 "l" => list_entries(db),
87 "e" => new_entry(db),
88 "d" => delete_entry(db),
89 "" | "q" => {
90 let _ = db.save();
91 break;
92 }
93 _ => (),
94 }
95 print_menu();
96 input.clear();
97 }
98}
99
100fn main() {
101 let db_name = "notebook";
102 let mut db = if let Ok(db) = Db::load(db_name) {
103 db
104 } else {
105 Db::new(db_name)
106 };
107 main_loop(&mut db);
108}