diff options
author | Egor Tensin <Egor.Tensin@gmail.com> | 2017-06-20 18:22:00 +0300 |
---|---|---|
committer | Egor Tensin <Egor.Tensin@gmail.com> | 2017-06-22 01:38:49 +0300 |
commit | 06b2428c2afaa36997a9d341bd497d42aa0fef89 (patch) | |
tree | ff83476738222578a19b59419fdbaa79a05156d7 /utils/file | |
parent | README update (diff) | |
download | aes-tools-06b2428c2afaa36997a9d341bd497d42aa0fef89.tar.gz aes-tools-06b2428c2afaa36997a9d341bd497d42aa0fef89.zip |
utils: refactor command-line arguments parsing
+ update usage messages.
Diffstat (limited to '')
-rw-r--r-- | utils/file_cmd_parser.hpp | 129 |
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"; } -} +}; |