`match_path_checked`: dedup match arms

This commit is contained in:
Ali MJ Al-Nasrawy 2021-06-26 21:14:17 +03:00
parent a3ad7eb11c
commit 908583982f
1 changed files with 29 additions and 41 deletions

View File

@ -264,19 +264,19 @@ impl ResourceDef {
R: Resource<T>, R: Resource<T>,
F: Fn(&R, &Option<U>) -> bool, F: Fn(&R, &Option<U>) -> bool,
{ {
match self.tp { let mut segments: [PathItem; MAX_DYNAMIC_SEGMENTS] = Default::default();
PatternType::Static(ref s) => {
if s == res.resource_path().path() && check(res, user_data) {
let path = res.resource_path(); let path = res.resource_path();
path.skip(path.len() as u16);
true let (matched_len, matched_vars) = match self.tp {
} else { PatternType::Static(ref s) => {
false if s != path.path() {
return false;
} }
(path.len(), None)
} }
PatternType::Prefix(ref s) => { PatternType::Prefix(ref s) => {
let len = { let len = {
let r_path = res.resource_path().path(); let r_path = path.path();
if s == r_path { if s == r_path {
s.len() s.len()
} else if r_path.starts_with(s) } else if r_path.starts_with(s)
@ -291,18 +291,12 @@ impl ResourceDef {
return false; return false;
} }
}; };
if !check(res, user_data) { (min(path.len(), len), None)
return false;
}
let path = res.resource_path();
path.skip(min(path.path().len(), len) as u16);
true
} }
PatternType::Dynamic(ref re, ref names, len) => { PatternType::Dynamic(ref re, ref names, len) => {
let mut pos = 0; let mut pos = 0;
let mut segments: [PathItem; MAX_DYNAMIC_SEGMENTS] = Default::default();
if let Some(captures) = re.captures(res.resource_path().path()) { if let Some(captures) = re.captures(path.path()) {
for (no, name) in names.iter().enumerate() { for (no, name) in names.iter().enumerate() {
if let Some(m) = captures.name(&name) { if let Some(m) = captures.name(&name) {
pos = m.end(); pos = m.end();
@ -318,24 +312,13 @@ impl ResourceDef {
} else { } else {
return false; return false;
} }
(pos + len, Some(names))
if !check(res, user_data) {
return false;
}
let path = res.resource_path();
for i in 0..names.len() {
path.add(names[i], mem::take(&mut segments[i]));
}
path.skip((pos + len) as u16);
true
} }
PatternType::DynamicSet(ref re, ref params) => { PatternType::DynamicSet(ref re, ref params) => {
let path = res.resource_path().path(); let path = path.path();
if let Some(idx) = re.matches(path).into_iter().next() { if let Some(idx) = re.matches(path).into_iter().next() {
let (ref pattern, ref names, len) = params[idx]; let (ref pattern, ref names, len) = params[idx];
let mut pos = 0; let mut pos = 0;
let mut segments: [PathItem; MAX_DYNAMIC_SEGMENTS] = Default::default();
if let Some(captures) = pattern.captures(path) { if let Some(captures) = pattern.captures(path) {
for (no, name) in names.iter().enumerate() { for (no, name) in names.iter().enumerate() {
@ -354,22 +337,27 @@ impl ResourceDef {
} else { } else {
return false; return false;
} }
(pos + len, Some(names))
} else {
return false;
}
}
};
if !check(res, user_data) { if !check(res, user_data) {
return false; return false;
} }
// Modify `path` to skip matched part and store matched segments
let path = res.resource_path(); let path = res.resource_path();
for i in 0..names.len() { if let Some(vars) = matched_vars {
path.add(names[i], mem::take(&mut segments[i])); for i in 0..vars.len() {
path.add(vars[i], mem::take(&mut segments[i]));
} }
path.skip((pos + len) as u16); }
path.skip(matched_len as u16);
true true
} else {
false
}
}
}
} }
/// Build resource path with a closure that maps variable elements' names to values. /// Build resource path with a closure that maps variable elements' names to values.