1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
use std::path::PathBuf;
use std::env;
use std::str::FromStr;
use clap::ArgMatches;
use coveralls_api::CiService;
arg_enum!{
#[derive(Debug)]
pub enum OutputFile {
Json,
Toml,
Stdout,
Xml
}
}
struct Ci(CiService);
impl FromStr for Ci {
type Err = ();
fn from_str(s: &str) -> Result<Ci, ()> {
match s {
"travis-ci" => Ok(Ci(CiService::Travis)),
"travis-pro" => Ok(Ci(CiService::TravisPro)),
"circle-ci" => Ok(Ci(CiService::Circle)),
"semaphore" => Ok(Ci(CiService::Semaphore)),
"jenkins" => Ok(Ci(CiService::Jenkins)),
"codeship" => Ok(Ci(CiService::Codeship)),
other => Ok(Ci(CiService::Other(other.to_string()))),
}
}
}
#[derive(Debug)]
pub struct Config {
pub manifest: PathBuf,
pub run_ignored: bool,
pub skip_clean: bool,
pub verbose: bool,
pub line_coverage: bool,
pub branch_coverage: bool,
pub generate: Vec<OutputFile>,
pub coveralls: Option<String>,
pub ci_tool: Option<CiService>,
pub forward_signals: bool,
pub features: Vec<String>,
pub packages: Vec<String>,
pub varargs: Vec<String>
}
impl Config {
pub fn from_args(args: &ArgMatches) -> Config {
let mut line = args.is_present("line");
let mut branch = args.is_present("branch");
let verbose = args.is_present("verbose");
let ignored = args.is_present("ignored");
let forward = args.is_present("forward");
let skip_clean = args.is_present("skip-clean");
if !branch && !line {
branch = true;
line = true;
}
let mut root = env::current_dir().unwrap();
if let Some(path) = args.value_of("root") {
root.push(path);
};
root.push("Cargo.toml");
if let Ok(cpath) = root.canonicalize() {
root = cpath;
}
let ci_tool = match value_t!(args, "ciserver", Ci) {
Ok(ci) => Some(ci.0),
Err(_) => None,
};
let coveralls = if let Some(cio) = args.value_of("coveralls") {
Some(cio.to_string())
} else {
None
};
let out:Vec<OutputFile> = values_t!(args.values_of("out"), OutputFile)
.unwrap_or_default();
let features: Vec<String> = match args.values_of_lossy("features") {
Some(v) => v,
None => vec![],
};
let packages: Vec<String> = match args.values_of_lossy("packages") {
Some(v) => v,
None => vec![],
};
let varargs: Vec<String> = match args.values_of_lossy("args") {
Some(v) => v,
None => vec![],
};
Config{
manifest: root,
run_ignored: ignored,
verbose: verbose,
line_coverage: line,
skip_clean: skip_clean,
branch_coverage: branch,
generate: out,
coveralls: coveralls,
ci_tool: ci_tool,
forward_signals: forward,
features: features,
packages: packages,
varargs: varargs
}
}
pub fn is_coveralls(&self) -> bool {
self.coveralls.is_some()
}
}