use std::path::{Path, PathBuf};
use crate::domain::Hrid;
#[must_use]
pub fn construct_path_from_hrid(
root: &Path,
hrid: &Hrid,
subfolders_are_namespaces: bool,
digits: usize,
) -> PathBuf {
if subfolders_are_namespaces {
let mut path = root.to_path_buf();
for segment in hrid.namespace() {
path.push(segment);
}
let filename = format!("{}-{:0width$}", hrid.kind(), hrid.id(), width = digits);
path.push(filename);
path.with_extension("md")
} else {
root.join(hrid.to_string()).with_extension("md")
}
}
#[cfg(test)]
mod tests {
use std::path::PathBuf;
use super::*;
#[test]
fn construct_path_filename_based() {
let root = PathBuf::from("/root");
let hrid = Hrid::try_from("SYSTEM-AUTH-REQ-001").unwrap();
let path = construct_path_from_hrid(&root, &hrid, false, 3);
assert_eq!(path, root.join("SYSTEM-AUTH-REQ-001.md"));
}
#[test]
fn construct_path_path_based() {
let root = PathBuf::from("/root");
let hrid = Hrid::try_from("SYSTEM-AUTH-REQ-001").unwrap();
let path = construct_path_from_hrid(&root, &hrid, true, 3);
assert_eq!(path, root.join("SYSTEM/AUTH/REQ-001.md"));
}
#[test]
fn construct_path_path_based_no_namespace() {
let root = PathBuf::from("/root");
let hrid = Hrid::try_from("REQ-001").unwrap();
let path = construct_path_from_hrid(&root, &hrid, true, 3);
assert_eq!(path, root.join("REQ-001.md"));
}
#[test]
fn construct_path_with_custom_digits() {
let root = PathBuf::from("/root");
let hrid = Hrid::try_from("REQ-001").unwrap();
let path = construct_path_from_hrid(&root, &hrid, true, 5);
assert_eq!(path, root.join("REQ-00001.md"));
}
}