2
0
Просмотр исходного кода

server: better parsing of commandline options

Manfred Kroehnert 12 лет назад
Родитель
Сommit
547c5db702
2 измененных файлов с 87 добавлено и 29 удалено
  1. 31 10
      server/FileServer.st
  2. 56 19
      server/server.js

+ 31 - 10
server/FileServer.st

@@ -639,18 +639,39 @@ mimeTypeFor: aString
 
 !FileServer class methodsFor: 'initialization'!
 
+createServerWithArguments: options
+	| server actions popFront front optionName optionValue |
+	actions := #{
+		'-p' -> [:fileServer :value | fileServer port: value].
+		'--username' -> [:fileServer :value | fileServer username: value].
+		'--password' -> [:fileServer :value | fileServer password: value]
+	}.
+
+	popFront := [:args |
+		front := args first.
+		args remove: front.
+		front].
+	server := self new.
+
+	options ifEmpty: [^server].
+
+	[options notEmpty] whileTrue: [
+		optionName  := popFront value: options.
+		optionValue := popFront value: options.
+		(actions at: optionName ifAbsent: []) value: server value: optionValue.
+	].
+
+	^server.
+!
+
 main
-	| fileServer arguments portOption portNumber|
-	fileServer := self new.
-	fileServer checkDirectoryLayout.
+	| fileServer args |
+	args := process argv.
+	args removeFrom: 1 to: 3.
 
-	arguments := process argv.
-	portOption := arguments at: 3 ifAbsent: [nil].
-	portNumber := arguments at: 4 ifAbsent: [nil].
-	('-p' = portOption and: [portNumber notNil]) ifTrue: [
-		fileServer port: portNumber.
-	].
-	fileServer username: 'Amber' password: 'Dev'.
+	fileServer := FileServer createServerWithArguments: args.
+
+	fileServer checkDirectoryLayout.
 	^fileServer start
 ! !
 

+ 56 - 19
server/server.js

@@ -14356,6 +14356,22 @@ referencedClasses: []
 }),
 smalltalk.FileServer);
 
+smalltalk.addMethod(
+"_password_",
+smalltalk.method({
+selector: "password:",
+category: 'accessing',
+fn: function (aPassword){
+var self=this;
+(self['@password']=aPassword);
+return self;},
+args: ["aPassword"],
+source: "password: aPassword\x0a\x09password := aPassword.",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.FileServer);
+
 smalltalk.addMethod(
 "_port",
 smalltalk.method({
@@ -14523,6 +14539,22 @@ referencedClasses: []
 }),
 smalltalk.FileServer);
 
+smalltalk.addMethod(
+"_username_",
+smalltalk.method({
+selector: "username:",
+category: 'accessing',
+fn: function (aUsername){
+var self=this;
+(self['@username']=aUsername);
+return self;},
+args: ["aUsername"],
+source: "username: aUsername\x0a\x09username := aUsername.",
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.FileServer);
+
 smalltalk.addMethod(
 "_username_password_",
 smalltalk.method({
@@ -14563,19 +14595,26 @@ smalltalk.addMethod(
 smalltalk.method({
 selector: "createServerWithArguments:",
 category: 'initialization',
-fn: function (arguments){
+fn: function (options){
 var self=this;
-var fileServer=nil;
-(fileServer=smalltalk.send(self, "_new", []));
-(portOption=smalltalk.send(arguments, "_at_ifAbsent_", [(1), (function(){return nil;})]));
-(portNumber=smalltalk.send(arguments, "_at_ifAbsent_", [(2), (function(){return nil;})]));
-((($receiver = smalltalk.send(smalltalk.send("-p", "__eq", [(typeof portOption == 'undefined' ? nil : portOption)]), "_and_", [(function(){return smalltalk.send((typeof portNumber == 'undefined' ? nil : portNumber), "_notNil", []);})])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(fileServer, "_port_", [(typeof portNumber == 'undefined' ? nil : portNumber)]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(fileServer, "_port_", [(typeof portNumber == 'undefined' ? nil : portNumber)]);})]));
-smalltalk.send(fileServer, "_username_password_", ["Amber", "Dev"]);
-return fileServer;
-return self;},
-args: ["arguments"],
-source: "createServerWithArguments: arguments\x0a\x09| fileServer |\x0a\x09fileServer := self new.\x0a\x09portOption := arguments at: 1 ifAbsent: [nil].\x0a\x09portNumber := arguments at: 2 ifAbsent: [nil].\x0a\x09('-p' = portOption and: [portNumber notNil]) ifTrue: [\x0a\x09\x09fileServer port: portNumber.\x0a\x09].\x0a\x09fileServer username: 'Amber' password: 'Dev'.\x0a\x09^fileServer.",
-messageSends: ["new", "at:ifAbsent:", "ifTrue:", "and:", "=", "notNil", "port:", "username:password:"],
+var $early={};
+try{var server=nil;
+var actions=nil;
+var popFront=nil;
+var front=nil;
+var optionName=nil;
+var optionValue=nil;
+(actions=smalltalk.HashedCollection._fromPairs_([smalltalk.send("-p", "__minus_gt", [(function(fileServer, value){return smalltalk.send(fileServer, "_port_", [value]);})]),smalltalk.send("--username", "__minus_gt", [(function(fileServer, value){return smalltalk.send(fileServer, "_username_", [value]);})]),smalltalk.send("--password", "__minus_gt", [(function(fileServer, value){return smalltalk.send(fileServer, "_password_", [value]);})])]));
+(popFront=(function(args){(front=smalltalk.send(args, "_first", []));smalltalk.send(args, "_remove_", [front]);return front;}));
+(server=smalltalk.send(self, "_new", []));
+smalltalk.send(options, "_ifEmpty_", [(function(){return (function(){throw $early=[server]})();})]);
+(function(){while((function(){return smalltalk.send(options, "_notEmpty", []);})()) {(function(){(optionName=smalltalk.send(popFront, "_value_", [options]));(optionValue=smalltalk.send(popFront, "_value_", [options]));return smalltalk.send(smalltalk.send(actions, "_at_ifAbsent_", [optionName, (function(){return nil;})]), "_value_value_", [server, optionValue]);})()}})();
+return server;
+return self;
+} catch(e) {if(e===$early)return e[0]; throw e}},
+args: ["options"],
+source: "createServerWithArguments: options\x0a\x09| server actions popFront front optionName optionValue |\x0a\x09actions := #{\x0a\x09\x09'-p' -> [:fileServer :value | fileServer port: value].\x0a\x09\x09'--username' -> [:fileServer :value | fileServer username: value].\x0a\x09\x09'--password' -> [:fileServer :value | fileServer password: value]\x0a\x09}.\x0a\x09\x0a\x09popFront := [:args |\x0a\x09\x09front := args first.\x0a\x09\x09args remove: front.\x0a\x09\x09front].\x0a\x09server := self new.\x0a\x0a\x09options ifEmpty: [^server].\x0a\x0a\x09[options notEmpty] whileTrue: [\x0a\x09\x09optionName  := popFront value: options.\x0a\x09\x09optionValue := popFront value: options.\x0a\x09\x09(actions at: optionName ifAbsent: []) value: server value: optionValue.\x0a\x09].\x0a\x0a\x09^server.",
+messageSends: ["->", "port:", "username:", "password:", "first", "remove:", "new", "ifEmpty:", "whileTrue:", "notEmpty", "value:", "value:value:", "at:ifAbsent:"],
 referencedClasses: []
 }),
 smalltalk.FileServer.klass);
@@ -14620,17 +14659,15 @@ category: 'initialization',
 fn: function (){
 var self=this;
 var fileServer=nil;
-var arguments=nil;
-var portOption=nil;
-var portNumber=nil;
-(arguments=smalltalk.send((typeof process == 'undefined' ? nil : process), "_argv", []));
-smalltalk.send(arguments, "_removeFrom_to_", [(1), (3)]);
-(fileServer=smalltalk.send((smalltalk.FileServer || FileServer), "_createServerWithArguments_", [arguments]));
+var args=nil;
+(args=smalltalk.send((typeof process == 'undefined' ? nil : process), "_argv", []));
+smalltalk.send(args, "_removeFrom_to_", [(1), (3)]);
+(fileServer=smalltalk.send((smalltalk.FileServer || FileServer), "_createServerWithArguments_", [args]));
 smalltalk.send(fileServer, "_checkDirectoryLayout", []);
 return smalltalk.send(fileServer, "_start", []);
 return self;},
 args: [],
-source: "main\x0a\x09| fileServer arguments portOption portNumber|\x0a\x09arguments := process argv.\x0a\x09arguments removeFrom: 1 to: 3.\x0a\x09fileServer := FileServer createServerWithArguments: arguments.\x0a\x0a\x09fileServer checkDirectoryLayout.\x0a\x09^fileServer start",
+source: "main\x0a\x09| fileServer args |\x0a\x09args := process argv.\x0a\x09args removeFrom: 1 to: 3.\x0a\x0a\x09fileServer := FileServer createServerWithArguments: args.\x0a\x0a\x09fileServer checkDirectoryLayout.\x0a\x09^fileServer start",
 messageSends: ["argv", "removeFrom:to:", "createServerWithArguments:", "checkDirectoryLayout", "start"],
 referencedClasses: ["FileServer"]
 }),