use std::path::{Path, PathBuf};
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct DependencyMode {
pub use_path: bool,
pub workspace_path: String,
pub version: &'static str,
}
impl DependencyMode {
pub fn resolve() -> Self {
let version = env!("CARGO_PKG_VERSION");
if let Some(root) = find_dev_workspace_root() {
Self {
use_path: true,
workspace_path: root.display().to_string(),
version,
}
} else {
Self {
use_path: false,
workspace_path: String::new(),
version,
}
}
}
}
pub fn is_doido_workspace(path: &Path) -> bool {
path.join("doido").join("Cargo.toml").is_file()
&& path.join("doido-generators").join("Cargo.toml").is_file()
&& path.join("doido-core").join("Cargo.toml").is_file()
}
pub fn find_dev_workspace_root() -> Option<PathBuf> {
let exe = std::env::current_exe().ok()?;
for ancestor in exe.ancestors() {
if is_doido_workspace(ancestor) {
return ancestor
.canonicalize()
.ok()
.or_else(|| Some(ancestor.to_path_buf()));
}
}
None
}
#[cfg(test)]
mod tests {
use super::*;
use std::fs;
use tempfile::tempdir;
#[test]
fn is_doido_workspace_requires_core_crates() {
let dir = tempdir().unwrap();
assert!(!is_doido_workspace(dir.path()));
fs::create_dir_all(dir.path().join("doido")).unwrap();
fs::write(
dir.path().join("doido/Cargo.toml"),
"[package]\nname = \"doido\"\n",
)
.unwrap();
assert!(!is_doido_workspace(dir.path()));
fs::create_dir_all(dir.path().join("doido-generators")).unwrap();
fs::write(
dir.path().join("doido-generators/Cargo.toml"),
"[package]\nname = \"doido-generators\"\n",
)
.unwrap();
fs::create_dir_all(dir.path().join("doido-core")).unwrap();
fs::write(
dir.path().join("doido-core/Cargo.toml"),
"[package]\nname = \"doido-core\"\n",
)
.unwrap();
assert!(is_doido_workspace(dir.path()));
}
#[test]
fn resolve_uses_path_when_test_binary_runs_inside_checkout() {
let mode = DependencyMode::resolve();
if find_dev_workspace_root().is_some() {
assert!(mode.use_path);
assert!(mode.workspace_path.contains("doido"));
} else {
assert!(!mode.use_path);
}
}
}