[Libguestfs] [PATCH 5/9] Rust bindings: Add generator of structs for optional arguments
Richard W.M. Jones
rjones at redhat.com
Thu Jun 27 08:55:48 UTC 2019
On Thu, Jun 27, 2019 at 05:06:06PM +0900, Hiroyuki Katsura wrote:
> From: Hiroyuki_Katsura <hiroyuki.katsura.0513 at 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
More information about the Libguestfs
mailing list