On Thu, Jun 27, 2019 at 05:06:06PM +0900, Hiroyuki Katsura wrote:
From: Hiroyuki_Katsura <hiroyuki.katsura.0513(a)gmail.com>
---
generator/rust.ml | 71 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 71 insertions(+)
diff --git a/generator/rust.ml b/generator/rust.ml
index 174f6ded3..a229d5eac 100644
--- a/generator/rust.ml
+++ b/generator/rust.ml
@@ -29,10 +29,32 @@ open Structs
open C
open Events
+(* Utilities for Rust *)
+(* Are there corresponding functions to them? *)
+(* Should they be placed in utils.ml? *)
let rec indent n = match n with
| x when x > 0 -> pr " "; indent (x - 1)
| _ -> ()
generator/bindtests.ml has a function called ‘pr_indent’ which is a
bit like this. Moving it to generator/utils.ml might be worth
considering, then you can use it from both places.
+(* split_on_char exists since OCaml 4.04 *)
+(* but current requirements: >=4.01 *)
+let split_on_char c = Str.split (Str.regexp (String.make 1 c))
+let snake2caml name =
+ let l = split_on_char '_' name in
+ let l = List.map (fun x -> String.capitalize_ascii x) l in
+ String.concat "" l
+
+
Extra blank line.
+(* because there is a function which contains 'unsafe' field
*)
+let black_list = ["unsafe"]
+
+let translate_bad_symbols s =
+ if List.exists (fun x -> s = x) black_list then
+ s ^ "_"
+ else
+ s
+
let generate_rust () =
generate_header CStyle LGPLv2plus;
@@ -204,3 +226,52 @@ impl UUID {
pr " }\n";
pr "}\n"
) external_structs;
+ List.iter (
+ fun ({ name = name; shortdesc = shortdesc;
+ style = (ret, args, optargs) }) ->
+ let cname = snake2caml name in
+ if optargs <> [] then (
+ pr "\n";
+ pr "/* Optional Structs */\n";
+ pr "#[derive(Default)]\n";
+ pr "pub struct OptArgs%s {\n" cname;
+ List.iter (
+ fun optarg ->
+ let n = translate_bad_symbols (name_of_optargt optarg) in
+ match optarg with
+ | OBool _ ->
+ pr " _%s: Option<bool>,\n" n
+ | OInt _ ->
+ pr " _%s: Option<i32>,\n" n
+ | OInt64 _ ->
+ pr " _%s: Option<i64>,\n" n
+ | OString _ ->
+ pr " _%s: Option<String>,\n" n
+ | OStringList _ ->
+ pr " _%s: Option<Vec<String>>,\n" n
+ ) optargs;
+ pr "}\n\n";
+ pr "impl OptArgs%s {\n" cname;
+ List.iter (
+ fun optarg ->
+ let n = translate_bad_symbols (name_of_optargt optarg) in
+ pr " pub fn %s(self, %s: " n n;
+ (match optarg with
+ | OBool _ ->
+ pr "bool"
+ | OInt _ ->
+ pr "i32"
+ | OInt64 _ ->
+ pr "i64"
+ | OString _ ->
+ pr "String"
+ | OStringList _ ->
+ pr "Vec<String>"
+ );
+ pr ") -> OptArgs%s {\n" cname;
+ pr " OptArgs%s { _%s: Some(%s), ..self }\n" cname n n;
+ pr " }\n"
+ ) optargs;
+ pr "}\n\n";
+ );
+ ) (actions |> external_functions |> sort);
--
2.20.1 (Apple Git-117)
The rest of this patch looks OK.
Rich.
--
Richard Jones, Virtualization Group, Red Hat
http://people.redhat.com/~rjones
Read my programming and virtualization blog:
http://rwmj.wordpress.com
Fedora Windows cross-compiler. Compile Windows programs, test, and
build Windows installers. Over 100 libraries supported.
http://fedoraproject.org/wiki/MinGW