-
Notifications
You must be signed in to change notification settings - Fork 0
/
todocc.cc
135 lines (111 loc) · 3.65 KB
/
todocc.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include <numeric>
#include <iostream>
#include <regex>
#include "repo.h"
#include "utility.h"
bool identifier_is_valid(std::string identifier) {
return std::regex_match(identifier, std::regex("^[0-9]+$"));
}
int main(int argc, char *argv[]) {
if (argc <= 1) {
std::cout << "You need to provide a name of your list" << std::endl;
return 1;
}
std::string filename = argv[1];
const std::string options = "(I)nsert (S)how (C)omplete (R)ename (D)elete (E)xit";
// Initialize database
Repo repo(filename);
// Print current data if any
std::cout << "Course Project\n" << std::endl;
if(repo.all().empty()) {
std::cout << "No tasks created yet for " << filename << ". Press I to start." << std::endl;
std::cout << options << std::endl;
} else {
std::cout << options << std::endl;
}
// Begin loop interface
while(true) {
std::string flag;
std::cin >> flag;
std::cout << std::endl;
if (flag == "E"){
std::cout << "\nExiting" << std::endl;
break;
} else if (flag == "S"){
for (std::map<std::string, std::string> row : repo.all()) {
std::vector<std::string> values;
for (auto const& header : repo.get_headers()) {
values.push_back(row[header]);
}
std::cout << Utility::Vector::join(values, " ") << std::endl;
}
std::cout << options << std::endl;
} else if (flag == "I") {
std::cout << "Enter the follow values\n" << std::endl;
std::map<std::string, std::string> task;
for (std::string header : repo.get_headers()) {
// Do some awkward stuff
if (header == "id" || header == "created_at" || header == "updated_at"){
task[header] = "nil";
} else if (header == "completed"){
task[header] = "FALSE";
} else {
std::string capture;
std::cout << header << ":" << std::endl;
std::cin.ignore();
std::getline(std::cin, capture);
task["task"] = capture;
}
}
repo.insert(task);
std::cout << options << std::endl;
} else if (flag == "C") {
// mark as complete
std::string identifier;
while(true) {
std::cout << "Enter the ID of the task you want to complete" << std::endl;
std::cin.ignore();
std::cin >> identifier;
if (identifier_is_valid(identifier)) {
break;
}
}
repo.update(identifier, "completed", "TRUE");
std::cout << "Updated " << identifier << std::endl;
std::cout << options << std::endl;
} else if (flag == "R"){
// rename task
std::string identifier;
std::string new_task_name;
while(true) {
std::cout << "Enter the ID of the task you want to rename." << std::endl;
std::cin.ignore();
std::cin >> identifier;
if (identifier_is_valid(identifier)) {
break;
}
}
std::cout << "Enter the new name of your task" << std::endl;
std::cin.ignore();
std::getline(std::cin, new_task_name);
repo.update(identifier, "task", new_task_name);
std::cout << "Updated " << identifier << " to " << new_task_name << std::endl;
std::cout << options << std::endl;
} else if (flag == "D") {
// delete task
std::string identifier;
while(true) {
std::cout << "Enter the ID of the task you want to delete" << std::endl;
std::cin >> identifier;
std::cin.ignore();
if (identifier_is_valid(identifier)) {
break;
}
}
repo.delete_at(identifier);
std::cout << "Deleted " << identifier << std::endl;
std::cout << options << std::endl;
}
}
return 0;
}