| 
									
										
										
										
											2016-02-03 23:01:32 +08:00
										 |  |  | ## The contents of this file are subject to the Mozilla Public License | 
					
						
							|  |  |  | ## Version 1.1 (the "License"); you may not use this file except in | 
					
						
							|  |  |  | ## compliance with the License. You may obtain a copy of the License | 
					
						
							|  |  |  | ## at http://www.mozilla.org/MPL/ | 
					
						
							|  |  |  | ## | 
					
						
							|  |  |  | ## Software distributed under the License is distributed on an "AS IS" | 
					
						
							|  |  |  | ## basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See | 
					
						
							|  |  |  | ## the License for the specific language governing rights and | 
					
						
							|  |  |  | ## limitations under the License. | 
					
						
							|  |  |  | ## | 
					
						
							|  |  |  | ## The Original Code is RabbitMQ. | 
					
						
							|  |  |  | ## | 
					
						
							|  |  |  | ## The Initial Developer of the Original Code is GoPivotal, Inc. | 
					
						
							|  |  |  | ## Copyright (c) 2007-2016 Pivotal Software, Inc.  All rights reserved. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-03 02:54:36 +08:00
										 |  |  | defmodule Parser do | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-03 23:15:43 +08:00
										 |  |  |   # Input: A list of strings | 
					
						
							| 
									
										
										
										
											2016-05-05 18:05:11 +08:00
										 |  |  |   # Output: A 2-tuple of lists: one containing the command, | 
					
						
							| 
									
										
										
										
											2016-02-03 23:15:43 +08:00
										 |  |  |   #         one containing flagged options. | 
					
						
							| 
									
										
										
										
											2016-02-03 02:54:36 +08:00
										 |  |  |   def parse(command) do | 
					
						
							| 
									
										
										
										
											2016-05-05 04:21:18 +08:00
										 |  |  |     {options, cmd, invalid} = OptionParser.parse( | 
					
						
							| 
									
										
										
										
											2016-02-03 02:54:36 +08:00
										 |  |  |       command, | 
					
						
							| 
									
										
										
										
											2016-06-08 22:19:37 +08:00
										 |  |  |       switches: build_switches([node: :atom, | 
					
						
							|  |  |  |                                 quiet: :boolean, | 
					
						
							|  |  |  |                                 timeout: :integer, | 
					
						
							|  |  |  |                                 vhost: :string, | 
					
						
							|  |  |  |                                 longnames: :boolean]), | 
					
						
							|  |  |  |       aliases: [p: :vhost, n: :node, q: :quiet, t: :timeout, l: :longnames] | 
					
						
							| 
									
										
										
										
											2016-02-03 02:54:36 +08:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2016-05-27 05:02:10 +08:00
										 |  |  |     {clear_on_empty_command(cmd), options_map(options), invalid} | 
					
						
							| 
									
										
										
										
											2016-02-03 02:54:36 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-27 16:46:52 +08:00
										 |  |  |   defp build_switches(default) do | 
					
						
							| 
									
										
										
										
											2016-05-27 05:02:10 +08:00
										 |  |  |     Enum.reduce(Helpers.commands, | 
					
						
							| 
									
										
										
										
											2016-05-27 16:46:52 +08:00
										 |  |  |                 default, | 
					
						
							| 
									
										
										
										
											2016-06-02 22:36:52 +08:00
										 |  |  |                 fn({_, _}, {:error, _} = err) -> err; | 
					
						
							| 
									
										
										
										
											2016-05-27 06:50:06 +08:00
										 |  |  |                   ({_, command}, switches) -> | 
					
						
							|  |  |  |                     command_switches = command.switches() | 
					
						
							|  |  |  |                     case Enum.filter(command_switches, | 
					
						
							|  |  |  |                                      fn({key, val}) -> | 
					
						
							| 
									
										
										
										
											2016-05-27 16:46:52 +08:00
										 |  |  |                                        existing_val = switches[key] | 
					
						
							|  |  |  |                                        existing_val != nil and existing_val != val | 
					
						
							| 
									
										
										
										
											2016-05-27 06:50:06 +08:00
										 |  |  |                                      end) do | 
					
						
							|  |  |  |                       [] -> switches ++ command_switches; | 
					
						
							|  |  |  |                       _  -> exit({:command_invalid, | 
					
						
							|  |  |  |                                   {command, {:invalid_switches, | 
					
						
							|  |  |  |                                              command_switches}}}) | 
					
						
							|  |  |  |                     end | 
					
						
							| 
									
										
										
										
											2016-05-27 05:02:10 +08:00
										 |  |  |                 end) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   defp options_map(opts) do | 
					
						
							|  |  |  |     opts | 
					
						
							| 
									
										
										
										
											2016-05-05 04:21:18 +08:00
										 |  |  |     |> Map.new | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2016-02-03 23:15:43 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-03 05:26:10 +08:00
										 |  |  |   # Discards entire command if first command term is empty. | 
					
						
							| 
									
										
										
										
											2016-02-03 02:54:36 +08:00
										 |  |  |   defp clear_on_empty_command(command_args) do | 
					
						
							|  |  |  |     case command_args do | 
					
						
							|  |  |  |       [] -> [] | 
					
						
							|  |  |  |       [""|_] -> [] | 
					
						
							| 
									
										
										
										
											2016-03-04 00:06:30 +08:00
										 |  |  |       [_head|_] -> command_args | 
					
						
							| 
									
										
										
										
											2016-02-03 02:54:36 +08:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |