Skip to content

Commit 2e90009

Browse files
committed
standardize argument errors & address pr comments
Signed-off-by: Brian Chen <brian.chen@openrobotics.org>
1 parent dfb3b8b commit 2e90009

File tree

1 file changed

+26
-23
lines changed
  • ros2param/ros2param/verb

1 file changed

+26
-23
lines changed

ros2param/ros2param/verb/set.py

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15+
import argparse
1516
import sys
1617

1718
from rcl_interfaces.msg import Parameter
@@ -28,6 +29,18 @@
2829
from ros2param.verb import VerbExtension
2930

3031

32+
class RequireParameterPairAction(argparse.Action):
33+
"""Argparse action to validate parameter argument pairs."""
34+
35+
def __call__(self, parser, args, values, option_string=None):
36+
if len(values) == 0:
37+
parser.error('No parameters specified')
38+
SystemExit(2)
39+
if len(values) % 2:
40+
parser.error('Must provide parameter name and value pairs')
41+
setattr(args, self.dest, values)
42+
43+
3144
class SetVerb(VerbExtension):
3245
"""Set parameter."""
3346

@@ -37,26 +50,22 @@ def add_arguments(self, parser, cli_name): # noqa: D102
3750
'node_name', help='Name of the ROS node')
3851
arg.completer = NodeNameCompleter(
3952
include_hidden_nodes_key='include_hidden_nodes')
40-
53+
parser.add_argument(
54+
'--include-hidden-nodes', action='store_true',
55+
help='Consider hidden nodes as well')
4156
arg = parser.add_argument(
4257
'parameters', nargs='*',
58+
action=RequireParameterPairAction,
4359
help='List of parameter name and value pairs i.e. "int_param 1 str_param hello_world"')
4460
arg.completer = ParameterNameCompleter()
4561

46-
parser.add_argument(
47-
'--include-hidden-nodes', action='store_true',
48-
help='Consider hidden nodes as well')
49-
5062
def build_parameters(self, params):
5163
parameters = []
52-
if len(params) % 2:
53-
raise RuntimeError('Must pass list of parameter name and value pairs')
5464

55-
params = [(params[i], params[i+1]) for i in range(0, len(params), 2)]
56-
for param_str in params:
65+
for i in range(0, len(params), 2):
5766
parameter = Parameter()
58-
parameter.name = param_str[0]
59-
parameter.value = get_parameter_value(string_value=param_str[1])
67+
parameter.name = params[i]
68+
parameter.value = get_parameter_value(string_value=params[i+1])
6069
parameters.append(parameter)
6170

6271
return parameters
@@ -65,8 +74,8 @@ def main(self, *, args): # noqa: D102
6574
with NodeStrategy(args) as node:
6675
node_names = get_node_names(
6776
node=node, include_hidden_nodes=args.include_hidden_nodes)
68-
6977
node_name = get_absolute_node_name(args.node_name)
78+
7079
if node_name not in {n.full_name for n in node_names}:
7180
return 'Node not found'
7281

@@ -76,14 +85,8 @@ def main(self, *, args): # noqa: D102
7685
node=node, node_name=args.node_name, parameters=parameters)
7786
results = response.results
7887

79-
for result in results:
80-
if result.successful:
81-
msg = 'Set parameter successful'
82-
if result.reason:
83-
msg += ': ' + result.reason
84-
print(msg)
85-
else:
86-
msg = 'Setting parameter failed'
87-
if result.reason:
88-
msg += ': ' + result.reason
89-
print(msg, file=sys.stderr)
88+
for i, result in enumerate(results):
89+
print('Set parameter ' + parameters[i].name + ' ' +
90+
'successful' if result.successful else 'failed' +
91+
str(result.reason) if result.reason else '',
92+
file=sys.stderr if result.successful else sys.stdout)

0 commit comments

Comments
 (0)