llm_devices/
target_dir.rs1use std::path::{Path, PathBuf};
2
3pub fn get_target_directory() -> crate::Result<PathBuf> {
23 if let Ok(target_dir) = std::env::var("CARGO_TARGET_DIR") {
25 return Ok(PathBuf::from(target_dir));
26 }
27 if let Ok(out_dir) = std::env::var("OUT_DIR") {
29 if let Some(target_dir) = find_target_in_ancestors(&PathBuf::from(out_dir)) {
30 return Ok(target_dir);
31 }
32 }
33
34 if let Ok(manifest_dir) = std::env::var("CARGO_MANIFEST_DIR") {
36 if let Some(target_dir) = find_target_in_ancestors(&PathBuf::from(manifest_dir)) {
37 return Ok(target_dir);
38 }
39 }
40
41 let manifest_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
43 match find_target_in_ancestors(&manifest_dir) {
44 Some(target_dir) => Ok(target_dir),
45 None => crate::bail!(
46 "Could not find target directory in ancestors of {}",
47 manifest_dir.display()
48 ),
49 }
50}
51
52fn find_target_in_ancestors(start_dir: &Path) -> Option<PathBuf> {
53 start_dir
54 .ancestors()
55 .find(|path| path.join("target").is_dir())
56 .map(|path| path.join("target"))
57}
58
59#[cfg(test)]
60mod tests {
61 use super::*;
62
63 #[test]
64 fn test_target_directory() {
65 let result = get_target_directory();
66 assert!(result.is_ok());
67 assert!(result.unwrap().ends_with("target"));
68 }
69}