aboutsummaryrefslogtreecommitdiff
path: root/src/model/helper/bucket.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/model/helper/bucket.rs')
-rw-r--r--src/model/helper/bucket.rs73
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,