summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorA Farzat <a@farzat.xyz>2026-06-02 13:25:52 +0300
committerA Farzat <a@farzat.xyz>2026-06-02 13:25:52 +0300
commit648142a37c36c1061117eb2d7c7f334a74b4bbc1 (patch)
tree08b1433ba750f9ec1f9d00474eff414d978ed818 /src
parent9dc2499bcdaa961a42ccee59025d6d52a296bbdf (diff)
downloadrepo2markdown-648142a37c36c1061117eb2d7c7f334a74b4bbc1.tar.gz
repo2markdown-648142a37c36c1061117eb2d7c7f334a74b4bbc1.zip
Add basic path normalization relative to origin
Diffstat (limited to 'src')
-rw-r--r--src/lib.rs35
1 files changed, 28 insertions, 7 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 0d7a010..fa6b1a9 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,4 +1,4 @@
-use std::path::{Path, PathBuf};
+use std::path::{Path, PathBuf, Component};
#[derive(Debug)]
pub enum NormalizeError {
@@ -7,13 +7,24 @@ pub enum NormalizeError {
pub fn normalize_path(
_root: &Path,
- _origin: &Path,
+ origin: &Path,
input: &Path,
) -> Result<PathBuf, NormalizeError> {
if input.as_os_str().is_empty() {
return Err(NormalizeError::EmptyInput);
}
- Ok(input.to_path_buf())
+ let mut stack = Vec::new();
+ let origin_joint_input = origin.join(input);
+ for component in origin_joint_input.components() {
+ match component {
+ Component::CurDir => (),
+ Component::ParentDir => { stack.pop(); },
+ Component::Prefix(_) => { stack.push(component); },
+ Component::Normal(_) => { stack.push(component); },
+ Component::RootDir => { stack.push(component) },
+ }
+ }
+ Ok(PathBuf::from_iter(stack))
}
#[cfg(test)]
@@ -24,8 +35,8 @@ mod tests {
#[test]
fn empty_path_returns_error() {
- let root = Path::new("/project");
- let origin_dir = Path::new("/project");
+ let root = Path::new("");
+ let origin_dir = Path::new("");
let input = Path::new("");
let result = normalize_path(root, origin_dir, input);
assert!(matches!(result, Err(NormalizeError::EmptyInput)));
@@ -33,11 +44,21 @@ mod tests {
#[test]
fn plain_filename_with_root_at_cwd_returns_filename() {
- let root = Path::new("/project");
- let origin_dir = Path::new("/project");
+ let root = Path::new("");
+ let origin_dir = Path::new("");
let input = Path::new("main.rs");
let result = normalize_path(root, origin_dir, input);
assert!(result.is_ok());
assert_eq!(result.unwrap(), Path::new("main.rs"));
}
+
+ #[test]
+ fn relative_path_from_origin_is_resolved() {
+ let root = Path::new("");
+ let origin_dir = Path::new("src");
+ let input = Path::new("../main.rs");
+ let result = normalize_path(root, origin_dir, input);
+ assert!(result.is_ok());
+ assert_eq!(result.unwrap(), Path::new("main.rs"));
+ }
}