feat(snix/castore/Path): add extension() method
This returns the extension, similar to the method we already have for PathComponent. Change-Id: Ia1719951c453c196beb991686dbee23bae1049af Reviewed-on: https://cl.snix.dev/c/snix/+/30322 Autosubmit: Florian Klink <flokli@flokli.de> Reviewed-by: Stefan Junker <mail@stefanjunker.de> Tested-by: besadii
This commit is contained in:
parent
8c525dcc2d
commit
15b1415860
1 changed files with 25 additions and 0 deletions
|
|
@ -122,6 +122,20 @@ impl Path {
|
|||
self.components_bytes().last()
|
||||
}
|
||||
|
||||
/// Returns the extension (without leading dot) of the Path, if possible.
|
||||
pub fn extension(&self) -> Option<&[u8]> {
|
||||
let file_name = match self.inner[..].rsplit_once_str(b"/") {
|
||||
Some((_, r)) => r,
|
||||
None => &self.inner[..],
|
||||
};
|
||||
let mut iter = file_name.rsplitn(2, |b| *b == b'.');
|
||||
let e = iter.next();
|
||||
// Return None if there's no dot.
|
||||
iter.next()?;
|
||||
|
||||
e
|
||||
}
|
||||
|
||||
pub fn as_bytes(&self) -> &[u8] {
|
||||
&self.inner
|
||||
}
|
||||
|
|
@ -467,4 +481,15 @@ mod test {
|
|||
) {
|
||||
PathBuf::from_host_path(&host_path, canonicalize_dotdot).expect_err("must fail");
|
||||
}
|
||||
|
||||
#[rstest]
|
||||
#[case::without_dot(PathBuf { inner: "foo".into()}, None)]
|
||||
#[case::simple(PathBuf { inner: "foo.txt".into()}, Some(&b"txt"[..]))]
|
||||
#[case::empty(PathBuf { inner: "foo.".into()}, Some(&b""[..]))]
|
||||
#[case::multiple(PathBuf { inner: "foo.bar.txt".into()}, Some(&b"txt"[..]))]
|
||||
#[case::with_components(PathBuf { inner: "foo/foo.txt".into()}, Some(&b"txt"[..]))]
|
||||
#[case::path(PathBuf { inner: "foo.a/foo".into()}, None)]
|
||||
fn extension(#[case] p: PathBuf, #[case] exp_extension: Option<&[u8]>) {
|
||||
assert_eq!(exp_extension, p.extension())
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue