
New patches:

[Add rudimentary keyword argument support in json-rpc.
Sasha Kovar <sasha-lisp@arcocene.org>**20080216002250] {
hunk ./src/json-rpc.lisp 50
-    * params - An Array of objects to pass as arguments to the method.
+    * params - An Array or Object to pass as arguments to the method.
hunk ./src/json-rpc.lisp 52
-  (json-bind (method params id) json-string
-    (restart-case
-        (let ((func (gethash method *json-rpc-functions*)))
-          (if func
-              (make-rpc-response :id id :result (restart-case (apply func params)
-                                                  (use-value (value)
-                                                    value)))
-              (make-rpc-response :id id :error (make-json-rpc-error-object-1.1 "Procedure not found"))))
-      (send-error (message &optional code error-object)
-        (make-rpc-response :id id :error (make-json-rpc-error-object-1.1 message
-                                                                         :code code
-                                                                         :error-object error-object)))
-      (send-error-object (error-object)
-        (make-rpc-response :id id :error error-object))
-      (send-nothing ()
-        nil)
-      (send-internal-error ()
-        (make-rpc-response :id id :error (make-json-rpc-error-object-1.1 "Service error"))))))
+  (labels ((alistp (l)
+             (and l (listp (car l))))
+           (flatten-alist (l)
+             (loop for i in l collect (car i) collect (cdr i))))
+    (json-bind (method params id) json-string
+      (when (alistp params)
+          (setf params (flatten-alist params)))
+      (restart-case
+          (let ((func (gethash method *json-rpc-functions*)))
+            (if func
+                (make-rpc-response :id id :result (restart-case (apply func params)
+                                                    (use-value (value)
+                                                      value)))
+                (make-rpc-response :id id :error (make-json-rpc-error-object-1.1 "Procedure not found"))))
+        (send-error (message &optional code error-object)
+          (make-rpc-response :id id :error (make-json-rpc-error-object-1.1 message
+                                                                           :code code
+                                                                           :error-object error-object)))
+        (send-error-object (error-object)
+          (make-rpc-response :id id :error error-object))
+        (send-nothing ()
+          nil)
+        (send-internal-error ()
+          (make-rpc-response :id id :error (make-json-rpc-error-object-1.1 "Service error")))))))
hunk ./t/testmisc.lisp 38
+(defun-json-rpc foo-key (&key (x 0) (y 0))
+  "Subtract Y from X"
+  (- x y))
hunk ./t/testmisc.lisp 43
+      (let (result)
+        (setf result (json-rpc:invoke-rpc "{\"method\":\"foo\",\"params\":[1,2],\"id\":999}"))
+        (is (string= result "{\"result\":3,\"error\":null,\"id\":999}"))))
+
+(test test-json-rpc-named-params
hunk ./t/testmisc.lisp 49
-    (setf result (json-rpc:invoke-rpc "{\"method\":\"foo\",\"params\":[1,2],\"id\":999}"))
-    (is (string= result "{\"result\":3,\"error\":null,\"id\":999}"))))
+    (setf result (json-rpc:invoke-rpc "{\"method\":\"foo-key\",\"params\":{\"y\":1,\"x\":2},\"id\":999}"))
+    (is (string= result "{\"result\":1,\"error\":null,\"id\":999}"))))
}

Context:

[get rid of some newly introduced compiler warnings
Henrik Hjelte <henrik@evahjelte.com>**20080120091410] 
[todo file
Henrik Hjelte <henrik@evahjelte.com>**20080114144149] 
[restore list-decoder defaults 
Henrik Hjelte <henrik@evahjelte.com>**20080105100011
 for backwards compatibility, some
 of my old code broke with the new default
 variable values
] 
[Updated some testcases to work with arrays as well as lists
Henrik Hjelte <henrik@evahjelte.com>**20071228170926] 
[changed name of with-old-decoder-semantics to with-list-decoder-semantics
Henrik Hjelte <henrik@evahjelte.com>**20071228170803] 
[put old style semantics as default
Henrik Hjelte <henrik@evahjelte.com>**20071228152325
 until the clos objects are integrated,
 have testcases, all tests run ok.
] 
[move around some stuff, made testcases work for old semantics
Henrik Hjelte <henrik@evahjelte.com>**20071228150818
 if you call set-list-decoder-semantics before (5am:run 'json)
 the 101 old testcases work ok.
] 
[renamed some parameters like constants
Henrik Hjelte <henrik@evahjelte.com>**20071228145823] 
[Added encoding of CLOS objects, and prototypes for alists and hash tables.
boris.smilga@gmail.com**20071223151744] 
[Added WITH-OLD-DECODER-SEMANTICS.
boris.smilga@gmail.com**20071223151705] 
[Added decoding of arrays to vectors or lists.
boris.smilga@gmail.com**20071223151610] 
[Added decoding of objects to CLOS objects, hash tables or alists.
boris.smilga@gmail.com**20071223151334] 
[Added CLOS / MOP infrastructure.
boris.smilga@gmail.com**20071223151000] 
[TAG 0.3.2
henrik@evahjelte.com**20071228151244] 
Patch bundle hash:
dbffa1f1ca62ca6c9192a637d1c1c8a941e0e325
