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
}