aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/mozart-core/src/package/dumper/array_dumper.rs
blob: cd53e7a812f36338a2056fca91d4605d28f4b3e9 (plain)
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)
}