lib-ruby-parser 3.0.11

Ruby parser
Documentation
use lib_ruby_parser_nodes::{template::TemplateFns, template::F, MessageField, NodeField};

pub(crate) mod node_fields {
    use super::*;

    pub(crate) fn rust_field_name(node_field: &NodeField) -> String {
        let name = node_field.snakecase_name.to_owned();

        match &name[..] {
            "const" | "as" | "else" => format!("{}_", name),
            _ => name,
        }
    }

    pub(crate) fn rust_field_type(node_field: &NodeField) -> String {
        use lib_ruby_parser_nodes::NodeFieldType::*;

        match node_field.field_type {
            Node => "Ptr<Node>",
            Nodes => "List<Node>",
            MaybeNode { .. } => "Maybe<Ptr<Node>>",
            Loc => "Loc",
            MaybeLoc => "Maybe<Loc>",
            Str { .. } => "StringPtr",
            MaybeStr { .. } => "Maybe<StringPtr>",
            StringValue => "Bytes",
            U8 => "u8",
        }
        .to_string()
    }
}

pub(crate) mod message_fields {
    use super::*;

    pub(crate) fn rust_field_type(message_field: &MessageField) -> String {
        use lib_ruby_parser_nodes::MessageFieldType::*;
        match message_field.field_type {
            Str => "StringPtr",
            Byte => "u8",
        }
        .to_string()
    }

    pub(crate) fn rust_blob_type(message_field: &MessageField) -> String {
        use lib_ruby_parser_nodes::MessageFieldType::*;
        match message_field.field_type {
            Str => "Blob<StringPtr>",
            Byte => "u8",
        }
        .to_string()
    }
}

pub(crate) fn build() -> TemplateFns {
    let mut fns = TemplateFns::new();

    fns.register::<NodeField, F::Helper>(
        "node-field-rust-field-type",
        node_fields::rust_field_type,
    );
    fns.register::<NodeField, F::Helper>(
        "node-field-rust-field-name",
        node_fields::rust_field_name,
    );

    fns.register::<MessageField, F::Helper>(
        "message-field-rust-field-type",
        message_fields::rust_field_type,
    );
    fns.register::<MessageField, F::Helper>(
        "message-field-rust-blob-type",
        message_fields::rust_blob_type,
    );

    fns
}