Index: mojo/public/bindings/generators/cpp_templates/struct_builder_definition.tmpl |
diff --git a/mojo/public/bindings/generators/cpp_templates/struct_builder_definition.tmpl b/mojo/public/bindings/generators/cpp_templates/struct_builder_definition.tmpl |
index e1fc09e397210c19f1470e867f696cc1fe714ace..eea1e9aecb188c33cbc35f71f3c4425786f657fb 100644 |
--- a/mojo/public/bindings/generators/cpp_templates/struct_builder_definition.tmpl |
+++ b/mojo/public/bindings/generators/cpp_templates/struct_builder_definition.tmpl |
@@ -6,32 +6,55 @@ |
{%- set _ = dtor_name.append("NULL") %} |
{%- endif %} |
-{%- macro set_default(field) -%} |
-{%- if field.kind|is_string_kind -%} |
-set_{{field.name}}(mojo::String({{field.default}})); |
-{%- elif field.kind|is_array_kind -%} |
+{%- macro set_default(kind, value, depth) -%} |
+{#--- Strings ---#} |
+{%- if kind|is_string_kind -%} |
+{{caller("mojo::String(" ~ value ~ ")")}} |
+{#--- Arrays ---#} |
+{%- elif kind|is_array_kind %} |
+{%- set _ = value|verify_token_type("ARRAY") %} |
{ |
- {{field.kind|cpp_wrapper_type}}::Builder tmp({{field.default|length}}); |
-{%- for element in field.default %} |
- tmp[{{loop.index0}}] = {{element}}; |
-{%- endfor %} |
- set_{{field.name}}(tmp.Finish()); |
+ {{kind|cpp_wrapper_type}}::Builder tmp{{depth}}({{value[1]|length}}); |
+{%- for element in value[1] %} |
+{%- filter indent(2) %} |
+{%- call(result) set_default(kind.kind, element, depth+1) %} |
+tmp{{depth}}[{{loop.index0}}] = {{result}}; |
+{%- endcall %} |
+{%- endfilter %} |
+{%- endfor -%} |
+ {{caller("tmp" ~ depth ~ ".Finish()")|indent(2)}} |
} |
-{%- elif field.kind|is_object_kind -%} |
+{#--- Objects ---#} |
+{%- elif kind|is_object_kind %} |
+{%- set _ = value|verify_token_type("OBJECT") %} |
{ |
- {{field.kind|cpp_wrapper_type}}::Builder tmp; |
- // TODO |
- set_{{field.name}}(tmp.Finish()); |
+ {{kind|cpp_wrapper_type}}::Builder tmp{{depth}}; |
+{%- set struct = structs|struct_by_name(kind.name) %} |
+{%- for element in value[1] %} |
+{#- Use struct.packed_fields to order struct values by ordinal number #} |
+{%- set subfield = struct.fields[loop.index0] %} |
+{%- filter indent(2) %} |
+{%- call(result) set_default(subfield.kind, element, depth+1) %} |
+tmp{{depth}}.set_{{subfield.name}}({{result}}); |
+{%- endcall %} |
+{%- endfilter %} |
+{%- endfor -%} |
+ {{caller("tmp" ~ depth ~ ".Finish()")|indent(2)}} |
} |
+{#--- POD types ---#} |
{%- else -%} |
-set_{{field.name}}({{field.default}}); |
+{{caller(value)}} |
{%- endif %} |
{%- endmacro %} |
{{class_name}}::Builder::Builder(mojo::Buffer* buf) |
: data_(Data::New(buf, {{dtor_name[0]}})) { |
{%- for pf in struct.packed.packed_fields if pf.field.default %} |
- {{set_default(pf.field)|indent(2)}} |
+{%- filter indent(2) %} |
+{%- call(result) set_default(pf.field.kind, pf.field.default, 0) %} |
+set_{{pf.field.name}}({{result}}); |
+{%- endcall %} |
+{%- endfilter %} |
{%- endfor %} |
} |