fluidattacks-blends-domain 0.6.1

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

#[must_use]
#[allow(clippy::too_many_lines, reason = "flat node-type dispatch table")]
pub fn dispatcher(node_type: &str) -> Option<SyntaxReader> {
    match node_type {
        "arguments" => Some(javascript::arguments::reader),
        "array" => Some(javascript::array_node::reader),
        "arrow_function" => Some(javascript::arrow_function::reader),
        "assignment_expression" | "augmented_assignment_expression" => {
            Some(javascript::assignment_expression::reader)
        }
        "await_expression" => Some(javascript::await_expression::reader),
        "binary_expression" => Some(javascript::binary_expression::reader),
        "break_statement" => Some(javascript::break_statement::reader),
        "call_expression" => Some(javascript::call_expression::reader),
        "catch_clause" => Some(javascript::catch_clause::reader),
        "class_body" => Some(javascript::class_body::reader),
        "class_declaration" => Some(javascript::class_declaration::reader),
        "comment" => Some(javascript::comment::reader),
        "debugger_statement" => Some(javascript::debugger_statement::reader),
        "decorator" => Some(javascript::decorator::reader),
        "do_statement" => Some(javascript::do_statement::reader),
        "else_clause" => Some(javascript::else_clause::reader),
        "export_statement" => Some(javascript::export_statement::reader),
        "expression_statement" => Some(javascript::expression_statement::reader),
        "false" | "true" => Some(javascript::boolean_literal::reader),
        "field_definition" => Some(javascript::field_definition::reader),
        "finally_clause" => Some(javascript::finally_clause::reader),
        "for_in_statement" => Some(javascript::for_each_statement::reader),
        "for_statement" => Some(javascript::for_statement::reader),
        "formal_parameters" => Some(javascript::parameter_list::reader),
        "function"
        | "function_declaration"
        | "function_expression"
        | "generator_function_declaration"
        | "method_definition" => Some(javascript::method_declaration::reader),
        "if_statement" => Some(javascript::if_statement::reader),
        "identifier"
        | "property_identifier"
        | "shorthand_property_identifier"
        | "shorthand_property_identifier_pattern" => Some(javascript::identifier::reader),
        "import" => Some(javascript::import_node::reader),
        "import_specifier" => Some(javascript::import_module::reader),
        "import_statement" => Some(javascript::import_global::reader),
        "jsx_attribute" => Some(javascript::jsx_attribute::reader),
        "jsx_element" | "jsx_opening_element" => Some(javascript::jsx_element::reader),
        "jsx_self_closing_element" => Some(javascript::jsx_self_closing_element::reader),
        "member_expression" => Some(javascript::member_expression::reader),
        "new_expression" => Some(javascript::new_expression::reader),
        "null" => Some(javascript::null_literal::reader),
        "number" => Some(javascript::number_literal::reader),
        "object" | "object_pattern" => Some(javascript::object::reader),
        "pair" | "pair_pattern" => Some(javascript::pair::reader),
        "parenthesized_expression" => Some(javascript::parenthesized_expression::reader),
        "program" => Some(javascript::program::reader),
        "regex" | "string" | "undefined" => Some(javascript::string_literal::reader),
        "rest_pattern" => Some(javascript::rest_pattern::reader),
        "return_statement" => Some(javascript::return_statement::reader),
        "spread_element" => Some(javascript::spread_element::reader),
        "statement_block" => Some(javascript::execution_block::reader),
        "subscript_expression" => Some(javascript::subscript_expression::reader),
        "switch_body" => Some(javascript::switch_body::reader),
        "switch_case" | "switch_default" => Some(javascript::switch_section::reader),
        "switch_statement" => Some(javascript::switch_statement::reader),
        "template_string" => Some(javascript::template_string::reader),
        "ternary_expression" => Some(javascript::ternary_expression::reader),
        "this" => Some(javascript::this_node::reader),
        "throw_statement" => Some(javascript::throw_statement::reader),
        "try_statement" => Some(javascript::try_statement::reader),
        "unary_expression" => Some(javascript::unary_expression::reader),
        "update_expression" => Some(javascript::update_expression::reader),
        "lexical_declaration" | "variable_declaration" => {
            Some(javascript::variable_declaration::reader)
        }
        "variable_declarator" => Some(javascript::variable_declarator::reader),
        "while_statement" => Some(javascript::while_statement::reader),
        "yield_expression" => Some(javascript::yield_expression::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_javascript_node_types() {
        assert!(dispatcher("program").is_some());
        assert!(dispatcher("comment").is_some());
        assert!(dispatcher("true").is_some());
        assert!(dispatcher("false").is_some());
        assert!(dispatcher("null").is_some());
        assert!(dispatcher("number").is_some());
        assert!(dispatcher("string").is_some());
        assert!(dispatcher("regex").is_some());
        assert!(dispatcher("undefined").is_some());
        assert!(dispatcher("assignment_expression").is_some());
        assert!(dispatcher("augmented_assignment_expression").is_some());
        assert!(dispatcher("await_expression").is_some());
        assert!(dispatcher("binary_expression").is_some());
        assert!(dispatcher("break_statement").is_some());
        assert!(dispatcher("parenthesized_expression").is_some());
        assert!(dispatcher("return_statement").is_some());
        assert!(dispatcher("ternary_expression").is_some());
        assert!(dispatcher("throw_statement").is_some());
        assert!(dispatcher("unary_expression").is_some());
        assert!(dispatcher("update_expression").is_some());
        assert!(dispatcher("expression_statement").is_some());
        assert!(dispatcher("this").is_some());
        assert!(dispatcher("array").is_some());
        assert!(dispatcher("rest_pattern").is_some());
        assert!(dispatcher("identifier").is_some());
        assert!(dispatcher("property_identifier").is_some());
        assert!(dispatcher("shorthand_property_identifier").is_some());
        assert!(dispatcher("shorthand_property_identifier_pattern").is_some());
        assert!(dispatcher("member_expression").is_some());
        assert!(dispatcher("new_expression").is_some());
        assert!(dispatcher("spread_element").is_some());
        assert!(dispatcher("subscript_expression").is_some());
        assert!(dispatcher("decorator").is_some());
        assert!(dispatcher("template_string").is_some());
        assert!(dispatcher("catch_clause").is_some());
        assert!(dispatcher("finally_clause").is_some());
        assert!(dispatcher("import").is_some());
        assert!(dispatcher("import_specifier").is_some());
        assert!(dispatcher("import_statement").is_some());
        assert!(dispatcher("jsx_element").is_some());
        assert!(dispatcher("jsx_opening_element").is_some());
        assert!(dispatcher("jsx_self_closing_element").is_some());
        assert!(dispatcher("debugger_statement").is_some());
        assert!(dispatcher("yield_expression").is_some());
        assert!(dispatcher("object").is_some());
        assert!(dispatcher("pair").is_some());
        assert!(dispatcher("pair_pattern").is_some());
        assert!(dispatcher("formal_parameters").is_some());
        assert!(dispatcher("arguments").is_some());
        assert!(dispatcher("statement_block").is_some());
        assert!(dispatcher("class_body").is_some());
        assert!(dispatcher("do_statement").is_some());
        assert!(dispatcher("try_statement").is_some());
        assert!(dispatcher("if_statement").is_some());
        assert!(dispatcher("else_clause").is_some());
        assert!(dispatcher("while_statement").is_some());
        assert!(dispatcher("for_statement").is_some());
        assert!(dispatcher("for_in_statement").is_some());
        assert!(dispatcher("switch_statement").is_some());
        assert!(dispatcher("switch_body").is_some());
        assert!(dispatcher("function").is_some());
        assert!(dispatcher("function_declaration").is_some());
        assert!(dispatcher("function_expression").is_some());
        assert!(dispatcher("generator_function_declaration").is_some());
        assert!(dispatcher("method_definition").is_some());
        assert!(dispatcher("arrow_function").is_some());
        assert!(dispatcher("switch_case").is_some());
        assert!(dispatcher("switch_default").is_some());
        assert!(dispatcher("field_definition").is_some());
        assert!(dispatcher("jsx_attribute").is_some());
        assert!(dispatcher("object_pattern").is_some());
        assert!(dispatcher("export_statement").is_some());
        assert!(dispatcher("call_expression").is_some());
        assert!(dispatcher("class_declaration").is_some());
        assert!(dispatcher("lexical_declaration").is_some());
        assert!(dispatcher("variable_declaration").is_some());
        assert!(dispatcher("variable_declarator").is_some());
    }

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