lib-ruby-parser-bindings 0.13.0

Tools to generate bindings for lib-ruby-parser
use crate::{helpers, options, NS as GLOBAL_NS};
use lib_ruby_parser_nodes::{template::*, Node, NodeField};

const TEMPLATE: &str = "
// Node

// Node constructors
{{ each node }}<dnl>
{{ helper node-constructor }};
{{ end }}

// Node variant predicates
{{ each node }}<dnl>
{{ helper node-variant-predicate }};
{{ end }}

// Node variant getter
{{ each node }}<dnl>
{{ helper node-variant-getter }};
{{ end }}

// Node field getters
{{ each node }}<dnl>
{{ each node-field }}<dnl>
{{ helper node-field-getter }};
{{ end }}
{{ end }}

// Node field setters
{{ each node }}<dnl>
{{ each node-field }}<dnl>
{{ helper node-field-setter }};
{{ end }}
{{ end }}

#ifdef __cplusplus
extern \"C\" {
#endif

{{ each node }}<dnl>
{{ helper internal-struct-definition }}
{{ end }}

#ifdef __cplusplus
}
#endif

// into_variant fns
{{ each node }}<dnl>
{{ helper into-variant }};
{{ end }}

// into_internal fns
{{ each node }}<dnl>
{{ helper into-internal }};
{{ end }}

// variant drop fns
{{ each node }}<dnl>
{{ helper drop-variant }};
{{ end }}

void {{ helper fn-attributes }} {{ helper ns }}__node__drop({{ helper node-blob }}* self_blob);
";

pub fn node() -> String {
    let template = TemplateRoot::new(TEMPLATE).unwrap();
    let mut fns = TemplateFns::new();
    fns.register::<Node, F::Helper>("node-constructor", helpers::nodes::constructor::sig);
    fns.register::<Node, F::Helper>(
        "node-variant-predicate",
        helpers::nodes::variant_predicate::sig,
    );
    fns.register::<Node, F::Helper>("node-variant-getter", helpers::nodes::variant_getter::sig);
    fns.register::<NodeField, F::Helper>("node-field-getter", helpers::nodes::field_getter::sig);
    fns.register::<NodeField, F::Helper>("node-field-setter", helpers::nodes::field_setter::sig);
    fns.register::<Node, F::Helper>(
        "internal-struct-definition",
        helpers::nodes::internal_struct::definition,
    );
    fns.register::<Node, F::Helper>("into-variant", helpers::nodes::into_variant::sig);
    fns.register::<Node, F::Helper>("into-internal", helpers::nodes::into_internal::sig);
    fns.register::<Node, F::Helper>("drop-variant", helpers::nodes::drop_variant::sig);

    fn fn_attributes(_: &GlobalContext) -> String {
        options().fn_attributes.to_string()
    }
    fns.register::<GlobalContext, F::Helper>("fn-attributes", fn_attributes);

    fn ns(_: &GlobalContext) -> String {
        GLOBAL_NS.to_string()
    }
    fns.register::<GlobalContext, F::Helper>("ns", ns);

    fn node_blob(_: &GlobalContext) -> String {
        options().node_blob_name.to_string()
    }
    fns.register::<GlobalContext, F::Helper>("node-blob", node_blob);

    template.render(ALL_DATA, &fns)
}