nu_protocol/ast/
match_pattern.rs1use super::Expression;
2use crate::{Span, Value, VarId};
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
7pub struct MatchPattern {
8 pub pattern: Pattern,
9 pub guard: Option<Box<Expression>>,
10 pub span: Span,
11}
12
13impl MatchPattern {
14 pub fn variables(&self) -> Vec<VarId> {
15 self.pattern.variables()
16 }
17}
18
19#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
21pub enum Pattern {
22 Record(Vec<(String, MatchPattern)>),
24 List(Vec<MatchPattern>),
26 Expression(Box<Expression>),
30 Value(Value),
32 Variable(VarId),
34 Or(Vec<MatchPattern>),
36 Rest(VarId),
38 IgnoreRest,
40 IgnoreValue,
42 Garbage,
44}
45
46impl Pattern {
47 pub fn variables(&self) -> Vec<VarId> {
48 let mut output = vec![];
49 match self {
50 Pattern::Record(items) => {
51 for item in items {
52 output.append(&mut item.1.variables());
53 }
54 }
55 Pattern::List(items) => {
56 for item in items {
57 output.append(&mut item.variables());
58 }
59 }
60 Pattern::Variable(var_id) => output.push(*var_id),
61 Pattern::Or(patterns) => {
62 for pattern in patterns {
63 output.append(&mut pattern.variables());
64 }
65 }
66 Pattern::Rest(var_id) => output.push(*var_id),
67 Pattern::Expression(_)
68 | Pattern::Value(_)
69 | Pattern::IgnoreValue
70 | Pattern::Garbage
71 | Pattern::IgnoreRest => {}
72 }
73
74 output
75 }
76}