diff options
Diffstat (limited to 'src/model/helper/bucket.rs')
-rw-r--r-- | src/model/helper/bucket.rs | 73 |
1 files changed, 40 insertions, 33 deletions
diff --git a/src/model/helper/bucket.rs b/src/model/helper/bucket.rs index e5506d7e..fe86c9d9 100644 --- a/src/model/helper/bucket.rs +++ b/src/model/helper/bucket.rs @@ -73,41 +73,48 @@ impl<'a> BucketHelper<'a> { pattern: &String, ) -> Result<Uuid, Error> { if let Some(uuid) = self.resolve_global_bucket_name(pattern).await? { - return Ok(uuid); - } else if pattern.len() >= 2 { - let hexdec = pattern - .get(..pattern.len() & !1) - .and_then(|x| hex::decode(x).ok()); - if let Some(hex) = hexdec { - let mut start = [0u8; 32]; - start - .as_mut_slice() - .get_mut(..hex.len()) - .ok_or_bad_request("invalid length")? - .copy_from_slice(&hex); - let mut candidates = self - .0 - .bucket_table - .get_range( - &EmptyKey, - Some(start.into()), - Some(DeletedFilter::NotDeleted), - 10, - EnumerationOrder::Forward, - ) - .await? - .into_iter() - .collect::<Vec<_>>(); - candidates.retain(|x| hex::encode(x.id).starts_with(pattern)); - if candidates.len() == 1 { - return Ok(candidates.into_iter().next().unwrap().id); - } + Ok(uuid) + } else { + let hexdec = if pattern.len() >= 2 { + pattern + .get(..pattern.len() & !1) + .and_then(|x| hex::decode(x).ok()) + } else { + None + }; + let hex = hexdec.ok_or_else(|| Error::NoSuchBucket(pattern.clone()))?; + + let mut start = [0u8; 32]; + start + .as_mut_slice() + .get_mut(..hex.len()) + .ok_or_bad_request("invalid length")? + .copy_from_slice(&hex); + let mut candidates = self + .0 + .bucket_table + .get_range( + &EmptyKey, + Some(start.into()), + Some(DeletedFilter::NotDeleted), + 10, + EnumerationOrder::Forward, + ) + .await? + .into_iter() + .collect::<Vec<_>>(); + candidates.retain(|x| hex::encode(x.id).starts_with(pattern)); + if candidates.is_empty() { + Err(Error::NoSuchBucket(pattern.clone())) + } else if candidates.len() == 1 { + Ok(candidates.into_iter().next().unwrap().id) + } else { + Err(Error::BadRequest(format!( + "Several matching buckets: {}", + pattern + ))) } } - Err(Error::BadRequest(format!( - "Bucket not found / several matching buckets: {}", - pattern - ))) } /// Returns a Bucket if it is present in bucket table, |