@@ -11,8 +11,6 @@ pub use provider::Provider;
1111use template:: Part ;
1212pub use template:: Template ;
1313
14- use crate :: provider:: ProviderVariableKind ;
15-
1614/// A [`ProviderResolver`] that can be shared.
1715pub type SharedPreparedResolver =
1816 std:: sync:: Arc < std:: sync:: OnceLock < std:: sync:: Arc < PreparedResolver > > > ;
@@ -92,50 +90,25 @@ impl ProviderResolver {
9290 Ok ( PreparedResolver { variables } )
9391 }
9492
95- /// Ensures that all required variables are resolvable at startup
93+ /// Ensures that all required variables are not unresolvable
9694 pub async fn ensure_required_variables_resolvable ( & self ) -> Result < ( ) > {
97- // If a dynamic provider is available, skip validation.
98- if self
99- . providers
100- . iter ( )
101- . any ( |p| p. kind ( ) == ProviderVariableKind :: Dynamic )
102- {
103- return Ok ( ( ) ) ;
104- }
105-
106- let mut unvalidated_keys = vec ! [ ] ;
107- for key in self . internal . variables . keys ( ) {
108- // If default value is provided, skip validation.
109- if let Some ( value) = self . internal . variables . get ( key) {
110- if value. default . is_some ( ) {
111- continue ;
112- }
113- }
114-
115- let mut resolved = false ;
116-
117- for provider in & self . providers {
118- if provider
119- . get ( & Key ( key) )
120- . await
121- . map_err ( Error :: Provider ) ?
122- . is_some ( )
123- {
124- resolved = true ;
125- break ;
126- }
127- }
128-
129- if !resolved {
130- unvalidated_keys. push ( key) ;
95+ let mut unresolvable_keys = vec ! [ ] ;
96+ for key in self . internal . required_variables ( ) {
97+ let key = Key :: new ( key) ?;
98+ let resolvable = self
99+ . providers
100+ . iter ( )
101+ . any ( |provider| provider. may_resolve ( & key) ) ;
102+ if !resolvable {
103+ unresolvable_keys. push ( key) ;
131104 }
132105 }
133106
134- if unvalidated_keys . is_empty ( ) {
107+ if unresolvable_keys . is_empty ( ) {
135108 Ok ( ( ) )
136109 } else {
137110 Err ( Error :: Provider ( anyhow:: anyhow!(
138- "no provider resolved required variable(s): {unvalidated_keys :?}" ,
111+ "no provider resolved required variable(s): {unresolvable_keys :?}" ,
139112 ) ) )
140113 }
141114 }
@@ -248,6 +221,12 @@ impl Resolver {
248221 } ) ?;
249222 Ok ( template)
250223 }
224+
225+ fn required_variables ( & self ) -> impl Iterator < Item = & str > {
226+ self . variables
227+ . iter ( )
228+ . filter_map ( |( name, variable) | variable. default . is_none ( ) . then_some ( name. as_str ( ) ) )
229+ }
251230}
252231
253232/// A resolver who has resolved all variables.
@@ -360,7 +339,6 @@ mod tests {
360339 use async_trait:: async_trait;
361340
362341 use super :: * ;
363- use crate :: provider:: ProviderVariableKind ;
364342
365343 #[ derive( Debug ) ]
366344 struct TestProvider ;
@@ -375,8 +353,8 @@ mod tests {
375353 }
376354 }
377355
378- fn kind ( & self ) -> ProviderVariableKind {
379- ProviderVariableKind :: Static
356+ fn may_resolve ( & self , key : & Key ) -> bool {
357+ key . as_ref ( ) == "required"
380358 }
381359 }
382360
0 commit comments