racer_cargo_metadata/
metadata.rs1use racer_interner::InternedString;
3use std::path::PathBuf;
4
5#[derive(Clone, Debug, Serialize, Deserialize)]
6pub struct Metadata {
7 pub packages: Vec<Package>,
8 pub workspace_members: Vec<PackageId>,
9 pub resolve: Option<Resolve>,
10 #[serde(default)]
11 pub workspace_root: PathBuf,
12 pub target_directory: PathBuf,
13 version: usize,
14 #[serde(skip)]
15 __guard: (),
16}
17
18#[derive(Clone, Debug, Serialize, Deserialize)]
19pub struct Package {
20 pub id: PackageId,
21 pub targets: Vec<Target>,
22 pub manifest_path: PathBuf,
23 #[serde(default = "edition_default")]
24 pub edition: InternedString,
25 #[serde(skip)]
26 __guard: (),
27}
28
29#[derive(Clone, Debug, Serialize, Deserialize)]
30pub struct Resolve {
31 pub nodes: Vec<ResolveNode>,
32 #[serde(skip)]
33 __guard: (),
34}
35
36#[derive(Clone, Debug, Serialize, Deserialize)]
37pub struct ResolveNode {
38 pub id: PackageId,
39 pub dependencies: Vec<PackageId>,
40}
41
42#[derive(Clone, Debug, Serialize, Deserialize)]
43pub struct Target {
44 pub name: InternedString,
45 pub kind: Vec<InternedString>,
46 pub src_path: PathBuf,
47 #[serde(default = "edition_default")]
48 pub edition: InternedString,
49 #[serde(skip)]
50 __guard: (),
51}
52
53const LIB_KINDS: [&'static str; 4] = ["lib", "rlib", "dylib", "proc-macro"];
54
55impl Target {
56 pub fn is_lib(&self) -> bool {
57 self.kind.iter().any(|k| LIB_KINDS.contains(&k.as_str()))
58 }
59 pub fn is_2015(&self) -> bool {
60 self.edition.as_str() == "2015"
61 }
62}
63
64#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)]
65pub struct PackageId(InternedString);
66
67impl PackageId {
68 pub fn name(&self) -> &str {
69 let idx = self.0.find(' ').expect("Whitespace not found");
70 &self.0[..idx]
71 }
72}
73
74#[inline(always)]
75fn edition_default() -> InternedString {
76 InternedString::new("2015")
77}