Fixes/upgrades

This commit is contained in:
2026-07-30 21:12:29 -04:00
parent e00b3a177e
commit 9494549861
13 changed files with 823 additions and 60 deletions

View File

@@ -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 -%}

View File

@@ -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 -%}

View File

@@ -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 -%}