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}