Implement slice patterns
diff --git a/src/expr.rs b/src/expr.rs
index 5784a73..d650e22 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -907,7 +907,8 @@
pat_tuple
|
pat_ref
- // TODO: Vec
+ |
+ pat_slice
));
named!(pat_mac -> Pat, map!(mac, Pat::Mac));
@@ -1038,6 +1039,23 @@
(Pat::Range(Box::new(lo), Box::new(hi)))
));
+ named!(pat_slice -> Pat, do_parse!(
+ punct!("[") >>
+ before: separated_list!(punct!(","), pat) >>
+ after: option!(do_parse!(
+ cond!(!before.is_empty(), punct!(",")) >>
+ punct!("..") >>
+ after: many0!(preceded!(punct!(","), pat)) >>
+ cond!(!after.is_empty(), option!(punct!(","))) >>
+ (after)
+ )) >>
+ punct!("]") >>
+ (match after {
+ Some(after) => Pat::Slice(before, Some(Box::new(Pat::Wild)), after),
+ None => Pat::Slice(before, None, Vec::new()),
+ })
+ ));
+
named!(capture_by -> CaptureBy, alt!(
keyword!("move") => { |_| CaptureBy::Value }
|
@@ -1454,7 +1472,25 @@
tokens.append("...");
hi.to_tokens(tokens);
}
- Pat::Slice(ref _before, ref _dots, ref _after) => unimplemented!(),
+ Pat::Slice(ref before, ref dots, ref after) => {
+ tokens.append("[");
+ tokens.append_separated(before, ",");
+ match *dots {
+ Some(ref dots) if **dots == Pat::Wild => {
+ if !before.is_empty() {
+ tokens.append(",");
+ }
+ tokens.append("..");
+ if !after.is_empty() {
+ tokens.append(",");
+ }
+ tokens.append_separated(after, ",");
+ }
+ None => {}
+ _ => unimplemented!(),
+ }
+ tokens.append("]");
+ }
Pat::Mac(ref mac) => mac.to_tokens(tokens),
}
}