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}