Fixes/upgrades
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
{#- 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 -%}
|
||||
@@ -0,0 +1,38 @@
|
||||
{%- import "type.rs.j2" as types -%}
|
||||
{%- import "default.rs.j2" as defaults -%}
|
||||
{%- for line in doc_lines -%}
|
||||
/// {{ line }}
|
||||
{% endfor -%}
|
||||
#[derive({{ derives | join(", ") }})]
|
||||
{% for attr in extra_attrs -%}
|
||||
{{ attr }}
|
||||
{% endfor -%}
|
||||
pub struct {{ name }} {
|
||||
{%- for field in fields %}
|
||||
{%- if field.default_fn %}
|
||||
#[serde(default = "{{ field.default_fn }}")]
|
||||
{%- endif %}
|
||||
pub {{ field.ident }}: {{ types.rust_type(field.type) }},
|
||||
{%- endfor %}
|
||||
}
|
||||
|
||||
{% for fn in default_fns -%}
|
||||
fn {{ fn.name }}() -> {{ types.rust_type(fn.type) }} { {{ defaults.default_body(fn.body) }} }
|
||||
{% endfor -%}
|
||||
{% if default_fns %}
|
||||
{% endif -%}
|
||||
{% if fields -%}
|
||||
impl Default for {{ name }} {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
{%- for field in fields %}
|
||||
{%- if field.default_fn %}
|
||||
{{ field.ident }}: {{ field.default_fn }}(),
|
||||
{%- else %}
|
||||
{{ field.ident }}: ::std::default::Default::default(),
|
||||
{%- endif %}
|
||||
{%- endfor %}
|
||||
}
|
||||
}
|
||||
}
|
||||
{% endif -%}
|
||||
@@ -0,0 +1,16 @@
|
||||
{#- Rust type spelling. `node` is the classified shape emit.py produces. -#}
|
||||
{%- macro rust_type(node) -%}
|
||||
{%- if node.kind == "primitive" -%}
|
||||
{%- if node.primitive == "integer" -%}i64
|
||||
{%- elif node.primitive == "number" -%}f64
|
||||
{%- elif node.primitive == "boolean" -%}bool
|
||||
{%- else -%}String
|
||||
{%- endif -%}
|
||||
{%- elif node.kind == "ref" -%}{{ node.name }}
|
||||
{%- elif node.kind == "array" -%}[{{ rust_type(node.element) }}; {{ node.length }}]
|
||||
{%- elif node.kind == "vec" -%}Vec<{{ rust_type(node.inner) }}>
|
||||
{%- elif node.kind == "option" -%}Option<{{ rust_type(node.inner) }}>
|
||||
{%- elif node.kind == "opaque" -%}::serde_json::Value
|
||||
{%- elif node.kind == "map" -%}::std::collections::BTreeMap<{{ rust_type(node.key) }}, {{ rust_type(node.value) }}>
|
||||
{%- endif -%}
|
||||
{%- endmacro -%}
|
||||
Reference in New Issue
Block a user