1212# See the License for the specific language governing permissions and
1313# limitations under the License.
1414
15+ import argparse
1516import sys
1617
1718from rcl_interfaces .msg import Parameter
2829from 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+
3144class 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