// DCR — Cargo-like C/C++ project manager. // // Copyright (C) 2026 Dexoron (Bezotechestvo Vladimir) // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . use std::io; use std::path::{Path, PathBuf}; #[allow(dead_code)] pub fn check_dir(dir: Option<&str>) -> io::Result> { let path: PathBuf = match dir { None | Some(".") | Some("./") => std::env::current_dir()?, Some(value) => std::env::current_dir()?.join(value), }; let mut items = Vec::new(); for entry in std::fs::read_dir(path)? { let entry = entry?; items.push(entry.file_name().to_string_lossy().to_string()); } Ok(items) } pub fn find_project_root(start: &Path) -> io::Result> { let mut current = start.to_path_buf(); loop { if current.join("dcr.toml").is_file() { return Ok(Some(current)); } if !current.pop() { break; } } Ok(None) } pub fn with_dir(dir: &Path, f: F) -> Result where F: FnOnce() -> Result, { let prev = std::env::current_dir().map_err(|_| "Failed to get current dir".to_string())?; std::env::set_current_dir(dir).map_err(|_| "Failed to change directory".to_string())?; let result = f(); let _ = std::env::set_current_dir(prev); result }