def _create_parser() -> CustomArgumentParser:
        parser = CustomArgumentParser(
            description='directory administration tool',
            formatter_class=ArgumentDefaultsHelpFormatter
        )
        subparsers = parser.add_subparsers()
        Parser._add_user_child_parser(subparsers)
        Parser._add_status_child_parser(subparsers)

        return parser
 def __init__(self, arguments: list) -> None:
     self.parser = CustomArgumentParser(
         description='directory administration tool',
         formatter_class=ArgumentDefaultsHelpFormatter)
     subparsers = self.parser.add_subparsers()
     self.add_user_child_parser(subparsers)
     self.add_group_child_parser(subparsers)
     self.add_unit_child_parser(subparsers)
     self.add_status_child_parser(subparsers)
     self.add_authenticate_child_parser(subparsers)
     self.parsed_arguments = self.parser.parse_args(arguments)
 def add_authenticate_child_parser(subparsers) -> None:
     authenticate_parent = CustomArgumentParser(add_help=False)
     authenticate_parser = subparsers.add_parser(
         'authenticate',
         parents=[authenticate_parent],
         help='authenticate a user')
     authenticate_parser.add_argument('authenticate', action='store_true')
     authenticate_parser.add_argument('--name', required=True)
     authenticate_parser.add_argument('--password', default='')
    def create_parser() -> CustomArgumentParser:
        parser = CustomArgumentParser(
            description='host configuration tool',
            formatter_class=ArgumentDefaultsHelpFormatter
        )
        subparsers = parser.add_subparsers()
        HostConfigMain.add_host_parser(subparsers)
        HostConfigMain.add_service_parser(subparsers)

        parser.add_argument(
            '--dry-run',
            action='store_true',
            help='do not save changes'
        )
        parser.add_argument(
            '--host-file',
            help='path to host file',
            default='/srv/salt/pillar/host.sls'
        )

        return parser
    def add_host_parser(subparsers) -> None:
        host_parent = CustomArgumentParser(add_help=False)
        host_parser = subparsers.add_parser(
            'host',
            parents=[host_parent],
            help='manage hosts'
        )
        host_parser.add_argument('host', action='store_true')
        host_subparsers = host_parser.add_subparsers()

        add_parent = CustomArgumentParser(add_help=False)
        add_parent.add_argument('--name', required=True)
        add_parent.add_argument('--logical-address', required=True)
        add_parent.add_argument('--physical-address', required=True)
        add_parent.add_argument(
            '--canonical-names',
            nargs='+',
            metavar='CANONICAL_NAME',
        )
        add_parent.add_argument(
            '--catch-all-domains',
            nargs='+',
            metavar='CATCH_ALL_DOMAIN'
        )
        add_parser = host_subparsers.add_parser(
            'add',
            parents=[add_parent],
            help='add or update a host'
        )
        add_parser.add_argument('add', action='store_true')

        delete_parent = CustomArgumentParser(add_help=False)
        delete_parent.add_argument('--name', required=True)
        delete_parser = host_subparsers.add_parser(
            'delete',
            parents=[delete_parent],
            help='delete a host'
        )
        delete_parser.add_argument('delete', action='store_true')

        sort_parser = host_subparsers.add_parser(
            'sort',
            help='sort the host file'
        )
        sort_parser.add_argument('sort', action='store_true')

        list_parser = host_subparsers.add_parser('list', help='list all hosts')
        list_parser.add_argument('list', action='store_true')
    def _add_user_child_parser(subparsers) -> None:
        user_parent = CustomArgumentParser(add_help=False)
        user_parser = subparsers.add_parser(
            'user',
            parents=[user_parent],
            help='manage users'
        )
        user_parser.add_argument('user', action='store_true')
        user_subparsers = user_parser.add_subparsers()

        add_parent = CustomArgumentParser(add_help=False)
        add_parent.add_argument('--user-name')
        add_parent.add_argument('--full-name', required=True)
        add_parent.add_argument('--password', required=True)
        add_parent.add_argument('--mail', required=True)
        add_parent.add_argument(
            '--groups',
            nargs='+',
            metavar='GROUP',
        )
        add_parser = user_subparsers.add_parser(
            'add',
            parents=[add_parent],
            help='add a user'
        )
        add_parser.add_argument('add', action='store_true')

        delete_parent = CustomArgumentParser(add_help=False)
        delete_parent.add_argument('--user-name', required=True)
        delete_parent.add_argument('--full-name', required=True)
        delete_parser = user_subparsers.add_parser(
            'delete',
            parents=[delete_parent],
            help='delete a user'
        )
        delete_parser.add_argument('delete', action='store_true')

        search_parent = CustomArgumentParser(add_help=False)
        search_group = search_parent.add_mutually_exclusive_group(required=True)
        search_group.add_argument('--user-name')
        search_group.add_argument('--full-name')
        search_parser = user_subparsers.add_parser(
            'search',
            parents=[search_parent],
            help='search for users'
        )
        search_parser.add_argument('search', action='store_true')

        list_parser = user_subparsers.add_parser('list', help='list all users')
        list_parser.add_argument('list', action='store_true')
    def add_unit_child_parser(subparsers) -> None:
        unit_parent = CustomArgumentParser(add_help=False)
        unit_parser = subparsers.add_parser('unit',
                                            parents=[unit_parent],
                                            help='manage units')
        unit_parser.add_argument('unit', action='store_true')
        unit_subparsers = unit_parser.add_subparsers()

        add_parent = CustomArgumentParser(add_help=False)
        add_parent.add_argument('--name', required=True)
        add_parser = unit_subparsers.add_parser('add',
                                                parents=[add_parent],
                                                help='add a unit')
        add_parser.add_argument('add', action='store_true')

        remove_parent = CustomArgumentParser(add_help=False)
        remove_parent.add_argument('--name', required=True)
        remove_parser = unit_subparsers.add_parser('remove',
                                                   parents=[remove_parent],
                                                   help='remove a unit')
        remove_parser.add_argument('remove', action='store_true')

        show_parent = CustomArgumentParser(add_help=False)
        show_parent.add_argument('--name', required=True)
        show_parser = unit_subparsers.add_parser('show',
                                                 parents=[show_parent],
                                                 help='show a unit')
        show_parser.add_argument('show', action='store_true')

        list_parser = unit_subparsers.add_parser('list', help='list all units')
        list_parser.add_argument('list', action='store_true')
    def add_group_child_parser(subparsers) -> None:
        group_parent = CustomArgumentParser(add_help=False)
        group_parser = subparsers.add_parser('group',
                                             parents=[group_parent],
                                             help='manage groups')
        group_parser.add_argument('group', action='store_true')
        group_subparsers = group_parser.add_subparsers()

        add_parent = CustomArgumentParser(add_help=False)
        add_parent.add_argument('--name', required=True)
        add_parser = group_subparsers.add_parser('add',
                                                 parents=[add_parent],
                                                 help='add a group')
        add_parser.add_argument('add', action='store_true')

        remove_parent = CustomArgumentParser(add_help=False)
        remove_parent.add_argument('--name', required=True)
        remove_parser = group_subparsers.add_parser('remove',
                                                    parents=[remove_parent],
                                                    help='remove a group')
        remove_parser.add_argument('remove', action='store_true')

        show_parent = CustomArgumentParser(add_help=False)
        show_parent.add_argument('--name', required=True)
        show_parser = group_subparsers.add_parser('show',
                                                  parents=[show_parent],
                                                  help='show a group')
        show_parser.add_argument('show', action='store_true')

        list_parser = group_subparsers.add_parser('list',
                                                  help='list all groups')
        list_parser.add_argument('list', action='store_true')
class Parser:
    def __init__(self, arguments: list) -> None:
        self.parser = CustomArgumentParser(
            description='directory administration tool',
            formatter_class=ArgumentDefaultsHelpFormatter)
        subparsers = self.parser.add_subparsers()
        self.add_user_child_parser(subparsers)
        self.add_group_child_parser(subparsers)
        self.add_unit_child_parser(subparsers)
        self.add_status_child_parser(subparsers)
        self.add_authenticate_child_parser(subparsers)
        self.parsed_arguments = self.parser.parse_args(arguments)

    def print_help(self) -> None:
        self.parser.print_help()

    @staticmethod
    def add_user_child_parser(subparsers) -> None:
        user_parent = CustomArgumentParser(add_help=False)
        user_parser = subparsers.add_parser('user',
                                            parents=[user_parent],
                                            help='manage users')
        user_parser.add_argument('user', action='store_true')
        user_subparsers = user_parser.add_subparsers()

        add_parent = CustomArgumentParser(add_help=False)
        add_parent.add_argument('--name', required=True)
        add_parent.add_argument('--first-name', required=True)
        add_parent.add_argument('--last-name', required=True)
        add_parent.add_argument('--password', required=True)
        add_parent.add_argument('--email', required=True)
        add_parser = user_subparsers.add_parser('add',
                                                parents=[add_parent],
                                                help='add a user')
        add_parser.add_argument('add', action='store_true')

        remove_parent = CustomArgumentParser(add_help=False)
        remove_parent.add_argument('--name', required=True)
        remove_parser = user_subparsers.add_parser('remove',
                                                   parents=[remove_parent],
                                                   help='remove a user')
        remove_parser.add_argument('remove', action='store_true')

        show_parent = CustomArgumentParser(add_help=False)
        show_parent.add_argument('--name', required=True)
        show_parser = user_subparsers.add_parser('show',
                                                 parents=[show_parent],
                                                 help='show a user')
        show_parser.add_argument('show', action='store_true')

        list_parser = user_subparsers.add_parser('list', help='list all users')
        list_parser.add_argument('list', action='store_true')

    @staticmethod
    def add_group_child_parser(subparsers) -> None:
        group_parent = CustomArgumentParser(add_help=False)
        group_parser = subparsers.add_parser('group',
                                             parents=[group_parent],
                                             help='manage groups')
        group_parser.add_argument('group', action='store_true')
        group_subparsers = group_parser.add_subparsers()

        add_parent = CustomArgumentParser(add_help=False)
        add_parent.add_argument('--name', required=True)
        add_parser = group_subparsers.add_parser('add',
                                                 parents=[add_parent],
                                                 help='add a group')
        add_parser.add_argument('add', action='store_true')

        remove_parent = CustomArgumentParser(add_help=False)
        remove_parent.add_argument('--name', required=True)
        remove_parser = group_subparsers.add_parser('remove',
                                                    parents=[remove_parent],
                                                    help='remove a group')
        remove_parser.add_argument('remove', action='store_true')

        show_parent = CustomArgumentParser(add_help=False)
        show_parent.add_argument('--name', required=True)
        show_parser = group_subparsers.add_parser('show',
                                                  parents=[show_parent],
                                                  help='show a group')
        show_parser.add_argument('show', action='store_true')

        list_parser = group_subparsers.add_parser('list',
                                                  help='list all groups')
        list_parser.add_argument('list', action='store_true')

    @staticmethod
    def add_unit_child_parser(subparsers) -> None:
        unit_parent = CustomArgumentParser(add_help=False)
        unit_parser = subparsers.add_parser('unit',
                                            parents=[unit_parent],
                                            help='manage units')
        unit_parser.add_argument('unit', action='store_true')
        unit_subparsers = unit_parser.add_subparsers()

        add_parent = CustomArgumentParser(add_help=False)
        add_parent.add_argument('--name', required=True)
        add_parser = unit_subparsers.add_parser('add',
                                                parents=[add_parent],
                                                help='add a unit')
        add_parser.add_argument('add', action='store_true')

        remove_parent = CustomArgumentParser(add_help=False)
        remove_parent.add_argument('--name', required=True)
        remove_parser = unit_subparsers.add_parser('remove',
                                                   parents=[remove_parent],
                                                   help='remove a unit')
        remove_parser.add_argument('remove', action='store_true')

        show_parent = CustomArgumentParser(add_help=False)
        show_parent.add_argument('--name', required=True)
        show_parser = unit_subparsers.add_parser('show',
                                                 parents=[show_parent],
                                                 help='show a unit')
        show_parser.add_argument('show', action='store_true')

        list_parser = unit_subparsers.add_parser('list', help='list all units')
        list_parser.add_argument('list', action='store_true')

    @staticmethod
    def add_status_child_parser(subparsers) -> None:
        status_parent = CustomArgumentParser(add_help=False)
        status_parser = subparsers.add_parser('status',
                                              parents=[status_parent],
                                              help='show status information')
        status_parser.add_argument('status', action='store_true')

    @staticmethod
    def add_authenticate_child_parser(subparsers) -> None:
        authenticate_parent = CustomArgumentParser(add_help=False)
        authenticate_parser = subparsers.add_parser(
            'authenticate',
            parents=[authenticate_parent],
            help='authenticate a user')
        authenticate_parser.add_argument('authenticate', action='store_true')
        authenticate_parser.add_argument('--name', required=True)
        authenticate_parser.add_argument('--password', default='')
    def add_user_child_parser(subparsers) -> None:
        user_parent = CustomArgumentParser(add_help=False)
        user_parser = subparsers.add_parser('user',
                                            parents=[user_parent],
                                            help='manage users')
        user_parser.add_argument('user', action='store_true')
        user_subparsers = user_parser.add_subparsers()

        add_parent = CustomArgumentParser(add_help=False)
        add_parent.add_argument('--name', required=True)
        add_parent.add_argument('--first-name', required=True)
        add_parent.add_argument('--last-name', required=True)
        add_parent.add_argument('--password', required=True)
        add_parent.add_argument('--email', required=True)
        add_parser = user_subparsers.add_parser('add',
                                                parents=[add_parent],
                                                help='add a user')
        add_parser.add_argument('add', action='store_true')

        remove_parent = CustomArgumentParser(add_help=False)
        remove_parent.add_argument('--name', required=True)
        remove_parser = user_subparsers.add_parser('remove',
                                                   parents=[remove_parent],
                                                   help='remove a user')
        remove_parser.add_argument('remove', action='store_true')

        show_parent = CustomArgumentParser(add_help=False)
        show_parent.add_argument('--name', required=True)
        show_parser = user_subparsers.add_parser('show',
                                                 parents=[show_parent],
                                                 help='show a user')
        show_parser.add_argument('show', action='store_true')

        list_parser = user_subparsers.add_parser('list', help='list all users')
        list_parser.add_argument('list', action='store_true')
 def add_status_child_parser(subparsers) -> None:
     status_parent = CustomArgumentParser(add_help=False)
     status_parser = subparsers.add_parser('status',
                                           parents=[status_parent],
                                           help='show status information')
     status_parser.add_argument('status', action='store_true')