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}