From 06b2428c2afaa36997a9d341bd497d42aa0fef89 Mon Sep 17 00:00:00 2001 From: Egor Tensin Date: Tue, 20 Jun 2017 18:22:00 +0300 Subject: utils: refactor command-line arguments parsing + update usage messages. --- utils/file_cmd_parser.hpp | 129 ++++++++++++++++++++-------------------------- 1 file changed, 55 insertions(+), 74 deletions(-) (limited to 'utils/file_cmd_parser.hpp') 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 @@ -16,87 +17,67 @@ #include #include -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(&algorithm) + ->required() + ->value_name("NAME"), + "set algorithm") + ("mode,m", + boost::program_options::value(&mode) + ->required() + ->value_name("MODE"), + "set mode of operation") + ("key,k", + boost::program_options::value(&key) + ->required() + ->value_name("KEY"), + "set encryption key") + ("iv,v", + boost::program_options::value(&iv) + ->value_name("BLOCK"), + "set initialization vector") + ("input,i", + boost::program_options::value(&input_path) + ->required() + ->value_name("PATH"), + "set input file path") + ("output,o", + boost::program_options::value(&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(&settings.mode)->required(), "set mode of operation") - ("algorithm,a", po::value(&settings.algorithm)->required(), "set algorithm") - ("input,i", po::value(&settings.input_path)->required(), "set input file path") - ("output,o", po::value(&settings.output_path)->required(), "set output file path") - ("key,k", po::value(&settings.key)->required(), "set encryption key") - ("iv,v", po::value(&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"; } -} +}; -- cgit v1.2.3