78 def _make_parser(self, **kwargs):
79 """Create and register a subparser for this command."""
80
81 kwargs.setdefault('help', self.help)
82 kwargs.setdefault('formatter_class',argparse.RawDescriptionHelpFormatter)
83 kwargs.setdefault('description', self.description)
84 kwargs.setdefault('name', self.name)
85 names = (kwargs.get(
'name')
or self.name).
split(
'.')
86
87 def _get_subparser(a):
88 if a._subparsers:
89 for action in a._subparsers._actions:
90 if isinstance(action, argparse._SubParsersAction):
91 return action
92 raise RuntimeError('could not find adequate subparser')
93 return a.add_subparsers(dest='command',
94 title='commands',
95 metavar='COMMAND',
96 required=True,
97 )
98 def _get_parser(node, name):
99 if name in node.choices:
100 return node.choices[name]
101 args = {
102 'name' : name,
103 'help' : 'a group of sub-commands',
104 }
105 return node.add_parser(**args)
106
107 parser = ACMD_PARSER
108 for name in names[:-1]:
109 node = _get_subparser(parser)
110 parser = _get_parser(node, name)
111
112 node = _get_subparser(parser)
113 kwargs['name'] = names[-1]
114 parser = node.add_parser(**kwargs)
115 return parser
116
std::vector< std::string > split(const std::string &s, const std::string &t=":")