@@ -11,6 +11,8 @@ pub use provider::Provider;
1111use template:: Part ;
1212pub use template:: Template ;
1313
14+ use crate :: provider:: ProviderVariableKind ;
15+
1416/// A [`ProviderResolver`] that can be shared.
1517pub type SharedPreparedResolver =
1618 std:: sync:: Arc < std:: sync:: OnceLock < std:: sync:: Arc < PreparedResolver > > > ;
@@ -90,6 +92,30 @@ impl ProviderResolver {
9092 Ok ( PreparedResolver { variables } )
9193 }
9294
95+ /// Prepares the resolver by attempting to resolve all variables, printing warnings for any
96+ /// that cannot be resolved.
97+ pub async fn pre_runtime_prepare ( & self ) -> Result < ( ) > {
98+ for name in self . internal . variables . keys ( ) {
99+ self . check_variable_existence ( name) . await ?;
100+ }
101+ Ok ( ( ) )
102+ }
103+
104+ async fn check_variable_existence ( & self , key : & str ) -> Result < ( ) > {
105+ for provider in & self . providers {
106+ if provider. kind ( ) == & ProviderVariableKind :: Dynamic {
107+ continue ;
108+ }
109+
110+ match provider. get ( & Key ( key) ) . await {
111+ Ok ( Some ( _) ) => return Ok ( ( ) ) ,
112+ Err ( _) | Ok ( None ) => return self . internal . resolve_variable ( key) . map ( |_| ( ) ) ,
113+ }
114+ }
115+
116+ Ok ( ( ) )
117+ }
118+
93119 async fn resolve_variable ( & self , key : & str ) -> Result < String > {
94120 for provider in & self . providers {
95121 if let Some ( value) = provider. get ( & Key ( key) ) . await . map_err ( Error :: Provider ) ? {
@@ -310,6 +336,7 @@ mod tests {
310336 use async_trait:: async_trait;
311337
312338 use super :: * ;
339+ use crate :: provider:: ProviderVariableKind ;
313340
314341 #[ derive( Debug ) ]
315342 struct TestProvider ;
@@ -323,6 +350,10 @@ mod tests {
323350 _ => Ok ( None ) ,
324351 }
325352 }
353+
354+ fn kind ( & self ) -> & ProviderVariableKind {
355+ & ProviderVariableKind :: Static
356+ }
326357 }
327358
328359 async fn test_resolve ( template : & str ) -> Result < String > {
0 commit comments