#[must_use]
pub fn bucket_name(key: &[u8]) -> Option<&[u8]> {
let slash = key.iter().position(|&b| b == b'/')?;
if slash == 0 {
return None;
}
Some(&key[..slash])
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn no_slash_returns_none() {
assert_eq!(bucket_name(b""), None);
assert_eq!(bucket_name(b"plain"), None);
assert_eq!(bucket_name(b"key-with-no-slash"), None);
}
#[test]
fn single_slash_returns_prefix() {
assert_eq!(bucket_name(b"users/42"), Some(&b"users"[..]));
assert_eq!(bucket_name(b"a/b"), Some(&b"a"[..]));
assert_eq!(bucket_name(b"only-prefix/"), Some(&b"only-prefix"[..]));
}
#[test]
fn multi_slash_returns_first_segment() {
assert_eq!(bucket_name(b"a/b/c"), Some(&b"a"[..]));
assert_eq!(
bucket_name(b"sessions/2026/05/23/abc"),
Some(&b"sessions"[..]),
);
}
#[test]
fn empty_prefix_returns_none() {
assert_eq!(bucket_name(b"/"), None);
assert_eq!(bucket_name(b"/leading-slash"), None);
assert_eq!(bucket_name(b"//double"), None);
}
#[test]
fn binary_safe_keys_round_trip() {
let key = b"\xffbucket\xff/\xfekey";
assert_eq!(bucket_name(key), Some(&key[..8]));
}
}