|
| 1 | +use crate::json::structure::VersionReqWithJsonSchema; |
| 2 | +use candid::Deserialize; |
| 3 | +use schemars::JsonSchema; |
| 4 | +use semver::Version; |
| 5 | +use std::collections::HashMap; |
| 6 | + |
| 7 | +type ExtensionVersion = Version; |
| 8 | +type DependencyName = String; |
| 9 | + |
| 10 | +#[derive(Debug, Deserialize, JsonSchema)] |
| 11 | +#[serde(rename_all = "lowercase")] |
| 12 | +pub enum DependencyRequirement { |
| 13 | + /// A SemVer version requirement, for example ">=0.17.0, <0.19.0". |
| 14 | + Version(VersionReqWithJsonSchema), |
| 15 | +} |
| 16 | + |
| 17 | +#[derive(Deserialize, Debug, JsonSchema)] |
| 18 | +pub struct ExtensionDependencies( |
| 19 | + pub HashMap<ExtensionVersion, HashMap<DependencyName, DependencyRequirement>>, |
| 20 | +); |
| 21 | + |
| 22 | +#[test] |
| 23 | +fn parse_test_file() { |
| 24 | + let f = r#" |
| 25 | +{ |
| 26 | + "0.3.4": { |
| 27 | + "dfx": { |
| 28 | + "version": ">=0.8, <0.9" |
| 29 | + } |
| 30 | + }, |
| 31 | + "0.6.2": { |
| 32 | + "dfx": { |
| 33 | + "version": ">=0.9.6" |
| 34 | + } |
| 35 | + } |
| 36 | +} |
| 37 | +"#; |
| 38 | + let m: Result<ExtensionDependencies, serde_json::Error> = dbg!(serde_json::from_str(f)); |
| 39 | + assert!(m.is_ok()); |
| 40 | + let manifest = m.unwrap(); |
| 41 | + |
| 42 | + let versions = manifest.0.keys().collect::<Vec<_>>(); |
| 43 | + assert_eq!(versions.len(), 2); |
| 44 | + assert!(versions.contains(&&Version::new(0, 3, 4))); |
| 45 | + assert!(versions.contains(&&Version::new(0, 6, 2))); |
| 46 | + |
| 47 | + let v_3_4 = manifest.0.get(&Version::new(0, 3, 4)).unwrap(); |
| 48 | + let dfx = v_3_4.get("dfx").unwrap(); |
| 49 | + let DependencyRequirement::Version(req) = dfx; |
| 50 | + assert!(req.matches(&semver::Version::new(0, 8, 5))); |
| 51 | + assert!(!req.matches(&semver::Version::new(0, 9, 0))); |
| 52 | + |
| 53 | + let v_6_2 = manifest.0.get(&Version::new(0, 6, 2)).unwrap(); |
| 54 | + let dfx = v_6_2.get("dfx").unwrap(); |
| 55 | + let DependencyRequirement::Version(req) = dfx; |
| 56 | + assert!(req.matches(&semver::Version::new(0, 9, 6))); |
| 57 | + assert!(!req.matches(&semver::Version::new(0, 9, 5))); |
| 58 | +} |
0 commit comments