use std::{io, path::PathBuf};
use crate::config::common::CommonConfig;
impl CommonConfig {
pub(crate) fn valid_library_dir(
&self,
directory: impl Into<PathBuf>,
) -> Result<bool, io::Error> {
let directory = directory.into();
let cannonical_library = {
if directory.exists() {
directory.canonicalize()?
} else {
directory
}
};
if cannonical_library.is_relative() {
return Ok(false);
}
if cannonical_library.exists() && !cannonical_library.is_dir() {
return Ok(false);
}
let sources: Vec<PathBuf> = self
.source_dirs
.iter()
.map(|s| {
if s.exists() {
s.canonicalize()
} else {
Ok(s.clone())
}
})
.collect::<Result<Vec<PathBuf>, io::Error>>()?;
let valid = !sources.iter().any(|source| {
source.starts_with(&cannonical_library) || cannonical_library.starts_with(source)
});
Ok(valid)
}
pub(crate) fn valid_source_dir(
&self,
directory: impl Into<PathBuf>,
) -> Result<bool, io::Error> {
let directory = directory.into();
let canonical_source = {
if directory.exists() {
directory.canonicalize()?
} else {
directory
}
};
if canonical_source.is_relative() {
return Ok(false);
}
if canonical_source.exists() && !canonical_source.is_dir() {
return Ok(false);
}
let valid = if let Some(library_dir) = self.library_dir.as_ref() {
let canonical_library = library_dir.canonicalize()?;
!canonical_library.starts_with(&canonical_source)
&& !canonical_source.starts_with(canonical_library)
} else {
true
};
Ok(valid)
}
}