fluidattacks-blends-domain 0.40.0

Blends functional core: pure AST graph to syntax graph (no_std)
Documentation
use crate::syntax::readers::go;
use crate::syntax::SyntaxReader;

#[allow(clippy::too_many_lines, reason = "one match arm per mapped node type")]
#[must_use]
pub fn dispatcher(node_type: &str) -> Option<SyntaxReader> {
    match node_type {
        "argument_list" => Some(go::argument_list::reader),
        "assignment_statement" | "short_var_declaration" => Some(go::assignment_statement::reader),
        "binary_expression" => Some(go::binary_expression::reader),
        "block" => Some(go::block::reader),
        "break_statement" => Some(go::break_statement::reader),
        "call_expression" => Some(go::call_expression::reader),
        "comment" => Some(go::comment::reader),
        "composite_literal" => Some(go::composite_literal::reader),
        "const_declaration" | "var_declaration" => Some(go::var_declaration::reader),
        "default_case" | "expression_case" | "type_case" => Some(go::switch_section::reader),
        "defer" | "go" => Some(go::reserved_words::reader),
        "defer_statement" | "expression_statement" | "go_statement" => {
            Some(go::expression_statement::reader)
        }
        "expression_list" => Some(go::expression_list::reader),
        "false" | "true" => Some(go::boolean_literal::reader),
        "field_declaration" => Some(go::field_declaration::reader),
        "for_statement" => Some(go::for_statement::reader),
        "func_literal" | "function_declaration" | "method_declaration" => {
            Some(go::function_declaration::reader)
        }
        "blank_identifier" | "field_identifier" | "identifier" | "package_identifier"
        | "type_identifier" => Some(go::identifier::reader),
        "if_statement" => Some(go::if_statement::reader),
        "inc_statement" | "dec_statement" => Some(go::inc_statement::reader),
        "import_spec" => Some(go::import_declaration::reader),
        "index_expression" => Some(go::index_expression::reader),
        "int_literal" => Some(go::int_literal::reader),
        "interface_type" => Some(go::interface_type::reader),
        "interpreted_string_literal" | "raw_string_literal" | "rune_literal" => {
            Some(go::string_literal::reader)
        }
        "keyed_element" => Some(go::pair::reader),
        "literal_element" => Some(go::literal_element::reader),
        "literal_value" => Some(go::literal_value::reader),
        "method_elem" => Some(go::method_elem::reader),
        "nil" => Some(go::nil::reader),
        "package_clause" => Some(go::package_clause::reader),
        "parameter_declaration" => Some(go::parameter_declaration::reader),
        "parameter_list" => Some(go::parameter_list::reader),
        "qualified_type" => Some(go::qualified_type::reader),
        "return_statement" => Some(go::return_statement::reader),
        "selector_expression" => Some(go::selector_expression::reader),
        "slice_expression" => Some(go::slice_expression::reader),
        "source_file" => Some(go::source_file::reader),
        "struct_type" => Some(go::struct_type::reader),
        "switch" => Some(go::switch_body::reader),
        "expression_switch_statement" | "type_switch_statement" => {
            Some(go::switch_statement::reader)
        }
        "type_conversion_expression" => Some(go::type_conversion::reader),
        "type_declaration" => Some(go::type_declaration::reader),
        "type_elem" => Some(go::type_elem::reader),
        "type_spec" | "type_alias" => Some(go::type_spec::reader),
        "type_assertion_expression" | "unary_expression" => Some(go::unary_expression::reader),
        "variadic_argument" => Some(go::spread_element::reader),
        _ => None,
    }
}

#[cfg(test)]
mod tests {
    use super::dispatcher;

    #[test]
    #[allow(clippy::too_many_lines, reason = "one assert per mapped node type")]
    fn maps_the_implemented_go_node_types() {
        assert!(dispatcher("source_file").is_some());
        assert!(dispatcher("true").is_some());
        assert!(dispatcher("false").is_some());
        assert!(dispatcher("interpreted_string_literal").is_some());
        assert!(dispatcher("raw_string_literal").is_some());
        assert!(dispatcher("rune_literal").is_some());
        assert!(dispatcher("int_literal").is_some());
        assert!(dispatcher("composite_literal").is_some());
        assert!(dispatcher("literal_element").is_some());
        assert!(dispatcher("literal_value").is_some());
        assert!(dispatcher("argument_list").is_some());
        assert!(dispatcher("assignment_statement").is_some());
        assert!(dispatcher("short_var_declaration").is_some());
        assert!(dispatcher("binary_expression").is_some());
        assert!(dispatcher("block").is_some());
        assert!(dispatcher("break_statement").is_some());
        assert!(dispatcher("call_expression").is_some());
        assert!(dispatcher("comment").is_some());
        assert!(dispatcher("nil").is_some());
        assert!(dispatcher("identifier").is_some());
        assert!(dispatcher("defer").is_some());
        assert!(dispatcher("defer_statement").is_some());
        assert!(dispatcher("go").is_some());
        assert!(dispatcher("go_statement").is_some());
        assert!(dispatcher("unary_expression").is_some());
        assert!(dispatcher("type_conversion_expression").is_some());
        assert!(dispatcher("qualified_type").is_some());
        assert!(dispatcher("selector_expression").is_some());
        assert!(dispatcher("slice_expression").is_some());
        assert!(dispatcher("index_expression").is_some());
        assert!(dispatcher("keyed_element").is_some());
        assert!(dispatcher("expression_statement").is_some());
        assert!(dispatcher("variadic_argument").is_some());
        assert!(dispatcher("expression_list").is_some());
        assert!(dispatcher("package_clause").is_some());
        assert!(dispatcher("parameter_declaration").is_some());
        assert!(dispatcher("parameter_list").is_some());
        assert!(dispatcher("return_statement").is_some());
        assert!(dispatcher("var_declaration").is_some());
        assert!(dispatcher("const_declaration").is_some());
        assert!(dispatcher("import_spec").is_some());
        assert!(dispatcher("type_declaration").is_some());
        assert!(dispatcher("struct_type").is_some());
        assert!(dispatcher("interface_type").is_some());
        assert!(dispatcher("method_elem").is_some());
        assert!(dispatcher("type_elem").is_some());
        assert!(dispatcher("field_declaration").is_some());
        assert!(dispatcher("type_spec").is_some());
        assert!(dispatcher("type_alias").is_some());
        assert!(dispatcher("function_declaration").is_some());
        assert!(dispatcher("method_declaration").is_some());
        assert!(dispatcher("func_literal").is_some());
        assert!(dispatcher("if_statement").is_some());
        assert!(dispatcher("inc_statement").is_some());
        assert!(dispatcher("dec_statement").is_some());
        assert!(dispatcher("for_statement").is_some());
        assert!(dispatcher("expression_case").is_some());
        assert!(dispatcher("default_case").is_some());
        assert!(dispatcher("type_case").is_some());
        assert!(dispatcher("switch").is_some());
        assert!(dispatcher("expression_switch_statement").is_some());
        assert!(dispatcher("type_switch_statement").is_some());
    }

    #[test]
    fn unmapped_node_types_have_no_reader() {
        assert!(dispatcher("float_literal").is_none());
        assert!(dispatcher("").is_none());
    }
}