nickel_lang_core/term/pattern/
bindings.rs1use crate::{
4 identifier::LocIdent,
5 term::{pattern::*, record::Field},
6};
7
8pub trait Bindings {
9 fn bindings(&self) -> Vec<(Vec<LocIdent>, LocIdent, Field)>;
23}
24
25trait InjectBindings {
26 fn inject_bindings(
41 &self,
42 bindings: &mut Vec<(Vec<LocIdent>, LocIdent, Field)>,
43 path: Vec<LocIdent>,
44 parent_extra: Option<&Field>,
45 );
46}
47
48impl Bindings for Pattern {
49 fn bindings(&self) -> Vec<(Vec<LocIdent>, LocIdent, Field)> {
50 let mut bindings = Vec::new();
51 self.inject_bindings(&mut bindings, Vec::new(), None);
52 bindings
53 }
54}
55
56impl InjectBindings for Pattern {
57 fn inject_bindings(
58 &self,
59 bindings: &mut Vec<(Vec<LocIdent>, LocIdent, Field)>,
60 path: Vec<LocIdent>,
61 parent_deco: Option<&Field>,
62 ) {
63 if let Some(alias) = self.alias {
64 bindings.push((
65 path.clone(),
66 alias,
67 parent_deco.cloned().unwrap_or_default(),
68 ));
69 }
70
71 self.data.inject_bindings(bindings, path, parent_deco);
72 }
73}
74
75impl InjectBindings for PatternData {
76 fn inject_bindings(
77 &self,
78 bindings: &mut Vec<(Vec<LocIdent>, LocIdent, Field)>,
79 path: Vec<LocIdent>,
80 parent_deco: Option<&Field>,
81 ) {
82 match self {
83 PatternData::Any(id) => {
84 bindings.push((path, *id, parent_deco.cloned().unwrap_or_default()))
85 }
86 PatternData::Record(record_pat) => {
87 record_pat.inject_bindings(bindings, path, parent_deco)
88 }
89 PatternData::Array(array_pat) => array_pat.inject_bindings(bindings, path, parent_deco),
90 PatternData::Enum(evariant_pat) => {
91 evariant_pat.inject_bindings(bindings, path, parent_deco)
92 }
93 PatternData::Or(or_pat) => or_pat.inject_bindings(bindings, path, parent_deco),
94 PatternData::Wildcard | PatternData::Constant(_) => (),
96 }
97 }
98}
99
100impl InjectBindings for RecordPattern {
101 fn inject_bindings(
102 &self,
103 bindings: &mut Vec<(Vec<LocIdent>, LocIdent, Field)>,
104 path: Vec<LocIdent>,
105 parent_extra: Option<&Field>,
106 ) {
107 for field_pat in self.patterns.iter() {
108 field_pat.inject_bindings(bindings, path.clone(), None);
111 }
112
113 if let TailPattern::Capture(rest) = self.tail {
114 bindings.push((path, rest, parent_extra.cloned().unwrap_or_default()));
119 }
120 }
121}
122
123impl InjectBindings for ArrayPattern {
124 fn inject_bindings(
125 &self,
126 bindings: &mut Vec<(Vec<LocIdent>, LocIdent, Field)>,
127 path: Vec<LocIdent>,
128 _parent_extra: Option<&Field>,
129 ) {
130 for subpat in self.patterns.iter() {
131 subpat.inject_bindings(bindings, path.clone(), None);
134 }
135
136 if let TailPattern::Capture(rest) = self.tail {
137 bindings.push((path, rest, Default::default()));
138 }
139 }
140}
141
142impl InjectBindings for FieldPattern {
143 fn inject_bindings(
144 &self,
145 bindings: &mut Vec<(Vec<LocIdent>, LocIdent, Field)>,
146 mut path: Vec<LocIdent>,
147 _parent_extra: Option<&Field>,
148 ) {
149 path.push(self.matched_id);
150 self.pattern
151 .inject_bindings(bindings, path, Some(&Field::from(self.annotation.clone())));
152 }
153}
154
155impl InjectBindings for EnumPattern {
156 fn inject_bindings(
157 &self,
158 bindings: &mut Vec<(Vec<LocIdent>, LocIdent, Field)>,
159 path: Vec<LocIdent>,
160 _parent_extra: Option<&Field>,
161 ) {
162 if let Some(ref arg_pat) = self.pattern {
165 arg_pat.inject_bindings(bindings, path, None);
166 }
167 }
168}
169
170impl InjectBindings for OrPattern {
171 fn inject_bindings(
172 &self,
173 bindings: &mut Vec<(Vec<LocIdent>, LocIdent, Field)>,
174 path: Vec<LocIdent>,
175 parent_extra: Option<&Field>,
176 ) {
177 for subpat in self.patterns.iter() {
178 subpat.inject_bindings(bindings, path.clone(), parent_extra);
179 }
180 }
181}