| 630 | } |
| 631 | |
| 632 | fn parse_node_pattern( |
| 633 | pair: Pair<'_, Rule>, |
| 634 | un_named_counter: &mut usize, |
| 635 | ) -> Result<NodePattern, ParseError> { |
| 636 | let mut node = NodePattern::default(); |
| 637 | for pair in pair.into_inner() { |
| 638 | match pair.as_rule() { |
| 639 | Rule::Variable => { |
| 640 | let var = parse_variable(pair)?; |
| 641 | node.name = var; |
| 642 | } |
| 643 | Rule::NodeLabels => { |
| 644 | let labels = pair |
| 645 | .into_inner() |
| 646 | .filter_map(|pair| parse_node_label(pair)) |
| 647 | .collect(); |
| 648 | node.labels = labels; |
| 649 | } |
| 650 | Rule::Properties => match pair.into_inner().next() { |
| 651 | Some(pair) => match pair.as_rule() { |
| 652 | Rule::MapLiteral => { |
| 653 | let props = parse_map_literal(pair)?; |
| 654 | node.props = Some(props); |
| 655 | } |
| 656 | rule => return unsupported("parse_node_pattern 2", &rule), |
| 657 | }, |
| 658 | None => {} |
| 659 | }, |
| 660 | rule => return unsupported("parse_node_pattern 1", &rule), |
| 661 | } |
| 662 | } |
| 663 | |
| 664 | if node.name.is_empty() { |
| 665 | node.name = format!("n_{}", un_named_counter); |
| 666 | *un_named_counter += 1; |
| 667 | } |
| 668 | |
| 669 | Ok(node) |
| 670 | } |
| 671 | |
| 672 | fn parse_node_label(pair: Pair<'_, Rule>) -> Option<String> { |
| 673 | match pair.as_rule() { |