Zeth - Zerocash on Ethereum  0.8
Reference implementation of the Zeth protocol by Clearmatics
subcommand.tcc
Go to the documentation of this file.
1 // Copyright (c) 2015-2022 Clearmatics Technologies Ltd
2 //
3 // SPDX-License-Identifier: LGPL-3.0+
4 
5 #ifndef __ZETH_LIBTOOL_SUBCOMMAND_TCC__
6 #define __ZETH_LIBTOOL_SUBCOMMAND_TCC__
7 
8 #include "libtool/subcommand.hpp"
9 
10 #include <iostream>
11 
12 namespace libtool
13 {
14 
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)
19 {
20 }
21 
22 template<typename GlobalOptionsT> subcommand<GlobalOptionsT>::~subcommand() {}
23 
24 template<typename GlobalOptionsT>
25 const std::string &subcommand<GlobalOptionsT>::description() const
26 {
27  return subcommand_description;
28 }
29 
30 template<typename GlobalOptionsT>
31 int subcommand<GlobalOptionsT>::execute(
32  const char *argv0,
33  const std::vector<std::string> command_args,
34  const GlobalOptionsT &global)
35 {
36  po::options_description options_desc("Options");
37  po::options_description all_options_desc("");
38  po::positional_options_description positional_options_desc;
39 
40  try {
41  // Common options
42  options_desc.add_options()("help,h", "This help");
43 
44  // Subcommand options
45  initialize_suboptions(
46  options_desc, all_options_desc, positional_options_desc);
47 
48  // Send parsed structure to subcommand-specific so it can initialize
49  // itself.
50  po::variables_map vm;
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)
57  .run();
58  po::store(parsed, vm);
59 
60  // If help was specified, print the usage and exit.
61  if (vm.count("help")) {
62  usage(argv0, options_desc);
63  return 0;
64  }
65 
66  // Otherwise, give the parsed options to the subcommand and execute.
67  parse_suboptions(vm);
68  return execute_subcommand(global);
69  } catch (po::error &error) {
70  std::cerr << "error: " << error.what() << "\n\n";
71  usage(argv0, options_desc);
72  return 1;
73  } catch (std::invalid_argument &error) {
74  std::cerr << "error: " << error.what() << "\n";
75  return 1;
76  }
77 }
78 
79 template<typename GlobalOptionsT>
80 void subcommand<GlobalOptionsT>::usage(
81  const char *argv0,
82  const boost::program_options::options_description &options)
83 {
84  subcommand_usage(argv0);
85  std::cout << "\n" << description() << "\n\n";
86  std::cout << options << std::endl;
87 }
88 
89 } // namespace libtool
90 
91 #endif // __ZETH_LIBTOOL_SUBCOMMAND_TCC__