@@ -8,6 +8,7 @@ use crate::dscresources::resource_manifest::{import_manifest, validate_semver, K
8
8
use crate :: dscresources:: command_resource:: invoke_command;
9
9
use crate :: dscerror:: DscError ;
10
10
use indicatif:: ProgressStyle ;
11
+ use linked_hash_map:: LinkedHashMap ;
11
12
use regex:: RegexBuilder ;
12
13
use semver:: Version ;
13
14
use std:: collections:: { BTreeMap , HashSet , HashMap } ;
@@ -297,7 +298,7 @@ impl ResourceDiscovery for CommandDiscovery {
297
298
self . discover_resources ( "*" ) ?;
298
299
self . discover_adapted_resources ( type_name_filter, adapter_name_filter) ?;
299
300
300
- // add found adapted resources to the lookup_table
301
+ // add/update found adapted resources to the lookup_table
301
302
add_resources_to_lookup_table ( & self . adapted_resources ) ;
302
303
303
304
// note: in next line 'BTreeMap::append' will leave self.adapted_resources empty
@@ -341,7 +342,8 @@ impl ResourceDiscovery for CommandDiscovery {
341
342
debug ! ( "Found {} matching non-adapter-based resources" , found_resources. len( ) ) ;
342
343
343
344
// 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 {
345
347
// TODO: handle version requirements
346
348
let Some ( adapter) = adapters. first ( ) else {
347
349
// skip if no adapters
@@ -360,7 +362,7 @@ impl ResourceDiscovery for CommandDiscovery {
360
362
}
361
363
362
364
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
364
366
add_resources_to_lookup_table ( & self . adapted_resources ) ;
365
367
366
368
// 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> {
506
508
Ok ( resource)
507
509
}
508
510
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
+
509
541
fn add_resources_to_lookup_table ( adapted_resources : & BTreeMap < String , Vec < DscResource > > )
510
542
{
511
543
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>)
522
554
{
523
555
match serde_json:: to_string_pretty ( & lookup_table) {
524
556
Ok ( lookup_table_json) => {
525
-
526
557
let file_path = get_lookup_table_file_path ( ) ;
527
558
debug ! ( "Saving lookup table with {} items to {:?}" , lookup_table. len( ) , file_path) ;
528
-
529
559
fs:: write ( file_path, lookup_table_json) . expect ( "Unable to write lookup_table file" ) ;
530
560
} ,
531
561
Err ( _) => { }
@@ -560,3 +590,15 @@ fn get_lookup_table_file_path() -> String
560
590
561
591
Path :: new ( & local_app_data_path) . join ( "dsc" ) . join ( "AdaptedResourcesLookupTable.json" ) . display ( ) . to_string ( )
562
592
}
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