use std::path::{Path, PathBuf};
use crate::error::{Error, Result};
use crate::provenance::Provenance;
pub(crate) fn expand_import(
importer: &Path,
base_dir: &Path,
entry: &str,
root: &Path,
) -> Result<Vec<PathBuf>> {
let candidate = PathBuf::from(entry);
let resolved = if candidate.is_absolute() {
candidate
} else {
base_dir.join(candidate)
};
if resolved.is_dir() {
return list_yaml_files(&resolved, root);
}
if resolved.is_file() {
return Ok(vec![resolved]);
}
Err(Error::ImportMissing {
importer: Provenance::shorten(importer, root),
path: Provenance::shorten(&resolved, root),
})
}
fn list_yaml_files(dir: &Path, root: &Path) -> Result<Vec<PathBuf>> {
let mut files = Vec::new();
let entries = std::fs::read_dir(dir).map_err(|source| Error::ImportNotReadable {
path: Provenance::shorten(dir, root),
source,
})?;
for entry in entries {
let entry = entry.map_err(|source| Error::ImportNotReadable {
path: Provenance::shorten(dir, root),
source,
})?;
let candidate = entry.path();
if !candidate.is_file() {
continue;
}
let is_yaml = candidate
.extension()
.and_then(std::ffi::OsStr::to_str)
.is_some_and(|extension| extension == "yaml" || extension == "yml");
if is_yaml {
files.push(candidate);
}
}
files.sort();
Ok(files)
}