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
|
use crate::composer::{InstallationSource, LocalPackage};
/// Mirrors `Composer\Package\Dumper\ArrayDumper`. Serialises a `LocalPackage`
/// into the JSON shape that `VersionGuesser::guess_version` expects.
#[derive(Default)]
pub struct ArrayDumper;
impl ArrayDumper {
pub fn new() -> Self {
Self
}
pub fn dump(&self, package: &LocalPackage) -> serde_json::Value {
build_package_config(package)
}
}
/// Serialises a `LocalPackage` to the JSON shape consumed by
/// `VersionGuesser::guess_version`. Mirrors `ArrayDumper::dump($package)` —
/// we include all fields that `VersionGuesser` inspects.
fn build_package_config(package: &LocalPackage) -> serde_json::Value {
let mut obj = serde_json::Map::new();
obj.insert("name".into(), package.pretty_name().into());
obj.insert("version".into(), package.pretty_version().into());
if let Some(t) = package.package_type() {
obj.insert("type".into(), t.into());
}
obj.insert("extra".into(), package.extra().clone());
if let Some(src) = package.source() {
let mut s = serde_json::Map::new();
s.insert("type".into(), src.kind.clone().into());
s.insert("url".into(), src.url.clone().into());
if let Some(r) = &src.reference {
s.insert("reference".into(), r.clone().into());
}
obj.insert("source".into(), serde_json::Value::Object(s));
}
if let Some(dist) = package.dist() {
let mut d = serde_json::Map::new();
d.insert("type".into(), dist.kind.clone().into());
d.insert("url".into(), dist.url.clone().into());
if let Some(r) = &dist.reference {
d.insert("reference".into(), r.clone().into());
}
obj.insert("dist".into(), serde_json::Value::Object(d));
}
if let Some(is) = package.installation_source() {
let s = match is {
InstallationSource::Source => "source",
InstallationSource::Dist => "dist",
};
obj.insert("installation-source".into(), s.into());
}
serde_json::Value::Object(obj)
}
|