Skip to content

Commit b091bbf

Browse files
author
Andrew
committed
Stage 3
1 parent 057452e commit b091bbf

File tree

2 files changed

+48
-5
lines changed

2 files changed

+48
-5
lines changed

dsc_lib/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ chrono = "0.4.26"
99
derive_builder ="0.20.0"
1010
indicatif = "0.17.0"
1111
jsonschema = "0.18.0"
12+
linked-hash-map = "0.5.6"
1213
num-traits = "0.2.14"
1314
regex = "1.7.0"
1415
reqwest = { version = "0.12.0", features = ["rustls-tls"], default-features = false }

dsc_lib/src/discovery/command_discovery.rs

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use crate::dscresources::resource_manifest::{import_manifest, validate_semver, K
88
use crate::dscresources::command_resource::invoke_command;
99
use crate::dscerror::DscError;
1010
use indicatif::ProgressStyle;
11+
use linked_hash_map::LinkedHashMap;
1112
use regex::RegexBuilder;
1213
use semver::Version;
1314
use std::collections::{BTreeMap, HashSet, HashMap};
@@ -297,7 +298,7 @@ impl ResourceDiscovery for CommandDiscovery {
297298
self.discover_resources("*")?;
298299
self.discover_adapted_resources(type_name_filter, adapter_name_filter)?;
299300

300-
// add found adapted resources to the lookup_table
301+
// add/update found adapted resources to the lookup_table
301302
add_resources_to_lookup_table(&self.adapted_resources);
302303

303304
// note: in next line 'BTreeMap::append' will leave self.adapted_resources empty
@@ -341,7 +342,8 @@ impl ResourceDiscovery for CommandDiscovery {
341342
debug!("Found {} matching non-adapter-based resources", found_resources.len());
342343

343344
// now go through the adapters
344-
for (adapter_name, adapters) in self.adapters.clone() {
345+
let sorted_adapters = sort_adapters_based_on_lookup_table(&self.adapters, &remaining_required_resource_types);
346+
for (adapter_name, adapters) in sorted_adapters {
345347
// TODO: handle version requirements
346348
let Some(adapter) = adapters.first() else {
347349
// skip if no adapters
@@ -360,7 +362,7 @@ impl ResourceDiscovery for CommandDiscovery {
360362
}
361363

362364
self.discover_adapted_resources("*", &adapter_name)?;
363-
// add found adapted resources to the lookup_table
365+
// add/update found adapted resources to the lookup_table
364366
add_resources_to_lookup_table(&self.adapted_resources);
365367

366368
// now go through the adapter resources and add them to the list of resources
@@ -506,6 +508,36 @@ fn load_manifest(path: &Path) -> Result<DscResource, DscError> {
506508
Ok(resource)
507509
}
508510

511+
fn sort_adapters_based_on_lookup_table(unsorted_adapters: &BTreeMap<String, Vec<DscResource>>, needed_resource_types: &Vec<String>) -> LinkedHashMap<String, Vec<DscResource>>
512+
{
513+
let mut result:LinkedHashMap<String, Vec<DscResource>> = LinkedHashMap::new();
514+
let lookup_table:HashMap<String, String> = load_adapted_resources_lookup_table();
515+
// first add adapters (for needed types) that can be found in the lookup table
516+
for needed_resource in needed_resource_types {
517+
match lookup_table.get(needed_resource) {
518+
Some(adapter_name) => {
519+
match unsorted_adapters.get(adapter_name) {
520+
Some(resource_vec) => {
521+
trace!("Lookup table found resource '{}' in adapter '{}'", needed_resource, adapter_name);
522+
result.insert(adapter_name.to_string(), resource_vec.to_vec());
523+
}
524+
None => {}
525+
}
526+
}
527+
None => {}
528+
}
529+
}
530+
531+
// now add remaining adapters
532+
for (adapter_name, adapters) in unsorted_adapters {
533+
if !result.contains_key(adapter_name) {
534+
result.insert(adapter_name.to_string(), adapters.to_vec());
535+
}
536+
}
537+
538+
result
539+
}
540+
509541
fn add_resources_to_lookup_table(adapted_resources: &BTreeMap<String, Vec<DscResource>>)
510542
{
511543
let mut lookup_table:HashMap<String, String> = load_adapted_resources_lookup_table();
@@ -522,10 +554,8 @@ fn save_adapted_resources_lookup_table(lookup_table: &HashMap<String, String>)
522554
{
523555
match serde_json::to_string_pretty(&lookup_table) {
524556
Ok(lookup_table_json) => {
525-
526557
let file_path = get_lookup_table_file_path();
527558
debug!("Saving lookup table with {} items to {:?}", lookup_table.len(), file_path);
528-
529559
fs::write(file_path, lookup_table_json).expect("Unable to write lookup_table file");
530560
},
531561
Err(_) => {}
@@ -560,3 +590,15 @@ fn get_lookup_table_file_path() -> String
560590

561591
Path::new(&local_app_data_path).join("dsc").join("AdaptedResourcesLookupTable.json").display().to_string()
562592
}
593+
594+
#[cfg(not(target_os = "windows"))]
595+
fn get_lookup_table_file_path() -> String
596+
{
597+
// $env:HOME+".dsc/AdaptedResourcesLookupTable.json"
598+
let home_path = match std::env::var("HOME") {
599+
Ok(path) => path,
600+
Err(_) => { return "".to_string(); }
601+
};
602+
603+
Path::new(&home_path).join(".dsc").join("AdaptedResourcesLookupTable.json").display().to_string()
604+
}

0 commit comments

Comments
 (0)