aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/mozart-core/src/package/dumper
diff options
context:
space:
mode:
Diffstat (limited to 'crates/mozart-core/src/package/dumper')
-rw-r--r--crates/mozart-core/src/package/dumper/array_dumper.rs55
1 files changed, 55 insertions, 0 deletions
diff --git a/crates/mozart-core/src/package/dumper/array_dumper.rs b/crates/mozart-core/src/package/dumper/array_dumper.rs
new file mode 100644
index 0000000..cd53e7a
--- /dev/null
+++ b/crates/mozart-core/src/package/dumper/array_dumper.rs
@@ -0,0 +1,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)
+}