diff --git a/actix-router/src/resource.rs b/actix-router/src/resource.rs index 219a8202..cf5b5f53 100644 --- a/actix-router/src/resource.rs +++ b/actix-router/src/resource.rs @@ -1,4 +1,3 @@ -use std::array::IntoIter; use std::cmp::min; use std::collections::HashMap; use std::hash::{Hash, Hasher}; @@ -275,14 +274,15 @@ impl ResourceDef { PatternType::Dynamic(ref re, ref names, len) => { let mut idx = 0; let mut pos = 0; - let mut segments: [PathItem; MAX_DYNAMIC_SEGMENTS] = Default::default(); + let mut segments: [Option; MAX_DYNAMIC_SEGMENTS] = Default::default(); if let Some(captures) = re.captures(path.path()) { for (no, name) in names.iter().enumerate() { if let Some(m) = captures.name(&name) { idx += 1; pos = m.end(); - segments[no] = PathItem::Segment(m.start() as u16, m.end() as u16); + segments[no] = + Some(PathItem::Segment(m.start() as u16, m.end() as u16)); } else { log::error!( "Dynamic path match but not all segments found: {}", @@ -294,11 +294,12 @@ impl ResourceDef { } else { return false; } - for (idx, segment) in IntoIter::new(segments) + for (idx, segment) in segments + .iter_mut() .enumerate() .take_while(|(i, _)| *i != idx) { - path.add(names[idx], segment); + path.add(names[idx], segment.take().unwrap()); } path.skip((pos + len) as u16); true @@ -308,7 +309,8 @@ impl ResourceDef { let (ref pattern, ref names, len) = params[idx]; let mut idx = 0; let mut pos = 0; - let mut segments: [PathItem; MAX_DYNAMIC_SEGMENTS] = Default::default(); + let mut segments: [Option; MAX_DYNAMIC_SEGMENTS] = + Default::default(); if let Some(captures) = pattern.captures(path.path()) { for (no, name) in names.iter().enumerate() { @@ -316,7 +318,7 @@ impl ResourceDef { idx += 1; pos = m.end(); segments[no] = - PathItem::Segment(m.start() as u16, m.end() as u16); + Some(PathItem::Segment(m.start() as u16, m.end() as u16)); } else { log::error!( "Dynamic path match but not all segments found: {}", @@ -328,11 +330,12 @@ impl ResourceDef { } else { return false; } - for (idx, segment) in IntoIter::new(segments) + for (idx, segment) in segments + .iter_mut() .enumerate() .take_while(|(i, _)| *i != idx) { - path.add(names[idx], segment); + path.add(names[idx], segment.take().unwrap()); } path.skip((pos + len) as u16); true @@ -392,14 +395,15 @@ impl ResourceDef { PatternType::Dynamic(ref re, ref names, len) => { let mut idx = 0; let mut pos = 0; - let mut segments: [PathItem; MAX_DYNAMIC_SEGMENTS] = Default::default(); + let mut segments: [Option; MAX_DYNAMIC_SEGMENTS] = Default::default(); if let Some(captures) = re.captures(res.resource_path().path()) { for (no, name) in names.iter().enumerate() { if let Some(m) = captures.name(&name) { idx += 1; pos = m.end(); - segments[no] = PathItem::Segment(m.start() as u16, m.end() as u16); + segments[no] = + Some(PathItem::Segment(m.start() as u16, m.end() as u16)); } else { log::error!( "Dynamic path match but not all segments found: {}", @@ -417,11 +421,12 @@ impl ResourceDef { } let path = res.resource_path(); - for (idx, segment) in IntoIter::new(segments) + for (idx, segment) in segments + .iter_mut() .enumerate() .take_while(|(i, _)| *i != idx) { - path.add(names[idx], segment); + path.add(names[idx], segment.take().unwrap()); } path.skip((pos + len) as u16); true @@ -432,7 +437,8 @@ impl ResourceDef { let (ref pattern, ref names, len) = params[idx]; let mut idx = 0; let mut pos = 0; - let mut segments: [PathItem; MAX_DYNAMIC_SEGMENTS] = Default::default(); + let mut segments: [Option; MAX_DYNAMIC_SEGMENTS] = + Default::default(); if let Some(captures) = pattern.captures(path) { for (no, name) in names.iter().enumerate() { @@ -440,7 +446,7 @@ impl ResourceDef { idx += 1; pos = m.end(); segments[no] = - PathItem::Segment(m.start() as u16, m.end() as u16); + Some(PathItem::Segment(m.start() as u16, m.end() as u16)); } else { log::error!( "Dynamic path match but not all segments found: {}", @@ -458,11 +464,12 @@ impl ResourceDef { } let path = res.resource_path(); - for (idx, segment) in IntoIter::new(segments) + for (idx, segment) in segments + .iter_mut() .enumerate() .take_while(|(i, _)| *i != idx) { - path.add(names[idx], segment); + path.add(names[idx], segment.take().unwrap()); } path.skip((pos + len) as u16); true