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;
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
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 =
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);