lockdiff/
dart.rs

1use std::collections::BTreeMap;
2
3use crate::{Package, PackageMetadata};
4use anyhow::Result;
5use serde::Deserialize;
6
7#[derive(Deserialize, Debug)]
8struct PubSpecLock {
9    packages: BTreeMap<String, PackageMetadata>,
10}
11
12impl PubSpecLock {
13    fn packages(self) -> Vec<Package> {
14        self.packages
15            .into_iter()
16            .map(|(key, value)| Package::new(&key, &value.version))
17            .collect()
18    }
19}
20
21pub(crate) fn parse_pubspec_lock(contents: &str) -> Result<Vec<Package>> {
22    let pub_spec_lock: PubSpecLock = serde_yml::from_str(contents)?;
23    Ok(pub_spec_lock.packages())
24}
25
26#[cfg(test)]
27mod tests {
28
29    use super::*;
30
31    #[test]
32    fn test_parse_pubspec_lock() {
33        let contents = r#"
34# Generated by pub
35# See https://dart.dev/tools/pub/glossary#lockfile
36packages:
37  _macros:
38    dependency: transitive
39    description: dart
40    source: sdk
41    version: "0.3.3"
42  analyzer:
43    dependency: transitive
44    description:
45      name: analyzer
46      sha256: c9040fc56483c22a5e04a9f6a251313118b1a3c42423770623128fa484115643
47      url: "https://pub.dev"
48    source: hosted
49    version: "7.2.0"
50  args:
51    dependency: transitive
52    description:
53      name: args
54      sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6
55      url: "https://pub.dev"
56    source: hosted
57    version: "2.6.0"
58"#;
59        let packages = parse_pubspec_lock(contents).unwrap();
60        assert_eq!(
61            packages,
62            &[
63                Package::new("_macros", "0.3.3"),
64                Package::new("analyzer", "7.2.0"),
65                Package::new("args", "2.6.0")
66            ]
67        );
68    }
69}