Skip to content
86 changes: 86 additions & 0 deletions plugins/module_utils/better_arg_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@ def __init__(self, arg_name, contents, resolved_args, arg_defs):
self.resolved_dependencies = self.build_resolved_dependency_dict(resolved_args)
# TODO: determine if we should optionally allow top-level args to be passed
self.type_handlers = {
"basic_dict": self._basic_dict_type,
"dict": self._dict_type,
"list": self._list_type,
"str": self._str_type,
Expand All @@ -160,6 +161,8 @@ def __init__(self, arg_name, contents, resolved_args, arg_defs):
"data_set": self._data_set_type,
"data_set_base": self._data_set_base_type,
"data_set_member": self._data_set_member_type,
"member_name": self._member_name_type,
"identifier_name": self._identifier_name_type,
"qualifier": self._qualifier_type,
"qualifier_or_empty": self._qualifier_or_empty_type,
"qualifier_pattern": self._qualifier_pattern_type,
Expand All @@ -171,6 +174,29 @@ def __init__(self, arg_name, contents, resolved_args, arg_defs):
"job_identifier": self._job_identifier,
}

def _basic_dict_type(self, contents, resolve_dependencies):
"""Resolver for basic dict type arguments.
Parameters
----------
contents : dict
The contents of the argument.
resolved_dependencies : dict
Contains all of the dependencies and their contents,
which have already been handled,
for use during current arguments handling operations.
Returns
-------
dict
The arguments contents after any necessary operations.
Raises
------
ValueError
When contents is invalid argument type.
"""
if not isinstance(contents, dict):
raise ValueError('Invalid argument "{0}" for type "dict".'.format(contents))
return contents

def handle_arg(self):
"""Performs all setting, formatting and validation operations for a single argument.

Expand Down Expand Up @@ -329,6 +355,66 @@ def _bool_type(self, contents, resolve_dependencies):
raise ValueError('Invalid argument "{0}" for type "bool".'.format(contents))
return contents

def _member_name_type(self, contents, resolve_dependencies):
"""Resolver for PDS/E member name type arguments. This is part of
zos_started_task member name validation.
Parameters
----------
contents : bool
The contents of the argument.
resolved_dependencies : dict
Contains all of the dependencies and their contents,
which have already been handled,
for use during current arguments handling operations.
Returns
-------
str
The arguments contents after any necessary operations.
Raises
------
ValueError
When contents is invalid argument type.
"""
if not fullmatch(
r"^[A-Z$#@]{1}[A-Z0-9$#@]{0,7}$",
str(contents),
IGNORECASE,
):
raise ValueError(
'Invalid argument "{0}" for type "member_name".'.format(contents)
)
return str(contents)

def _identifier_name_type(self, contents, resolve_dependencies):
"""Resolver for identifier name type arguments. This is part of
zos_started_task identifier name validation.
Parameters
----------
contents : bool
The contents of the argument.
resolved_dependencies : dict
Contains all of the dependencies and their contents,
which have already been handled,
for use during current arguments handling operations.
Returns
-------
str
The arguments contents after any necessary operations.
Raises
------
ValueError
When contents is invalid argument type.
"""
if not fullmatch(
r"^[A-Z]{1}[A-Z0-9$#@]{0,7}$",
str(contents),
IGNORECASE,
):
raise ValueError(
'Invalid argument "{0}" for type "identifier_name".'.format(contents)
)
return str(contents)

def _path_type(self, contents, resolve_dependencies):
"""Resolver for path type arguments.

Expand Down
Loading