THRIFT-2753 Haxe support: Misc. improvements
Client: Haxe
Patch: Jens Geyer

This closes #229
diff --git a/test/haxe/src/Arguments.hx b/test/haxe/src/Arguments.hx
index bcf3793..ae23fa1 100644
--- a/test/haxe/src/Arguments.hx
+++ b/test/haxe/src/Arguments.hx
@@ -24,34 +24,49 @@
 import org.apache.thrift.transport.*;
 import org.apache.thrift.server.*;
 import org.apache.thrift.meta_data.*;
+import haxe.io.Path;
 
 using StringTools;
 
 
-enum Prot {
+enum ProtocolType {
 	binary;
 	json;
 }
 
-enum Trns {
+enum EndpointTransport {
 	socket;
-	http;
+	http;	
+}
+
+enum ServerType {
+	simple;
+	/*
+	threadpool;	
+	threaded;
+	nonblocking;
+	*/
 }
 
 
 class Arguments
 {
+	public var printHelpOnly(default,null) : Bool = false;
+
 	public var server(default,null) : Bool = false;
-	public var framed(default,null) : Bool = false;
-	public var buffered(default,null) : Bool = false;
-	public var protocol(default,null) : Prot = binary;
-	public var transport(default,null) : Trns = socket;
-	
+	public var servertype(default,null) : ServerType = simple;
+
 	public var host(default,null) : String = "localhost";
 	public var port(default,null) : Int = 9090;
+	
+	public var protocol(default,null) : ProtocolType = binary;
+	public var transport(default,null) : EndpointTransport = socket;
+	public var framed(default,null) : Bool = false;
+	public var buffered(default,null) : Bool = false;
 
 	public var numIterations(default,null) : Int = 1;
 	public var numThreads(default,null) : Int = 1;
+	public var skipSpeedTest(default,null) : Bool = false;
 	
 	
 	public function new() {
@@ -70,112 +85,244 @@
 	#if sys
 		
 	private static function GetHelp() : String {
+		var sProg = Path.withoutDirectory( Sys.executablePath());
 		return "\n"
-			+Sys.executablePath()+"  [client|server]  [options]\n"
+			+sProg+"  [client|server]  [options]\n"
+			+"\n"
 			+"Modus: Either client or server, the default is client.\n"
 			+"\n"
-			+"Options:\n"
-			+"  -f, --framed         framed transport (supersedes buffered)\n"
-			+"  -b, --buffered       buffered transport\n"
-			+"  --json               JSON protocol\n"
-			+"  --protocol=<prot>    Choose protocol: json, binary (default binary).\n"
-			+"  --port=<port>        Port number for socket transport, default 9090\n"
+			+"Common options:\n"
+			+"  -h [ --help ]               produce help message\n"
+			+"  --port arg (=9090)          Port number to listen / connect to\n"
+			/* not supported yet
+			+"  --domain-socket arg         Unix Domain Socket (e.g. /tmp/ThriftTest.thrift)\n"
+            +"  --named-pipe arg            Windows Named Pipe (e.g. MyThriftPipe)\n"
+			*/
+			+"  --protocol arg (=binary)    protocol: binary, compact, json\n"
+			/* not supported yet
+			+"  --ssl                       Encrypted Transport using SSL\n"
+			*/
+			+"\n"
+			+"Server only options:\n"
+            +"  --transport arg (=sockets)  Transport: buffered, framed, http, anonpipe\n"
+			/* not supported yet
+			+"  --processor-events          processor-events\n"
+			+"  --server-type arg (=simple) type of server, \"simple\", \"thread-pool\", \n"
+			+"                              \"threaded\", or \"nonblocking\"\n"
+			+"  -n [ --workers ] arg (=4)   Number of thread pools workers. Only valid for \n"
+			+"                              thread-pool server type\n"
+			*/
 			+"\n"
 			+"Client only options:\n"
-			+"  --host=<host>        Host name, IP or URL, default localhost\n"
-			+"  -n=<iterations>      Number of test iterations\n"
-			+"  -t=<threads>         Number of test threads\n"
-			+"  -u=<url>             Target Host/URL (same as --host)\n"
+            +"  --host arg (=localhost)     Host to connect\n"
+            +"  --transport arg (=sockets)  Transport: buffered, framed, http, evhttp\n"
+			/* not supported yet
+            +"  --anon-pipes hRead hWrite   Windows Anonymous Pipes pair (handles)\n"
+			*/
+            +"  -n [ --testloops ] arg (=1) Number of Tests\n"
+            +"  -t [ --threads ] arg (=1)   Number of Test threads\n"
+            +"  --skip-speed-test           Skip the speed test\n"
 			+"\n"
-			+"All arguments are optional.\n";
+			+"All arguments are optional.\n"
+			;
 	}
 	
 
 	private function ParseArgs() : Void {
-		var step = 0;
-		for (arg in Sys.args()) {
+		
+		var args = Sys.args().copy();
+		if( (args == null) || (args.length <= 0)) {
+			server = false;
+			numThreads = 1;
+			return;
+		}
+		
+		var arg = args.shift();
+		if ( arg == "client") {
+			server = false;
+			numThreads = 1;
+		} 
+		else if ( arg == "server") {
+			server = true;
+			numThreads = 4;
+		} 
+		else if ( (arg == "-h") || (arg == "--help")) {
+			// -h [ --help ]               produce help message
+			Sys.println( GetHelp());
+			printHelpOnly = true;
+			return;
+		} 
+		else {
+			throw "First argument must be 'server' or 'client'";
+		}
+
 			
-			// server|client
-			switch(step) {
-			case 0:
-				++step;
-				if ( arg == "client") 
-					server = false;
-				else if ( arg == "server") 
-					server = true;
-				else
-					throw "First argument must be 'server' or 'client'";
-					
-			case 1:					
-				if ( (arg == "-f") || (arg == "--framed")) {
-					framed = true;
-				} else if (( arg == "-b") || ( arg == "--buffered")) {
-					buffered = true;
-				} else if (( arg == "--json") || (arg == "--protocol=json")){
-					protocol = json;
-				} else if (( arg == "--protocol=binary")){
-					protocol = binary;
-				} else if (arg.startsWith("--host=")) {
-					ClientOnlyOption(arg);
-					host = arg.substr(arg.indexOf("=") + 1);
-				} else if (arg.startsWith("--port=")) {
-					var tmp = Std.parseInt(arg.substr(arg.indexOf("=")+1));
-					if( tmp != null)
-						port = tmp;
-					else
-						throw "Invalid port number "+arg;
-				} else if (arg == "-n") {
-					ClientOnlyOption(arg);
-					step = 2;
-				} else if (arg == "-t") {
-					ClientOnlyOption(arg);
-					step = 3;
-				} else if (arg == "-u") {
-					ClientOnlyOption(arg);
-					step = 4;
+		while( args.length > 0) {
+			arg = args.shift();
+			
+			if ( (arg == "-h") || (arg == "--help")) {
+				// -h [ --help ]               produce help message
+			    Sys.println( GetHelp());
+				printHelpOnly = true;
+				return;
+			} 
+			else if (arg == "--port") {		
+				// --port arg (=9090)          Port number to listen
+				arg = args.shift();
+				var tmp = Std.parseInt(arg);
+				if( tmp != null) {
+					port = tmp;
 				} else {
-					throw "Unexpected argument "+arg;
-				}					
-					
-			case 2:  // num iterations
-				step = 1;
-				var tmp = Std.parseInt(arg);
-				if( tmp != null)
-					numIterations = tmp;
-				else
-					throw "Invalid numeric value "+arg;
-					
-			case 3: // num threads
-				step = 1;
-				var tmp = Std.parseInt(arg);
-				if( tmp != null)
-					numThreads = tmp;
-				else
-					throw "Invalid numeric value "+arg;
-					
-			case 4:  // url
-				step = 1;
-				host = arg;
-					
-			default:
-				throw "Unexpected state";
+					throw "Invalid port number "+arg;
+				}  
+			} 
+			else if (arg == "--domain-socket") {		
+				//   --domain-socket arg         Unix Domain Socket (e.g. /tmp/ThriftTest.thrift)
+				throw "domain sockets not supported yet";
+			} 
+			else if (arg == "--named-pipe") {		
+				//   --named-pipe arg            Windows Named Pipe (e.g. MyThriftPipe)
+				throw "named pipes not supported yet";
+			} 
+			else if (arg == "--protocol") {		
+				// --protocol arg (=binary)    protocol: binary, compact, json
+				arg = args.shift();
+				if( arg == "binary") {
+					protocol = binary;
+				} else if( arg == "compact") {
+					throw "Compact protocol not supported yet";
+				} else if( arg == "json") {
+					protocol = json;
+				} else {
+					InvalidArg(arg);
+				}
+			}  
+			else if (arg == "--ssl") {		
+				// --ssl                       Encrypted Transport using SSL
+				throw "SSL not supported yet";
+			} 
+			else {
+                //Server only options:
+				if( server) {
+					ParseServerArgument( arg, args);
+				} else {
+					ParseClientArgument( arg, args);
+				}
 			}
+		}
+	}
+	
 
-			
-			if ( framed && buffered)
-			{
-				trace("WN: framed supersedes buffered transport");
-			}
+	private function ParseServerArgument( arg : String, args : Array<String>) : Void {
+		if (arg == "--transport") {
+			//  --transport arg (=sockets)  Transport: buffered, framed, http, anonpipe
+			arg = args.shift();
+			if( arg == "buffered") {
+				buffered = true;
+			} else if( arg == "framed") {
+				framed = true;
+			} else if( arg == "http") {
+				transport = http;
+			} else if( arg == "anonpipe") {
+				throw "Anon pipes transport not supported yet";
+			} else {
+				InvalidArg(arg);
+			}  
+		}
+		else if (arg == "--processor-events") {
+			throw "Processor events not supported yet";
+		}
+		else if (arg == "--server-type") {
+			//  --server-type arg (=simple) type of server, 
+			// one of "simple", "thread-pool", "threaded", "nonblocking"
+			arg = args.shift();
+			if( arg == "simple") {
+				servertype = simple;
+			} else if( arg == "thread-pool") {
+				throw arg+" server not supported yet";
+			} else if( arg == "threaded") {
+				throw arg+" server not supported yet";
+			} else if( arg == "nonblocking") {
+				throw arg+" server not supported yet";
+			} else {
+				InvalidArg(arg);
+			}  
+		}
+		else if ((arg == "-n") || (arg == "--workers")) {
+			//  -n [ --workers ] arg (=4)   Number of thread pools workers. Only valid for 
+			//                              thread-pool server type
+			arg = args.shift();
+			var tmp = Std.parseInt(arg);
+			if( tmp != null) {
+				numThreads = tmp;
+			} else{
+				throw "Invalid number "+arg;
+			} 
+		}
+		else {
+			InvalidArg(arg);
+		}
+	}
+	
 
+	private function ParseClientArgument( arg : String, args : Array<String>) : Void {
+		if (arg == "--host") {
+            //  --host arg (=localhost)     Host to connect
+			host = args.shift();
+		}
+		else if (arg == "--transport") {
+            //  --transport arg (=sockets)  Transport: buffered, framed, http, evhttp
+			arg = args.shift();
+			if( arg == "buffered") {
+				buffered = true;
+			} else if( arg == "framed") {
+				framed = true;
+			} else if( arg == "http") {
+				transport = http;
+			} else if( arg == "evhttp") {
+				throw "evhttp transport not supported yet";
+			} else {
+				InvalidArg(arg);
+			}  
+		}
+		else if (arg == "--anon-pipes") {
+			//  --anon-pipes hRead hWrite   Windows Anonymous Pipes pair (handles)
+			throw "Anon pipes transport not supported yet";
+		}
+		else if ((arg == "-n") || (arg == "--testloops")) {
+			//  -n [ --testloops ] arg (=1) Number of Tests
+			arg = args.shift();
+			var tmp = Std.parseInt(arg);
+			if( tmp != null) {
+				numIterations = tmp;
+			} else {
+				throw "Invalid number "+arg;
+			}  
+		}
+		else if ((arg == "-t") || (arg == "--threads")) {
+			//  -t [ --threads ] arg (=1)   Number of Test threads
+			arg = args.shift();
+			var tmp = Std.parseInt(arg);
+			if( tmp != null) {
+				numThreads = tmp;
+			} else {
+				throw "Invalid number "+arg;
+			}  
+		}
+		else if (arg == "--skip-speed-test") {
+			//  --skip-speed-test  			Skip the speed test
+			skipSpeedTest = true;
+		}			
+		else {
+			InvalidArg(arg);
 		}
 	}
 
+	
 	#end
 		
 		
-	private function ClientOnlyOption( arg : String) {
-		if( server) {
-			throw "Unexpected argument in client mode: "+arg;
-		}
+	private function InvalidArg( arg : String) : Void {
+		throw 'Invalid argument $arg';
 	}
 }