]> xenbits.xensource.com Git - xenclient/toolstack.git/commitdiff
properly handle rpcs that don't take any params (make them take ():unit)
authorPrashanth Mundkur <prashanth.mundkur@citrix.com>
Fri, 15 May 2009 00:31:13 +0000 (17:31 -0700)
committerPrashanth Mundkur <prashanth.mundkur@citrix.com>
Fri, 15 May 2009 00:31:13 +0000 (17:31 -0700)
gen/rpc/codegen.ml
gen/rpc/gen_rpc.ml

index edbb7d6234a64cf403abb00cf7a884c492d0ca67..4e92f6c22869542c0e12ea66b8c82e5047bcc83d 100644 (file)
@@ -65,18 +65,23 @@ module Server = struct
                fprintf ff "@]@\nend@\n@\n@?"
          
        let gen_dispatch_struct ff server rpc_list notif_list =
+               let get_arg_types params =
+                       match params with
+                       | [] -> [ "unit" ]
+                       |  _ -> List.map (fun p -> p.param_type) params
+               in
                let sig_name = (String.lowercase server.server_name) ^ "_impl" in
                fprintf ff "type %s =@\n" sig_name;
                fprintf ff "@[<v 8>{@,";
                fprintf ff "(* RPCs *)";
                List.iter (fun (rpc, resp) ->
-                               let sg = List.map (fun p -> p.param_type) rpc.rpc_request.request_params in
+                               let sg = get_arg_types rpc.rpc_request.request_params in
                                let sg = sg @ [ resp.response_value.param_type ] in
                                fprintf ff "@,%s: %s;" rpc.rpc_request.request_handler (String.concat " -> " sg)
                          ) rpc_list;
                fprintf ff "@,@,(* Notifications *)";
                List.iter (fun n ->
-                               let sg = List.map (fun p -> p.param_type) n.rpc_request.request_params in
+                               let sg = get_arg_types n.rpc_request.request_params in
                                let sg = sg @ [ "unit" ] in
                                fprintf ff "@,%s: %s;" n.rpc_request.request_handler (String.concat " -> " sg)
                          ) notif_list;
@@ -96,17 +101,25 @@ module Server = struct
                let methname = rpc.rpc_request.request_handler in
                let params = rpc.rpc_request.request_params in
                fprintf ff "@[<v 8>| \"%s\" ->@," rpc.rpc_request.request_name;
-               fprintf ff "let %s = Json_conv.get_array %s.Jsonrpc.params in@," arrvn reqvn;
-               fprintf ff "Json_conv.check_array_with_length %s %d;@," arrvn (List.length params);
-               let paramsv, venv, _ =
-                       List.fold_left (fun (alist, venv, i) p ->
-                                               let a, venv = gen_param ff venv arrvn i p in
-                                               (a :: alist), venv, (i + 1)
-                                      ) ([], venv, 0) params in
+               let args_str, venv =
+                       (match params with
+                        | [] ->
+                               "()", venv
+                        | _  ->
+                               fprintf ff "let %s = Json_conv.get_array %s.Jsonrpc.params in@," arrvn reqvn;
+                               fprintf ff "Json_conv.check_array_with_length %s %d;@," arrvn (List.length params);
+                               let paramsv, venv, _ =
+                                       List.fold_left (fun (alist, venv, i) p ->
+                                                               let a, venv = gen_param ff venv arrvn i p in
+                                                               (a :: alist), venv, (i + 1)
+                                                      ) ([], venv, 0) params in
+
+                               (String.concat " " (List.map (fun v -> name_of_var v) (List.rev paramsv))), venv
+                       )
+               in
                let respv, venv = Var_env.new_ident_from_name venv "resp" in
                let respjv, venv = Var_env.new_ident_from_name venv "resp_j" in
                let respvn, respjvn = name_of_var respv, name_of_var respjv in
-               let args_str = String.concat " " (List.map (fun v -> name_of_var v) (List.rev paramsv)) in
                fprintf ff "let %s = %s.%s %s in@," respvn impl_module methname args_str;
                fprintf ff "let %s = %s_to_json %s in@," respjvn resp.response_value.param_type respvn;
                fprintf ff "Jsonrpc.Result %s@]@," respjvn
@@ -117,14 +130,21 @@ module Server = struct
                let methname = rpc.rpc_request.request_handler in
                let params = rpc.rpc_request.request_params in
                fprintf ff "@[<v 8>| \"%s\" ->@," rpc.rpc_request.request_name;
-               fprintf ff "let %s = Json_conv.get_array %s.Jsonrpc.params in@," arrvn reqvn;
-               fprintf ff "Json_conv.check_array_with_length %s %d;@," arrvn (List.length params);
-               let paramsv, venv, _ =
-                       List.fold_left (fun (alist, venv, i) p ->
-                                               let a, venv = gen_param ff venv arrvn i p in
-                                               (a :: alist), venv, (i + 1)
-                                      ) ([], venv, 0) params in
-               let args_str = String.concat " " (List.map (fun v -> name_of_var v) (List.rev paramsv)) in
+               let args_str, venv =
+                       (match params with
+                        | [] ->
+                               "()", venv
+                        | _  ->
+                               fprintf ff "let %s = Json_conv.get_array %s.Jsonrpc.params in@," arrvn reqvn;
+                               fprintf ff "Json_conv.check_array_with_length %s %d;@," arrvn (List.length params);
+                               let paramsv, venv, _ =
+                                       List.fold_left (fun (alist, venv, i) p ->
+                                                               let a, venv = gen_param ff venv arrvn i p in
+                                                               (a :: alist), venv, (i + 1)
+                                                      ) ([], venv, 0) params in
+                               (String.concat " " (List.map (fun v -> name_of_var v) (List.rev paramsv))), venv
+                       )
+               in
                fprintf ff "%s.%s %s@]@," impl_module methname args_str
 
        let gen_notification_dispatch ff venv server impl_module nlist =
@@ -182,13 +202,20 @@ module Client = struct
                let args = List.map (fun p -> p.param_name) params in
                let avlist, venv = Var_env.new_idents_from_names venv ~prefix:"o_" args in
                let vvlist, venv = Var_env.new_idents_from_names venv ~prefix:"j_" args in
-               fprintf ff "@,@[<v 8>let jrpc_%s %s =@," rpc.rpc_request.request_name (String.concat " " (List.map name_of_var avlist));
-               List.iter2 (fun p (a, v) ->
-                               fprintf ff "let %s = %s_to_json %s in@," (name_of_var v) p.param_type (name_of_var a)
-                          ) params (List.combine avlist vvlist);
                let rpcv, venv = Var_env.new_ident_from_name venv "rpc_id" in
                let rpcvn = name_of_var rpcv in
-               let args_str = String.concat "; " (List.map name_of_var vvlist) in
+               let args_str =
+                       (match args with
+                        | [] ->
+                               fprintf ff "@,@[<v 8>let jrpc_%s () =@," rpc.rpc_request.request_name;
+                               "Json.Null"
+                        | _  ->
+                               fprintf ff "@,@[<v 8>let jrpc_%s %s =@," rpc.rpc_request.request_name (String.concat " " (List.map name_of_var avlist));
+                               List.iter2 (fun p (a, v) ->
+                                               fprintf ff "let %s = %s_to_json %s in@," (name_of_var v) p.param_type (name_of_var a)
+                                          ) params (List.combine avlist vvlist);
+                               String.concat "; " (List.map name_of_var vvlist))
+               in
                (match rpc.rpc_response with
                | None ->   fprintf ff "let %s = None in@," rpcvn
                | Some _ -> fprintf ff "let %s = Some (%s.get_rpc_request_id ()) in@," rpcvn rpcid_maker);
index fbbec087d7b53905c10831210d4a59eb5b45ddfe..a1d18d024be74a7d0a8235470746692ad54726c1 100644 (file)
@@ -112,7 +112,6 @@ let _ =
        let input, client, server = parse_args () in
        try
                let jdecls = parse_file input in
-               Printf.printf "%d decls parsed.\n" (List.length jdecls);
                let decls = List.map process_jdecl jdecls in
                let spec = Rpc_decl.spec_with_decls decls in
                Codegen.generate spec client server;