Skip to main content

elm_ast/
pattern.rs

1use crate::ident::{Ident, ModuleName};
2use crate::literal::Literal;
3use crate::node::Spanned;
4
5/// A pattern in Elm source code.
6///
7/// Patterns appear in function arguments, case branches, let destructuring, and
8/// lambda arguments.
9#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10#[derive(Clone, Debug, PartialEq, Eq)]
11pub enum Pattern {
12    /// Wildcard pattern: `_`
13    Anything,
14
15    /// Variable binding: `x`, `name`
16    Var(Ident),
17
18    /// Literal pattern: `42`, `"hello"`, `'c'`
19    Literal(Literal),
20
21    /// Unit pattern: `()`
22    Unit,
23
24    /// Tuple pattern: `( a, b )` or `( a, b, c )`
25    Tuple(Vec<Spanned<Pattern>>),
26
27    /// Constructor pattern, possibly qualified: `Just x`, `Maybe.Nothing`
28    Constructor {
29        module_name: ModuleName,
30        name: Ident,
31        args: Vec<Spanned<Pattern>>,
32    },
33
34    /// Record destructuring pattern: `{ name, age }`
35    Record(Vec<Spanned<Ident>>),
36
37    /// Cons pattern: `x :: xs`
38    Cons {
39        head: Box<Spanned<Pattern>>,
40        tail: Box<Spanned<Pattern>>,
41    },
42
43    /// List pattern: `[ x, y, z ]`
44    List(Vec<Spanned<Pattern>>),
45
46    /// As pattern: `_ as name`, `(x, y) as point`
47    As {
48        pattern: Box<Spanned<Pattern>>,
49        name: Spanned<Ident>,
50    },
51
52    /// Parenthesized pattern: `( pattern )`
53    Parenthesized(Box<Spanned<Pattern>>),
54
55    /// Hex literal pattern: `0xFF`
56    Hex(i64),
57}