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
use std::collections::BTreeMap;
use toml;
#[derive(Debug, Hash, PartialEq, Eq, Clone)]
enum DependencySource {
Version(String),
Git(String),
Path(String),
}
#[derive(Debug, Hash, PartialEq, Eq, Clone)]
pub struct Dependency {
pub name: String,
optional: bool,
source: DependencySource,
}
impl Default for Dependency {
fn default() -> Dependency {
Dependency {
name: "".into(),
optional: false,
source: DependencySource::Version("0.1.0".into()),
}
}
}
impl Dependency {
pub fn new(name: &str) -> Dependency {
Dependency {
name: name.into(),
..Dependency::default()
}
}
pub fn set_version(mut self, version: &str) -> Dependency {
self.source = DependencySource::Version(version.into());
self
}
pub fn set_git(mut self, repo: &str) -> Dependency {
self.source = DependencySource::Git(repo.into());
self
}
pub fn set_path(mut self, path: &str) -> Dependency {
self.source = DependencySource::Path(path.into());
self
}
pub fn set_optional(mut self, opt: bool) -> Dependency {
self.optional = opt;
self
}
pub fn version(&self) -> Option<&str> {
if let DependencySource::Version(ref version) = self.source {
Some(version)
} else {
None
}
}
pub fn to_toml(&self) -> (String, toml::Value) {
let data: toml::Value = match (self.optional, self.source.clone()) {
(false, DependencySource::Version(v)) => toml::Value::String(v),
(optional, source) => {
let mut data = BTreeMap::new();
match source {
DependencySource::Version(v) => {
data.insert("version".into(), toml::Value::String(v));
}
DependencySource::Git(v) => {
data.insert("git".into(), toml::Value::String(v));
}
DependencySource::Path(v) => {
data.insert("path".into(), toml::Value::String(v));
}
}
if self.optional {
data.insert("optional".into(), toml::Value::Boolean(optional));
}
toml::Value::Table(data)
}
};
(self.name.clone(), data)
}
}