From c8d01a3bd50448fef156c12c7f32fc69451f6d03 Mon Sep 17 00:00:00 2001 From: Moritz Baron Date: Thu, 14 Mar 2024 14:23:16 +0100 Subject: [PATCH] feat: add edges from masters closes #14 --- src/lib.rs | 8 ++++++++ src/sorter.rs | 27 ++++++++++++++++++++++++--- tests/unit_expression_tests.rs | 3 +++ 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 9898b53..2036369 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -213,6 +213,7 @@ pub struct PluginData { pub description: Option, pub version: Option, + pub masters: Option>, } impl PluginData { @@ -222,6 +223,7 @@ impl PluginData { size, description: None, version: None, + masters: None, } } } @@ -309,6 +311,7 @@ where size: f.metadata().unwrap().len(), description: None, version: None, + masters: None, }; // skip if extension is omwscripts @@ -316,6 +319,7 @@ where match parse_header(f) { Ok(header) => { data.description = Some(header.description); + data.masters = header.masters; // parse semver let version = header.version.to_string(); @@ -395,10 +399,12 @@ where size: f.metadata().unwrap().len(), description: None, version: None, + masters: None, }; match parse_header(f) { Ok(header) => { data.description = Some(header.description); + data.masters = header.masters; // parse semver let version = header.version.to_string(); @@ -451,6 +457,7 @@ where size: e.metadata().unwrap().len(), description: None, version: None, + masters: None, }; return Some(data); } @@ -859,6 +866,7 @@ where size: 0, // TODO fix dummy size description: None, version: None, + masters: None, }; result.push(data); } diff --git a/src/sorter.rs b/src/sorter.rs index 401a0c5..d13a6c3 100644 --- a/src/sorter.rs +++ b/src/sorter.rs @@ -64,13 +64,13 @@ impl Sorter { let mut index_dict: HashMap = HashMap::new(); let mut index_dict_rev: HashMap = HashMap::default(); let mut mod_map: HashMap = HashMap::default(); - for (i, m) in mods_cased.iter().enumerate() { - let lower_case = m.name.to_lowercase(); + for (i, cased_name) in mods_cased.iter().enumerate() { + let lower_case = cased_name.name.to_lowercase(); index_dict.insert(lower_case.clone(), i); index_dict_rev.insert(i, lower_case.clone()); - mod_map.insert(i, m.name.to_owned()); + mod_map.insert(i, cased_name.name.to_owned()); mods.push(lower_case.to_owned()); } @@ -101,6 +101,27 @@ impl Sorter { } } + // add edges from masters + for mod_data in mods_cased.iter() { + // add an edge from the mod to all its masters + let idx = index_dict[&mod_data.name.to_lowercase()]; + if let Some(masters) = &mod_data.masters { + for (master, _hash) in masters { + let master = master.to_lowercase(); + if let Some(results) = wild_contains(&mods, &master) { + for result in results { + let idx_master = index_dict[&result]; + let edge = (idx_master, idx); + if !edges.contains(&edge) { + edges.push(edge); + g.add_edge(edge.0, edge.1); + } + } + } + } + } + } + // cycle check if self.sort_type == ESortType::Unstable { let sort; diff --git a/tests/unit_expression_tests.rs b/tests/unit_expression_tests.rs index b190052..5009153 100644 --- a/tests/unit_expression_tests.rs +++ b/tests/unit_expression_tests.rs @@ -141,6 +141,7 @@ mod unit_tests { size: 0_u64, description: Some("description".to_string()), version: None, + masters: None, }) .collect::>(); @@ -184,6 +185,7 @@ mod unit_tests { name: e.to_string(), size: 0_u64, description: None, + masters: None, version: Some(lenient_semver::parse("1.0").unwrap()), }) .collect::>(); @@ -254,6 +256,7 @@ mod unit_tests { size: 0_u64, description: None, version: None, + masters: None, }) .collect::>();