Skip to main content

hadris_common/
path.rs

1//! Path utilities shared across filesystem implementations.
2
3extern crate alloc;
4use alloc::string::{String, ToString};
5use alloc::vec::Vec;
6
7/// Splits a path into (directory, filename).
8///
9/// Returns `None` if the path is empty or contains only separators.
10///
11/// # Examples
12/// ```
13/// # use hadris_common::path::split_path;
14/// assert_eq!(split_path("dir/file.txt"), Some(("dir".into(), "file.txt".into())));
15/// assert_eq!(split_path("file.txt"), Some(("".into(), "file.txt".into())));
16/// assert_eq!(split_path("/a/b/c.txt"), Some(("a/b".into(), "c.txt".into())));
17/// assert_eq!(split_path(""), None);
18/// assert_eq!(split_path("/"), None);
19/// ```
20pub fn split_path(path: &str) -> Option<(String, String)> {
21    let parts: Vec<&str> = path.split('/').filter(|s| !s.is_empty()).collect();
22    if parts.is_empty() {
23        return None;
24    }
25
26    let filename = parts.last().unwrap().to_string();
27    let dir_path = if parts.len() > 1 {
28        parts[..parts.len() - 1].join("/")
29    } else {
30        String::new()
31    };
32
33    Some((dir_path, filename))
34}