use toml_edit;
#[derive(Debug, Hash, PartialEq, Eq, Clone)]
enum DependencySource {
Version {
version: Option<String>,
path: Option<String>,
},
Git(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 {
version: None,
path: None,
},
}
}
}
impl Dependency {
pub fn new(name: &str) -> Dependency {
Dependency {
name: name.into(),
..Dependency::default()
}
}
pub fn set_version(mut self, version: &str) -> Dependency {
let old_source = self.source;
let old_path = match old_source {
DependencySource::Version { path, .. } => path,
_ => None,
};
self.source = DependencySource::Version {
version: Some(version.into()),
path: old_path,
};
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 {
let old_source = self.source;
let old_version = match old_source {
DependencySource::Version { version, .. } => version,
_ => None,
};
self.source = DependencySource::Version {
version: old_version,
path: Some(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 {
version: Some(ref version),
..
} = self.source
{
Some(version)
} else {
None
}
}
pub fn to_toml(&self) -> (String, toml_edit::Item) {
let data: toml_edit::Item = match (self.optional, self.source.clone()) {
(
false,
DependencySource::Version {
version: Some(v),
path: None,
},
) => toml_edit::value(v),
(optional, source) => {
let mut data = toml_edit::InlineTable::default();
match source {
DependencySource::Version { version, path } => {
if let Some(v) = version {
data.get_or_insert("version", v);
}
if let Some(p) = path {
data.get_or_insert("path", p);
}
}
DependencySource::Git(v) => {
data.get_or_insert("git", v);
}
}
if self.optional {
data.get_or_insert("optional", optional);
}
data.fmt();
toml_edit::value(toml_edit::Value::InlineTable(data))
}
};
(self.name.clone(), data)
}
}