(&mut self)
| 823 | } |
| 824 | |
| 825 | fn parse_rule(&mut self) -> Result<Rule> { |
| 826 | let pos = self.pos(); |
| 827 | let name = if self.is_sym() { |
| 828 | Some( |
| 829 | self.parse_ident() |
| 830 | .map_err(|err| self.error(pos, format!("Invalid rule name: {err:?}")))?, |
| 831 | ) |
| 832 | } else { |
| 833 | None |
| 834 | }; |
| 835 | let prio = if self.is_int() { |
| 836 | Some( |
| 837 | i64::try_from(self.expect_int()?) |
| 838 | .map_err(|err| self.error(pos, format!("Invalid rule priority: {err}")))?, |
| 839 | ) |
| 840 | } else { |
| 841 | None |
| 842 | }; |
| 843 | let pattern = self.parse_pattern()?; |
| 844 | let mut iflets = vec![]; |
| 845 | loop { |
| 846 | match self.parse_iflet_or_expr()? { |
| 847 | IfLetOrExpr::IfLet(iflet) => { |
| 848 | iflets.push(iflet); |
| 849 | } |
| 850 | IfLetOrExpr::Expr(expr) => { |
| 851 | return Ok(Rule { |
| 852 | pattern, |
| 853 | iflets, |
| 854 | expr, |
| 855 | pos, |
| 856 | prio, |
| 857 | name, |
| 858 | }); |
| 859 | } |
| 860 | } |
| 861 | } |
| 862 | } |
| 863 | |
| 864 | fn parse_pattern(&mut self) -> Result<Pattern> { |
| 865 | let pos = self.pos(); |
no test coverage detected