Files
codeql/misc/codegen/templates/rust_classes.mustache

52 lines
1.7 KiB
Plaintext

// generated by {{generator}}
use crate::trap::{TrapLabel, TrapId, TrapEntry, quoted};
use std::io::Write;
{{#classes}}
#[derive(Debug)]
pub struct {{name}} {
pub id: TrapId,
{{#fields}}
pub {{field_name}}: {{type}},
{{/fields}}
}
impl TrapEntry for {{name}} {
fn extract_id(&mut self) -> TrapId {
std::mem::replace(&mut self.id, TrapId::Star)
}
fn emit<W: Write>(self, id: TrapLabel, out: &mut W) -> std::io::Result<()> {
write!(out, "{{table_name}}({id}{{#single_fields}}, {}{{/single_fields}})\n"{{#single_fields}}, {{#emitter}}self.{{field_name}}{{/emitter}}{{/single_fields}})?;
{{#fields}}
{{#is_predicate}}
if self.{{field_name}} {
write!(out, "{{table_name}}({id})\n")?;
}
{{/is_predicate}}
{{#is_optional}}
{{^is_repeated}}
if let Some(ref v) = &self.{{field_name}} {
write!(out, "{{table_name}}({id}, {})\n", {{#emitter}}v{{/emitter}})?;
}
{{/is_repeated}}
{{/is_optional}}
{{#is_repeated}}
for (i, &ref v) in self.{{field_name}}.iter().enumerate() {
{{^is_optional}}
write!(out, "{{table_name}}({id}, {{^is_unordered}}{}, {{/is_unordered}}{})\n", {{^is_unordered}}i, {{/is_unordered}}{{#emitter}}v{{/emitter}})?;
{{/is_optional}}
{{#is_optional}}
if let Some(ref vv) = &v {
write!(out, "{{table_name}}({id}, {{^is_unordered}}{}, {{/is_unordered}}{})\n", {{^is_unordered}}i, {{/is_unordered}}{{#emitter}}vv{{/emitter}})?;
}
{{/is_optional}}
}
{{/is_repeated}}
{{/fields}}
Ok(())
}
}
{{/classes}}