|
| 1 | +use serde::{ser::SerializeTuple, Serialize}; |
| 2 | + |
| 3 | +use super::PackageEntry; |
| 4 | + |
| 5 | +impl Serialize for PackageEntry { |
| 6 | + fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> { |
| 7 | + let mut tuple = serializer.serialize_tuple(4)?; |
| 8 | + tuple.serialize_element(&self.ident)?; |
| 9 | + |
| 10 | + if let Some(info) = &self.info { |
| 11 | + tuple.serialize_element(&self.registry.as_deref().unwrap_or(""))?; |
| 12 | + tuple.serialize_element(info)?; |
| 13 | + tuple.serialize_element(&self.checksum)?; |
| 14 | + if let Some(root) = &self.root { |
| 15 | + tuple.serialize_element(root)?; |
| 16 | + } |
| 17 | + }; |
| 18 | + |
| 19 | + tuple.end() |
| 20 | + } |
| 21 | +} |
| 22 | + |
| 23 | +#[cfg(test)] |
| 24 | +mod test { |
| 25 | + use serde_json::json; |
| 26 | + |
| 27 | + use super::*; |
| 28 | + use crate::bun::PackageInfo; |
| 29 | + |
| 30 | + #[test] |
| 31 | + fn test_serialize_registry_package() { |
| 32 | + let package = PackageEntry { |
| 33 | + ident: "[email protected]".into(), |
| 34 | + registry: Some("registry".into()), |
| 35 | + info: Some(PackageInfo { |
| 36 | + dependencies: [("is-number".into(), "^6.0.0".into())] |
| 37 | + .into_iter() |
| 38 | + .collect(), |
| 39 | + ..Default::default() |
| 40 | + }), |
| 41 | + checksum: Some("sha".into()), |
| 42 | + root: None, |
| 43 | + }; |
| 44 | + |
| 45 | + let expected = |
| 46 | + json!(["[email protected]", "registry", {"dependencies": {"is-number": "^6.0.0"}}, "sha"]); |
| 47 | + let actual = serde_json::to_value(&package).unwrap(); |
| 48 | + assert_eq!(actual, expected); |
| 49 | + } |
| 50 | + |
| 51 | + #[test] |
| 52 | + fn test_serialize_registry_package_no_deps() { |
| 53 | + let package = PackageEntry { |
| 54 | + ident: "[email protected]".into(), |
| 55 | + registry: Some("registry".into()), |
| 56 | + info: Some(PackageInfo { |
| 57 | + ..Default::default() |
| 58 | + }), |
| 59 | + checksum: Some("sha".into()), |
| 60 | + root: None, |
| 61 | + }; |
| 62 | + |
| 63 | + let expected = json!(["[email protected]", "registry", {}, "sha"]); |
| 64 | + let actual = serde_json::to_value(&package).unwrap(); |
| 65 | + assert_eq!(actual, expected); |
| 66 | + } |
| 67 | + |
| 68 | + #[test] |
| 69 | + fn test_serialize_workspace_package() { |
| 70 | + let package = PackageEntry { |
| 71 | + ident: "@workspace/package".into(), |
| 72 | + registry: None, |
| 73 | + info: None, |
| 74 | + checksum: None, |
| 75 | + root: None, |
| 76 | + }; |
| 77 | + |
| 78 | + let expected = json!(["@workspace/package"]); |
| 79 | + let actual = serde_json::to_value(&package).unwrap(); |
| 80 | + assert_eq!(actual, expected); |
| 81 | + } |
| 82 | +} |
0 commit comments