Compare commits
12 Commits
907f8a7b41
...
master
Author | SHA1 | Date | |
---|---|---|---|
ccccacd88d | |||
3157d98ea1 | |||
3bb7f52823 | |||
93da965805 | |||
4d07cdf4d4 | |||
edb5d29040 | |||
61136eced5 | |||
c6c3b45ec9 | |||
6158aaf673 | |||
49bb2f4fc8 | |||
4379b0311e | |||
a3b6471c13 |
1
.gitignore
vendored
1
.gitignore
vendored
@ -2,3 +2,4 @@
|
|||||||
/menu-helper
|
/menu-helper
|
||||||
/compile_commands.json
|
/compile_commands.json
|
||||||
.cache/*
|
.cache/*
|
||||||
|
/*.1.gz
|
||||||
|
10
Makefile
10
Makefile
@ -21,6 +21,7 @@ DEFS=
|
|||||||
CFLAGS=$(INCFLAGS) -std=c++20 -Wall -Wextra -Wfatal-errors -Werror
|
CFLAGS=$(INCFLAGS) -std=c++20 -Wall -Wextra -Wfatal-errors -Werror
|
||||||
HDRS=src/util.hpp src/arg_parse.hpp src/db.hpp src/cmd.hpp
|
HDRS=src/util.hpp src/arg_parse.hpp src/db.hpp src/cmd.hpp
|
||||||
OBJS=src/main.o src/util.o src/arg_parse.o src/db.o src/cmd.o
|
OBJS=src/main.o src/util.o src/arg_parse.o src/db.o src/cmd.o
|
||||||
|
DOCS=menu-helper.1
|
||||||
VERSION=1.0
|
VERSION=1.0
|
||||||
|
|
||||||
ifeq ($(PREFIX),)
|
ifeq ($(PREFIX),)
|
||||||
@ -39,13 +40,20 @@ endif
|
|||||||
menu-helper: $(OBJS)
|
menu-helper: $(OBJS)
|
||||||
$(CXX) -o $@ $^ $(LDFLAGS)
|
$(CXX) -o $@ $^ $(LDFLAGS)
|
||||||
|
|
||||||
|
menu-helper.1.gz: $(DOCS)
|
||||||
|
gzip -c $< > $@
|
||||||
|
|
||||||
.PHONY: clean distclean install
|
.PHONY: clean distclean install
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(RM) $(OBJS)
|
$(RM) $(OBJS)
|
||||||
|
|
||||||
distclean: clean
|
distclean: clean
|
||||||
|
$(RM) menu-helper.1.gz
|
||||||
$(RM) menu-helper
|
$(RM) menu-helper
|
||||||
|
|
||||||
install: menu-helper
|
install: menu-helper menu-helper.1.gz
|
||||||
|
install -d $(PREFIX)/bin
|
||||||
install -m 755 menu-helper $(PREFIX)/bin/
|
install -m 755 menu-helper $(PREFIX)/bin/
|
||||||
|
install -d $(PREFIX)/share/man/man1
|
||||||
|
install -m 644 menu-helper.1.gz $(PREFIX)/share/man/man1/
|
||||||
|
@ -108,7 +108,7 @@ stored in the database:
|
|||||||
|
|
||||||
```console
|
```console
|
||||||
$ menu-helper edit-name 1
|
$ menu-helper edit-name 1
|
||||||
New name: Lenguine agli Scampi
|
New name: Linguine agli Scampi
|
||||||
$ menu-helper edit-description 1
|
$ menu-helper edit-description 1
|
||||||
New description: A zesty Italian pasta dish.
|
New description: A zesty Italian pasta dish.
|
||||||
$ menu-helper list
|
$ menu-helper list
|
||||||
@ -179,10 +179,10 @@ GitHub. However, you can save me a bit of work by just sending me the Git
|
|||||||
patches directly (via E-Mail).
|
patches directly (via E-Mail).
|
||||||
|
|
||||||
If you're looking for a way to contribute, consider having a look at my [To-Do
|
If you're looking for a way to contribute, consider having a look at my [To-Do
|
||||||
list](/TODO.md) for the project.
|
list](TODO.md) for the project.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
This program is licensed under the terms & conditions of the GNU General Public
|
This program is licensed under the terms & conditions of the GNU General Public
|
||||||
License version 3 or greater. See the [LICENSE](/LICENSE) file for more
|
License version 3 or greater. See the [LICENSE](LICENSE) file for more
|
||||||
information.
|
information.
|
||||||
|
23
TODO.md
23
TODO.md
@ -1,11 +1,16 @@
|
|||||||
# To-Do List
|
# To-Do List
|
||||||
|
|
||||||
- [ ] Add more safeguards to avoid bad usage.
|
- [X] v1.0
|
||||||
- [ ] Create a man page.
|
- [X] Add basic functionality.
|
||||||
- [ ] Add more documentation to `help` subcommand.
|
- [X] Add more safeguards to avoid bad usage.
|
||||||
- [ ] Add import/export functionality.
|
- [X] Create a man page.
|
||||||
- [ ] Properly align output columns from `list` subcommand.
|
- [X] Add more documentation to `help` subcommand.
|
||||||
- [X] Add feature for editing recipe name and description.
|
- [X] Properly align output columns from `list` subcommand.
|
||||||
- [X] Name
|
- [X] Add feature for editing recipe name and description.
|
||||||
- [X] Description
|
- [X] Name
|
||||||
- [ ] Allow for writing description in editor.
|
- [X] Description
|
||||||
|
|
||||||
|
- [ ] v1.1
|
||||||
|
- [ ] Add import/export functionality.
|
||||||
|
- [ ] Allow for writing description in editor.
|
||||||
|
- [ ] Add examples to man page.
|
||||||
|
65
menu-helper.1
Normal file
65
menu-helper.1
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
.TH "MENU HELPER" "1" "November 2024" "menu-helper 1.0" "User Commands"
|
||||||
|
.SH "NAME"
|
||||||
|
menu-helper \- makes choosing meals easier
|
||||||
|
.SH "SYNOPSIS"
|
||||||
|
.B menu-helper
|
||||||
|
<\fICOMMAND\fR> [\fIOPTIONS\fR]
|
||||||
|
|
||||||
|
.SH "DESCRIPTION"
|
||||||
|
A program to manage a database of recipes and help you pick out meals based on
|
||||||
|
filters of ingredients and tags.
|
||||||
|
|
||||||
|
.SH "COMMANDS"
|
||||||
|
.TP
|
||||||
|
.B \fBadd\fR, \fBnew\fR
|
||||||
|
Add a new recipe to the database.
|
||||||
|
.TP
|
||||||
|
.B \fBdel\fR, \fBrm\fR <\fIid\fR>
|
||||||
|
Delete recipe with provided \fIid\fR.
|
||||||
|
.TP
|
||||||
|
.B \fBlist\fR, \fBls\fR [-i <\fIingredients\fR>] [-t <\fItags\fR>]
|
||||||
|
List all recipes that contain all \fIingredients\fR an \fItags\fR listed. If
|
||||||
|
none are listed, then it prints all recipes stored in the database. Both
|
||||||
|
\fIingredients\fR and \fItags\fR are comma-separated lists (e.g.
|
||||||
|
"garlic,tomato").
|
||||||
|
.TP
|
||||||
|
.B \fBinfo\fR <\fIid\fR>
|
||||||
|
Show all stored information on recipe with provided \fIid\fR.
|
||||||
|
.TP
|
||||||
|
.B \fBedit-name\fR <\fIid\fR>
|
||||||
|
Change the name of the recipe with the provided \fIid\fR.
|
||||||
|
.TP
|
||||||
|
.B \fBedit-description\fR, \fBedit-desc\fR <\fIid\fR>
|
||||||
|
Change the description of the recipe with the provided \fIid\fR.
|
||||||
|
.TP
|
||||||
|
.B \fBadd-ingr\fR <\fIid\fR> <\fIingredients\fR>
|
||||||
|
Add the specified \fIingredients\fR to the recipe with \fIid\fR, where
|
||||||
|
\fIingredients\fR is a comma-separated list (e.g. "garlic,tomato").
|
||||||
|
.TP
|
||||||
|
.B \fBrm-ingr\fR <\fIid\fR> <\fIingredients\fR>
|
||||||
|
Remove the specified \fIingredients\fR from the recipe with \fIid\fR, where
|
||||||
|
\fIingredients\fR is a comma-separated list (e.g. "garlic,tomato").
|
||||||
|
.TP
|
||||||
|
.B \fBadd-tag\fR <\fIid\fR> <\fItags\fR>
|
||||||
|
Add the specified \fItags\fR to the recipe with \fIid\fR, where \fItags\fR is a
|
||||||
|
comma-separated list (e.g. "dinner,simple").
|
||||||
|
.TP
|
||||||
|
.B \fBrm-tag\fR <\fIid\fR> <\fItags\fR>
|
||||||
|
Remove the specified \fItags\fR from the recipe with \fIid\fR, where \fItags\fR
|
||||||
|
is a comma-separated list (e.g. "dinner,simple").
|
||||||
|
.TP
|
||||||
|
.B \fBhelp\fR, \fB-h\fR, \fB--help\fR
|
||||||
|
Show basic help information.
|
||||||
|
.TP
|
||||||
|
.B \fBversion\fR, \fB-v\fR, \fB--version\fR
|
||||||
|
Show version information.
|
||||||
|
|
||||||
|
.SH "AUTHOR"
|
||||||
|
Written by Nicolás A. Ortega Froysa.
|
||||||
|
|
||||||
|
.SH "COPYRIGHT"
|
||||||
|
Copyright \(co 2024 Ortega Froysa, Nicolás A. <nicolas@ortegas.org>.
|
||||||
|
License: GNU General Public License version 3 or greater (see <https://gnu.org/licenses/gpl.html>).
|
||||||
|
|
||||||
|
This is free software: you are free to change and redistribute it.
|
||||||
|
There is NO WARRANTY, to the extent permitted by law.
|
@ -79,6 +79,7 @@ static inline void print_help(void) {
|
|||||||
"\thelp, -h, --help Show this help information.\n"
|
"\thelp, -h, --help Show this help information.\n"
|
||||||
"\tversion, -v, --version Show version information.\n"
|
"\tversion, -v, --version Show version information.\n"
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
|
std::cout << "For more information about subcommands, use 'man menu-helper'." << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum cmd_id parse_args(const std::string &cmd);
|
enum cmd_id parse_args(const std::string &cmd);
|
||||||
|
18
src/cmd.cpp
18
src/cmd.cpp
@ -20,6 +20,8 @@
|
|||||||
#include "util.hpp"
|
#include "util.hpp"
|
||||||
|
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <iomanip>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@ -71,6 +73,8 @@ int cmd_add(void) {
|
|||||||
int cmd_list(int argc, char *argv[]) {
|
int cmd_list(int argc, char *argv[]) {
|
||||||
db db;
|
db db;
|
||||||
std::vector<std::string> ingredients, tags;
|
std::vector<std::string> ingredients, tags;
|
||||||
|
struct winsize winsize;
|
||||||
|
const int id_col_sz = 5, name_col_sz = 24;
|
||||||
int opt;
|
int opt;
|
||||||
|
|
||||||
while((opt = getopt(argc, argv, "i:t:")) not_eq -1) {
|
while((opt = getopt(argc, argv, "i:t:")) not_eq -1) {
|
||||||
@ -92,10 +96,20 @@ int cmd_list(int argc, char *argv[]) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ioctl(STDOUT_FILENO, TIOCGWINSZ, &winsize);
|
||||||
|
const int desc_col_sz = winsize.ws_col - (id_col_sz + name_col_sz + 1);
|
||||||
|
|
||||||
db.open();
|
db.open();
|
||||||
|
|
||||||
for(const auto &recipe : db.get_recipes(ingredients, tags))
|
std::cout << std::left << std::setw(id_col_sz) << "ID"
|
||||||
std::cout << recipe.id << " | " << recipe.name << " | " << recipe.description << std::endl;
|
<< std::setw(name_col_sz) << "NAME"
|
||||||
|
<< std::setw(desc_col_sz) << "DESCRIPTION" << std::endl;
|
||||||
|
|
||||||
|
for(const auto &recipe : db.get_recipes(ingredients, tags)) {
|
||||||
|
std::cout << std::left << std::setw(id_col_sz) << recipe.id
|
||||||
|
<< std::setw(name_col_sz) << recipe.name
|
||||||
|
<< std::setw(desc_col_sz) << recipe.description << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
db.close();
|
db.close();
|
||||||
|
|
||||||
|
24
src/main.cpp
24
src/main.cpp
@ -39,39 +39,63 @@ int main(int argc, char *argv[]) {
|
|||||||
try {
|
try {
|
||||||
switch(id) {
|
switch(id) {
|
||||||
case CMD_ADD:
|
case CMD_ADD:
|
||||||
|
if(argc not_eq 2)
|
||||||
|
throw "Invalid number of arguments. Use 'help' subcommand for more information.";
|
||||||
ret = cmd_add();
|
ret = cmd_add();
|
||||||
break;
|
break;
|
||||||
case CMD_DEL:
|
case CMD_DEL:
|
||||||
|
if(argc not_eq 3)
|
||||||
|
throw "Invalid number of arguments. Use 'help' subcommand for more information.";
|
||||||
ret = cmd_delete(argc - 2, argv + 2);
|
ret = cmd_delete(argc - 2, argv + 2);
|
||||||
break;
|
break;
|
||||||
case CMD_LIST:
|
case CMD_LIST:
|
||||||
|
if(argc > 6)
|
||||||
|
throw "Invalid number of arguments. Use 'help' subcommand for more information.";
|
||||||
ret = cmd_list(argc - 1, argv + 1);
|
ret = cmd_list(argc - 1, argv + 1);
|
||||||
break;
|
break;
|
||||||
case CMD_INFO:
|
case CMD_INFO:
|
||||||
|
if(argc not_eq 3)
|
||||||
|
throw "Invalid number of arguments. Use 'help' subcommand for more information.";
|
||||||
ret = cmd_info(std::stoi(argv[2]));
|
ret = cmd_info(std::stoi(argv[2]));
|
||||||
break;
|
break;
|
||||||
case CMD_EDIT_NAME:
|
case CMD_EDIT_NAME:
|
||||||
|
if(argc not_eq 3)
|
||||||
|
throw "Invalid number of arguments. Use 'help' subcommand for more information.";
|
||||||
ret = cmd_edit_name(std::stoi(argv[2]));
|
ret = cmd_edit_name(std::stoi(argv[2]));
|
||||||
break;
|
break;
|
||||||
case CMD_EDIT_DESC:
|
case CMD_EDIT_DESC:
|
||||||
|
if(argc not_eq 3)
|
||||||
|
throw "Invalid number of arguments. Use 'help' subcommand for more information.";
|
||||||
ret = cmd_edit_desc(std::stoi(argv[2]));
|
ret = cmd_edit_desc(std::stoi(argv[2]));
|
||||||
break;
|
break;
|
||||||
case CMD_ADD_INGR:
|
case CMD_ADD_INGR:
|
||||||
|
if(argc not_eq 4)
|
||||||
|
throw "Invalid number of arguments. Use 'help' subcommand for more information.";
|
||||||
ret = cmd_add_ingr(std::stoi(argv[2]), argv[3]);
|
ret = cmd_add_ingr(std::stoi(argv[2]), argv[3]);
|
||||||
break;
|
break;
|
||||||
case CMD_RM_INGR:
|
case CMD_RM_INGR:
|
||||||
|
if(argc not_eq 4)
|
||||||
|
throw "Invalid number of arguments. Use 'help' subcommand for more information.";
|
||||||
ret = cmd_rm_ingr(std::stoi(argv[2]), argv[3]);
|
ret = cmd_rm_ingr(std::stoi(argv[2]), argv[3]);
|
||||||
break;
|
break;
|
||||||
case CMD_ADD_TAG:
|
case CMD_ADD_TAG:
|
||||||
|
if(argc not_eq 4)
|
||||||
|
throw "Invalid number of arguments. Use 'help' subcommand for more information.";
|
||||||
ret = cmd_add_tag(std::stoi(argv[2]), argv[3]);
|
ret = cmd_add_tag(std::stoi(argv[2]), argv[3]);
|
||||||
break;
|
break;
|
||||||
case CMD_RM_TAG:
|
case CMD_RM_TAG:
|
||||||
|
if(argc not_eq 4)
|
||||||
|
throw "Invalid number of arguments. Use 'help' subcommand for more information.";
|
||||||
ret = cmd_rm_tag(std::stoi(argv[2]), argv[3]);
|
ret = cmd_rm_tag(std::stoi(argv[2]), argv[3]);
|
||||||
break;
|
break;
|
||||||
case CMD_HELP:
|
case CMD_HELP:
|
||||||
|
if(argc not_eq 2)
|
||||||
|
throw "Invalid number of arguments. Use 'help' subcommand for more information.";
|
||||||
print_help();
|
print_help();
|
||||||
break;
|
break;
|
||||||
case CMD_VERSION:
|
case CMD_VERSION:
|
||||||
|
if(argc not_eq 2)
|
||||||
|
throw "Invalid number of arguments. Use 'help' subcommand for more information.";
|
||||||
print_version();
|
print_version();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
Reference in New Issue
Block a user