aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/utils/file_cmd_parser.hpp
diff options
context:
space:
mode:
authorEgor Tensin <Egor.Tensin@gmail.com>2017-06-20 18:22:00 +0300
committerEgor Tensin <Egor.Tensin@gmail.com>2017-06-22 01:38:49 +0300
commit06b2428c2afaa36997a9d341bd497d42aa0fef89 (patch)
treeff83476738222578a19b59419fdbaa79a05156d7 /utils/file_cmd_parser.hpp
parentREADME update (diff)
downloadaes-tools-06b2428c2afaa36997a9d341bd497d42aa0fef89.tar.gz
aes-tools-06b2428c2afaa36997a9d341bd497d42aa0fef89.zip
utils: refactor command-line arguments parsing
+ update usage messages.
Diffstat (limited to 'utils/file_cmd_parser.hpp')
-rw-r--r--utils/file_cmd_parser.hpp129
1 files changed, 55 insertions, 74 deletions
diff --git a/utils/file_cmd_parser.hpp b/utils/file_cmd_parser.hpp
index e9cdaae..e199409 100644
--- a/utils/file_cmd_parser.hpp
+++ b/utils/file_cmd_parser.hpp
@@ -6,6 +6,7 @@
#pragma once
#include "data_parsers.hpp"
+#include "helpers/command_line.hpp"
#include <aesxx/all.hpp>
@@ -16,87 +17,67 @@
#include <string>
#include <utility>
-namespace
+class FileSettings : public command_line::SettingsParser
{
- class CommandLineParser;
+public:
+ aes::Algorithm algorithm = AES_AES128;
+ aes::Mode mode = AES_ECB;
- class Settings
- {
- public:
- aes::Algorithm algorithm = AES_AES128;
- aes::Mode mode = AES_ECB;
-
- std::string input_path;
- std::string output_path;
- std::string key;
- std::string iv;
+ std::string input_path;
+ std::string output_path;
+ std::string key;
+ std::string iv;
- private:
- Settings() = default;
+ explicit FileSettings(const std::string& argv0)
+ : SettingsParser{argv0}
+ {
+ visible.add_options()
+ ("algorithm,a",
+ boost::program_options::value<aes::Algorithm>(&algorithm)
+ ->required()
+ ->value_name("NAME"),
+ "set algorithm")
+ ("mode,m",
+ boost::program_options::value<aes::Mode>(&mode)
+ ->required()
+ ->value_name("MODE"),
+ "set mode of operation")
+ ("key,k",
+ boost::program_options::value<std::string>(&key)
+ ->required()
+ ->value_name("KEY"),
+ "set encryption key")
+ ("iv,v",
+ boost::program_options::value<std::string>(&iv)
+ ->value_name("BLOCK"),
+ "set initialization vector")
+ ("input,i",
+ boost::program_options::value<std::string>(&input_path)
+ ->required()
+ ->value_name("PATH"),
+ "set input file path")
+ ("output,o",
+ boost::program_options::value<std::string>(&output_path)
+ ->required()
+ ->value_name("PATH"),
+ "set output file path");
+ }
- friend class CommandLineParser;
- };
+ const char* get_short_description() const override
+ {
+ return "[-h|--help] [-a|--algorithm NAME] [-m|--mode MODE]"
+ " [-k|--key KEY] [-v|--iv BLOCK]"
+ " [-i|--input PATH] [-o|--output PATH]";
+ }
- class CommandLineParser
+ void parse(int argc, char** argv) override
{
- public:
- explicit CommandLineParser(const std::string& argv0)
- : prog_name{boost::filesystem::path{argv0}.filename().string()}
- , options{"Options"}
- { }
+ SettingsParser::parse(argc, argv);
- Settings parse(int argc, char** argv)
+ if (aes::mode_requires_init_vector(mode) && iv.empty())
{
- Settings settings;
-
- namespace po = boost::program_options;
-
- options.add_options()
- ("help,h", "show this message and exit")
- ("mode,m", po::value<aes::Mode>(&settings.mode)->required(), "set mode of operation")
- ("algorithm,a", po::value<aes::Algorithm>(&settings.algorithm)->required(), "set algorithm")
- ("input,i", po::value<std::string>(&settings.input_path)->required(), "set input file path")
- ("output,o", po::value<std::string>(&settings.output_path)->required(), "set output file path")
- ("key,k", po::value<std::string>(&settings.key)->required(), "set encryption key")
- ("iv,v", po::value<std::string>(&settings.iv), "set initialization vector");
-
- po::variables_map vm;
- po::store(po::parse_command_line(argc, argv, options), vm);
-
- if (vm.count("help"))
- {
- help_flag = true;
- return settings;
- }
-
- po::notify(vm);
-
- if (aes::mode_requires_init_vector(settings.mode))
- {
- if (!vm.count("iv"))
- {
- throw boost::program_options::error(
- "an initialization vector is required for the selected mode of operation");
- }
- }
-
- return settings;
+ throw boost::program_options::error{
+ "an initialization vector is required for the selected mode of operation"};
}
-
- bool exit_with_usage() const { return help_flag; }
-
- private:
- const std::string prog_name;
- boost::program_options::options_description options;
-
- bool help_flag = false;
-
- friend std::ostream& operator<<(std::ostream&, const CommandLineParser&);
- };
-
- std::ostream& operator<<(std::ostream& os, const CommandLineParser& cmd_parser)
- {
- return os << "Usage: " << cmd_parser.prog_name << " [OPTION...]\n"
- << cmd_parser.options << "\n";
}
-}
+};