]> git.lizzy.rs Git - rust.git/blob - crates/ra_project_model/src/lib.rs
Extract project model to separate crate
[rust.git] / crates / ra_project_model / src / lib.rs
1 mod cargo_workspace;
2 mod sysroot;
3
4 use std::path::{Path, PathBuf};
5
6 use failure::bail;
7
8 pub use crate::{
9     cargo_workspace::{CargoWorkspace, Package, Target, TargetKind},
10     sysroot::Sysroot,
11 };
12
13 // TODO use own error enum?
14 pub type Result<T> = ::std::result::Result<T, ::failure::Error>;
15
16 #[derive(Debug, Clone)]
17 pub struct ProjectWorkspace {
18     pub cargo: CargoWorkspace,
19     pub sysroot: Sysroot,
20 }
21
22 impl ProjectWorkspace {
23     pub fn discover(path: &Path) -> Result<ProjectWorkspace> {
24         let cargo_toml = find_cargo_toml(path)?;
25         let cargo = CargoWorkspace::from_cargo_metadata(&cargo_toml)?;
26         let sysroot = Sysroot::discover(&cargo_toml)?;
27         let res = ProjectWorkspace { cargo, sysroot };
28         Ok(res)
29     }
30 }
31
32 fn find_cargo_toml(path: &Path) -> Result<PathBuf> {
33     if path.ends_with("Cargo.toml") {
34         return Ok(path.to_path_buf());
35     }
36     let mut curr = Some(path);
37     while let Some(path) = curr {
38         let candidate = path.join("Cargo.toml");
39         if candidate.exists() {
40             return Ok(candidate);
41         }
42         curr = path.parent();
43     }
44     bail!("can't find Cargo.toml at {}", path.display())
45 }