feat(snix/castore/PathComponent): add extension() method
This returns the file extension. Change-Id: I488cbadbce027a37d53cee808bcf7a95283ed07d Reviewed-on: https://cl.snix.dev/c/snix/+/30319 Tested-by: besadii Reviewed-by: Domen Kožar <domen@cachix.org> Reviewed-by: Stefan Junker <mail@stefanjunker.de>
This commit is contained in:
parent
6b48bcc1bf
commit
8c525dcc2d
1 changed files with 21 additions and 0 deletions
|
|
@ -12,6 +12,18 @@ pub struct PathComponent {
|
|||
pub(super) inner: bytes::Bytes,
|
||||
}
|
||||
|
||||
impl PathComponent {
|
||||
/// Extracts the extension (without leading dot) of a [PathComponent], if possible.
|
||||
pub fn extension(&self) -> Option<&[u8]> {
|
||||
let mut iter = self.inner[..].rsplitn(2, |b| *b == b'.');
|
||||
let e = iter.next();
|
||||
// Return None if there's no dot.
|
||||
iter.next()?;
|
||||
|
||||
e
|
||||
}
|
||||
}
|
||||
|
||||
/// The maximum length an individual path component can have.
|
||||
/// Linux allows 255 bytes of actual name, so we pick that.
|
||||
pub const MAX_NAME_LEN: usize = 255;
|
||||
|
|
@ -212,6 +224,15 @@ mod tests {
|
|||
}
|
||||
}
|
||||
|
||||
#[rstest]
|
||||
#[case::without_dot(PathComponent { inner: "foo".into()}, None)]
|
||||
#[case::simple(PathComponent { inner: "foo.txt".into()}, Some(&b"txt"[..]))]
|
||||
#[case::empty(PathComponent { inner: "foo.".into()}, Some(&b""[..]))]
|
||||
#[case::multiple(PathComponent { inner: "foo.bar.txt".into()}, Some(&b"txt"[..]))]
|
||||
fn extension(#[case] p: PathComponent, #[case] exp_extension: Option<&[u8]>) {
|
||||
assert_eq!(exp_extension, p.extension())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn error_toolong() {
|
||||
assert_eq!(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue