{#- A default's body: one Rust expression, no trailing semicolon. -#} {%- macro default_body(node) -%} {%- if node.kind == "none" -%}::std::option::Option::None {%- elif node.kind == "unit" -%}::std::default::Default::default() {%- elif node.kind == "bool" -%}{{ "true" if node.value else "false" }} {%- elif node.kind == "int" -%}{{ node.value }} {%- elif node.kind == "float" -%}{{ node.value | rust_f64 }} {%- elif node.kind == "string" -%}String::from({{ node.value | rust_string }}) {%- elif node.kind == "empty_vec" -%}::std::vec::Vec::new() {%- elif node.kind == "empty_map" -%}::std::collections::BTreeMap::new() {%- elif node.kind == "array" -%}[{% for element in node.elements %}{{ rust_value(element) }}{{ ", " if not loop.last }}{% endfor %}] {%- elif node.kind == "enum_variant" -%}{{ node.type }}::{{ node.variant }} {%- elif node.kind == "delegate" -%}<{{ node.type }} as ::std::default::Default>::default() {%- endif -%} {%- endmacro -%} {#- A JSON-shaped value whose typed shape is not carried alongside. -#} {%- macro rust_value(node) -%} {%- if node.kind == "unit" -%}::std::default::Default::default() {%- elif node.kind == "bool" -%}{{ "true" if node.value else "false" }} {%- elif node.kind == "int" -%}{{ node.value }}_i64 {%- elif node.kind == "float" -%}{{ node.value | rust_f64 }} {%- elif node.kind == "string" -%}String::from({{ node.value | rust_string }}) {%- elif node.kind == "empty_vec" -%}::std::vec::Vec::new() {%- elif node.kind == "empty_map" -%}::std::collections::BTreeMap::new() {%- elif node.kind == "vec" -%}vec![{% for element in node.elements %}{{ rust_value(element) }}{{ ", " if not loop.last }}{% endfor %}] {%- elif node.kind == "map" -%}[{% for pair in node.pairs %}(String::from({{ pair.key | rust_string }}), {{ rust_value(pair.value) }}){{ ", " if not loop.last }}{% endfor %}].into_iter().collect() {%- endif -%} {%- endmacro -%}