1 // Copyright (c) 2015-2022 Clearmatics Technologies Ltd
3 // SPDX-License-Identifier: LGPL-3.0+
5 #ifndef __ZETH_LIBTOOL_SUBCOMMAND_TCC__
6 #define __ZETH_LIBTOOL_SUBCOMMAND_TCC__
8 #include "libtool/subcommand.hpp"
15 template<typename GlobalOptionsT>
16 subcommand<GlobalOptionsT>::subcommand(
17 const std::string &subcommand_name, const std::string &description)
18 : subcommand_name(subcommand_name), subcommand_description(description)
22 template<typename GlobalOptionsT> subcommand<GlobalOptionsT>::~subcommand() {}
24 template<typename GlobalOptionsT>
25 const std::string &subcommand<GlobalOptionsT>::description() const
27 return subcommand_description;
30 template<typename GlobalOptionsT>
31 int subcommand<GlobalOptionsT>::execute(
33 const std::vector<std::string> command_args,
34 const GlobalOptionsT &global)
36 po::options_description options_desc("Options");
37 po::options_description all_options_desc("");
38 po::positional_options_description positional_options_desc;
42 options_desc.add_options()("help,h", "This help");
45 initialize_suboptions(
46 options_desc, all_options_desc, positional_options_desc);
48 // Send parsed structure to subcommand-specific so it can initialize
51 po::parsed_options parsed =
52 po::command_line_parser(
53 std::vector<std::string>(
54 command_args.begin() + 1, command_args.end()))
55 .options(all_options_desc)
56 .positional(positional_options_desc)
58 po::store(parsed, vm);
60 // If help was specified, print the usage and exit.
61 if (vm.count("help")) {
62 usage(argv0, options_desc);
66 // Otherwise, give the parsed options to the subcommand and execute.
68 return execute_subcommand(global);
69 } catch (po::error &error) {
70 std::cerr << "error: " << error.what() << "\n\n";
71 usage(argv0, options_desc);
73 } catch (std::invalid_argument &error) {
74 std::cerr << "error: " << error.what() << "\n";
79 template<typename GlobalOptionsT>
80 void subcommand<GlobalOptionsT>::usage(
82 const boost::program_options::options_description &options)
84 subcommand_usage(argv0);
85 std::cout << "\n" << description() << "\n\n";
86 std::cout << options << std::endl;
89 } // namespace libtool
91 #endif // __ZETH_LIBTOOL_SUBCOMMAND_TCC__