Skip to content
This repository was archived by the owner on Jun 5, 2020. It is now read-only.

Commit 66c178b

Browse files
committed
Add support for displaying enabled features
Uses the {f} format specifier.
1 parent 3703074 commit 66c178b

File tree

4 files changed

+32
-19
lines changed

4 files changed

+32
-19
lines changed

src/data.rs

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
use cargo::core::PackageId;
2+
use cargo::core::manifest::ManifestMetadata;
3+
use std::collections::HashSet;
4+
5+
6+
pub struct Node<'a> {
7+
pub id: PackageId,
8+
pub metadata: &'a ManifestMetadata,
9+
pub features: &'a HashSet<String>,
10+
}
11+
12+

src/format/mod.rs

+14-11
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
use cargo::core::manifest::ManifestMetadata;
2-
use cargo::core::PackageId;
31
use std::error::Error;
42
use std::fmt;
53

4+
use crate::data::Node;
65
use crate::format::parse::{Parser, RawChunk};
76

87
mod parse;
@@ -12,6 +11,7 @@ enum Chunk {
1211
Package,
1312
License,
1413
Repository,
14+
Features,
1515
}
1616

1717
pub struct Pattern(Vec<Chunk>);
@@ -26,6 +26,7 @@ impl Pattern {
2626
RawChunk::Argument("p") => Chunk::Package,
2727
RawChunk::Argument("l") => Chunk::License,
2828
RawChunk::Argument("r") => Chunk::Repository,
29+
RawChunk::Argument("f") => Chunk::Features,
2930
RawChunk::Argument(ref a) => {
3031
return Err(format!("unsupported pattern `{}`", a).into());
3132
}
@@ -39,39 +40,41 @@ impl Pattern {
3940

4041
pub fn display<'a>(
4142
&'a self,
42-
package: &'a PackageId,
43-
metadata: &'a ManifestMetadata,
43+
node: &'a Node,
4444
) -> Display<'a> {
4545
Display {
4646
pattern: self,
47-
package: package,
48-
metadata: metadata,
47+
node,
4948
}
5049
}
5150
}
5251

5352
pub struct Display<'a> {
5453
pattern: &'a Pattern,
55-
package: &'a PackageId,
56-
metadata: &'a ManifestMetadata,
54+
node: &'a Node<'a>,
5755
}
5856

5957
impl<'a> fmt::Display for Display<'a> {
6058
fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
6159
for chunk in &self.pattern.0 {
6260
match *chunk {
6361
Chunk::Raw(ref s) => fmt.write_str(s)?,
64-
Chunk::Package => write!(fmt, "{}", self.package)?,
62+
Chunk::Package => write!(fmt, "{}", self.node.id)?,
6563
Chunk::License => {
66-
if let Some(ref license) = self.metadata.license {
64+
if let Some(ref license) = self.node.metadata.license {
6765
write!(fmt, "{}", license)?
6866
}
6967
}
7068
Chunk::Repository => {
71-
if let Some(ref repository) = self.metadata.repository {
69+
if let Some(ref repository) = self.node.metadata.repository {
7270
write!(fmt, "{}", repository)?
7371
}
7472
}
73+
Chunk::Features => {
74+
let mut features : Vec<_> = self.node.features.iter().cloned().collect();
75+
features.sort();
76+
write!(fmt, "[{}]", features.join(","))?
77+
}
7578
}
7679
}
7780

src/format/parse.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ pub struct Parser<'a> {
1515
impl<'a> Parser<'a> {
1616
pub fn new(s: &'a str) -> Parser<'a> {
1717
Parser {
18-
s: s,
18+
s,
1919
it: s.char_indices().peekable(),
2020
}
2121
}

src/main.rs

+5-7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use cargo::core::dependency::Kind;
2-
use cargo::core::manifest::ManifestMetadata;
32
use cargo::core::maybe_allow_nightly_features;
43
use cargo::core::package::PackageSet;
54
use cargo::core::registry::PackageRegistry;
@@ -21,8 +20,10 @@ use std::rc::Rc;
2120
use structopt::clap::AppSettings;
2221
use structopt::StructOpt;
2322

23+
use crate::data::Node;
2424
use crate::format::Pattern;
2525

26+
mod data;
2627
mod format;
2728

2829
#[derive(StructOpt)]
@@ -346,11 +347,6 @@ fn resolve<'a, 'cfg>(
346347
Ok((packages, resolve))
347348
}
348349

349-
struct Node<'a> {
350-
id: PackageId,
351-
metadata: &'a ManifestMetadata,
352-
}
353-
354350
struct Graph<'a> {
355351
graph: petgraph::Graph<Node<'a>, Kind>,
356352
nodes: HashMap<PackageId, NodeIndex>,
@@ -370,6 +366,7 @@ fn build_graph<'a>(
370366
let node = Node {
371367
id: root.clone(),
372368
metadata: packages.get_one(root)?.manifest().metadata(),
369+
features: resolve.features(root),
373370
};
374371
graph.nodes.insert(root.clone(), graph.graph.add_node(node));
375372

@@ -401,6 +398,7 @@ fn build_graph<'a>(
401398
let node = Node {
402399
id: dep_id,
403400
metadata: packages.get_one(dep_id)?.manifest().metadata(),
401+
features: resolve.features(dep_id),
404402
};
405403
*e.insert(graph.graph.add_node(node))
406404
}
@@ -478,7 +476,7 @@ fn print_dependency<'a>(
478476
Prefix::None => (),
479477
}
480478

481-
println!("{}{}", format.display(&package.id, package.metadata), star);
479+
println!("{}{}", format.display(&package), star);
482480

483481
if !new {
484482
return;

0 commit comments

Comments
 (0)