lib-ruby-parser 3.0.11

Ruby parser
Documentation
use lib_ruby_parser_nodes::{template::*, Message, MessageField};

const TEMPLATE: &str = "// This file is autogenerated by {{ helper generated-by }}

#include \"bindings.h\"

// constructors
{{ each message }}<dnl>
{{ helper constructor-sig }}
{
    LIB_RUBY_PARSER_DiagnosticMessage message = {
        .tag = LIB_RUBY_PARSER_MESSAGE_{{ helper message-upper-name }},
        .as = {
            .{{ helper message-lower-name }} = {
{{ each message-field }}<dnl>
                .{{ helper message-field-c-name }} = {{ helper message-field-c-unpack-fn-name }}({{ helper message-field-c-name }}_blob),
{{ end }}<dnl>
            }
        }
    };
    return PACK_DiagnosticMessage(message);
}
{{ end }}<dnl>

// variant getters
{{ each message }}<dnl>
{{ helper variant-getter-sig }}
{
    const LIB_RUBY_PARSER_DiagnosticMessage *self = (const LIB_RUBY_PARSER_DiagnosticMessage *)self_blob;
    if (self->tag == LIB_RUBY_PARSER_MESSAGE_{{ helper message-upper-name }}) {
        return (const LIB_RUBY_PARSER_{{ helper message-camelcase-name }}_BLOB*)(&(self->as.{{ helper message-lower-name }}));
    } else {
        return NULL;
    }
}
{{ end }}<dnl>

// field getters
{{ each message }}<dnl>
{{ each message-field }}<dnl>
{{ helper field-getter-sig }}
{
    const LIB_RUBY_PARSER_{{ helper message-camelcase-name }} *self = (const LIB_RUBY_PARSER_{{ helper message-camelcase-name }} *)self_blob;
    return (const {{ helper message-field-c-blob-type }} *)(&(self->{{ helper message-field-c-name }}));
}
{{ end }}<dnl>
{{ end }}<dnl>

// variant predicates
{{ each message }}<dnl>
{{ helper variant-predicate-sig }}
{
    return ((const LIB_RUBY_PARSER_DiagnosticMessage *)self_blob)->tag == LIB_RUBY_PARSER_MESSAGE_{{ helper message-upper-name }};
}
{{ end }}<dnl>

void lib_ruby_parser__external__diagnostic_message__drop(LIB_RUBY_PARSER_DiagnosticMessage_BLOB *self_blob)
{
    LIB_RUBY_PARSER_DiagnosticMessage *self = (LIB_RUBY_PARSER_DiagnosticMessage *)self_blob;
    LIB_RUBY_PARSER_drop_diagnostic_message(self);
}
";

pub(crate) fn codegen() {
    let template = TemplateRoot::new(TEMPLATE).unwrap();
    let mut fns = crate::codegen::fns::default_fns!();

    fns.register::<Message, F::Helper>(
        "constructor-sig",
        lib_ruby_parser_bindings::helpers::messages::constructor::sig,
    );
    fns.register::<Message, F::Helper>(
        "variant-getter-sig",
        lib_ruby_parser_bindings::helpers::messages::variant_getter::sig,
    );
    fns.register::<MessageField, F::Helper>(
        "field-getter-sig",
        lib_ruby_parser_bindings::helpers::messages::field_getter::sig,
    );
    fns.register::<Message, F::Helper>(
        "variant-predicate-sig",
        lib_ruby_parser_bindings::helpers::messages::variant_predicate::sig,
    );

    let contents = template.render(ALL_DATA, &fns);
    std::fs::write("external/c/bindings_messages.c", contents).unwrap();
}