66 // clippy::integer_arithmetic
77) ) ]
88
9- use core:: marker:: PhantomData ;
10- use std:: collections:: { HashMap , HashSet } ;
11-
129use bitvec:: prelude as bv;
10+ use core:: marker:: PhantomData ;
1311use fastmurmur3:: murmur3_x64_128;
12+ use std:: collections:: { HashMap , HashSet } ;
13+ use std:: fmt:: format;
1414
1515use bytes:: Bytes ;
1616
@@ -227,6 +227,10 @@ pub trait Host {
227227 Alphanumeric . sample_string ( & mut rand:: rng ( ) , len)
228228 }
229229
230+ fn log ( _: & str ) {
231+ // noop
232+ }
233+
230234 #[ cfg( not( feature = "std" ) ) ]
231235 fn current_time ( ) -> Timestamp ;
232236 #[ cfg( feature = "std" ) ]
@@ -512,7 +516,9 @@ impl<'a, H: Host> AccountResolver<'a, H> {
512516
513517 let mut resolve_results = Vec :: with_capacity ( flags_to_resolve. len ( ) ) ;
514518
515- for flag in flags_to_resolve {
519+ let mut has_missing_materializations = false ;
520+
521+ for flag in flags_to_resolve. clone ( ) {
516522 let resolve_result = self . resolve_flag ( flag, request. materialization_context . clone ( ) ) ;
517523 match resolve_result {
518524 Ok ( resolve_result) => resolve_results. push ( resolve_result) ,
@@ -526,22 +532,26 @@ impl<'a, H: Host> AccountResolver<'a, H> {
526532 vec ! [ ] ,
527533 ) )
528534 } else {
529- let deps = self . collect_missing_materializations ( & flag) ;
530- match deps {
531- Ok ( deps) => Ok (
532- ResolveWithStickyResponse :: with_missing_materializations (
533- deps,
534- ) ,
535- ) ,
536- Err ( err) => Err ( err) ,
537- }
535+ has_missing_materializations = true ;
536+ break ;
538537 }
539538 }
540539 } ;
541540 }
542541 }
543542 }
544543
544+ if has_missing_materializations {
545+ let result = self . collect_missing_materializations ( flags_to_resolve) ;
546+ if let Ok ( missing) = result {
547+ return Ok ( ResolveWithStickyResponse :: with_missing_materializations (
548+ missing,
549+ ) ) ;
550+ } else {
551+ return Err ( "Could not collect missing materializations" . to_string ( ) ) ;
552+ }
553+ }
554+
545555 let resolved_values: Vec < ResolvedValue > = resolve_results
546556 . iter ( )
547557 . map ( |r| r. resolved_value . clone ( ) )
@@ -726,6 +736,27 @@ impl<'a, H: Host> AccountResolver<'a, H> {
726736 }
727737
728738 pub fn collect_missing_materializations (
739+ & ' a self ,
740+ flags : Vec < & ' a Flag > ,
741+ ) -> Result < Vec < resolve_with_sticky_response:: MissingMaterializationItem > , String > {
742+ let mut missing_materializations: Vec <
743+ resolve_with_sticky_response:: MissingMaterializationItem ,
744+ > = Vec :: new ( ) ;
745+ for flag in flags {
746+ let result = self . collect_missing_materializations_for_flag ( flag) ;
747+ if let Ok ( items) = result {
748+ missing_materializations. extend ( items) ;
749+ } else {
750+ return Err ( format ! (
751+ "Could not collect missing materializations for flag {}" ,
752+ flag. name
753+ ) ) ;
754+ }
755+ }
756+ Ok ( missing_materializations)
757+ }
758+
759+ fn collect_missing_materializations_for_flag (
729760 & ' a self ,
730761 flag : & ' a Flag ,
731762 ) -> Result < Vec < resolve_with_sticky_response:: MissingMaterializationItem > , String > {
@@ -767,7 +798,6 @@ impl<'a, H: Host> AccountResolver<'a, H> {
767798 }
768799 }
769800 }
770-
771801 Ok ( missing_materializations)
772802 }
773803
0 commit comments