@@ -46,7 +46,7 @@ struct PendingChild : Dependency {
46
46
};
47
47
48
48
string Reference::repr () const {
49
- return resource_id + " :" + local_path;
49
+ return resource_id + " :" + local_path + (optional ? " <optional> " : " " ) ;
50
50
}
51
51
52
52
template <class StreamT >
@@ -131,7 +131,7 @@ bool IncludeReference::Resolve(ConfigCompiler* compiler) {
131
131
DLOG (INFO) << " IncludeReference::Resolve(reference = " << reference << " )" ;
132
132
auto item = ResolveReference (compiler, reference);
133
133
if (!item) {
134
- return false ;
134
+ return reference. optional ;
135
135
}
136
136
*target = item;
137
137
return true ;
@@ -141,7 +141,7 @@ bool PatchReference::Resolve(ConfigCompiler* compiler) {
141
141
DLOG (INFO) << " PatchReference::Resolve(reference = " << reference << " )" ;
142
142
auto item = ResolveReference (compiler, reference);
143
143
if (!item) {
144
- return false ;
144
+ return reference. optional ;
145
145
}
146
146
if (!Is<ConfigMap>(item)) {
147
147
LOG (ERROR) << " invalid patch at " << reference;
@@ -227,14 +227,18 @@ ConfigCompiler::~ConfigCompiler() {
227
227
}
228
228
229
229
Reference ConfigCompiler::CreateReference (const string& qualified_path) {
230
+ auto end = qualified_path.find_last_of (" ?" );
231
+ bool optional = end != string::npos;
230
232
auto separator = qualified_path.find_first_of (" :" );
231
233
string resource_id = resource_resolver_->ToResourceId (
232
234
(separator == string::npos || separator == 0 ) ?
233
- graph_->current_resource_id () : qualified_path.substr (0 , separator));
235
+ graph_->current_resource_id () :
236
+ qualified_path.substr (0 , separator));
234
237
string local_path = (separator == string::npos) ?
235
- qualified_path :
236
- qualified_path.substr (separator + 1 );
237
- return Reference{resource_id, local_path};
238
+ qualified_path.substr (0 , end) :
239
+ qualified_path.substr (separator + 1 ,
240
+ optional ? end - separator - 1 : end);
241
+ return Reference{resource_id, local_path, optional};
238
242
}
239
243
240
244
void ConfigCompiler::AddDependency (an<Dependency> dependency) {
@@ -354,10 +358,14 @@ static an<ConfigItem> ResolveReference(ConfigCompiler* compiler,
354
358
const Reference& reference) {
355
359
auto resource = compiler->GetCompiledResource (reference.resource_id );
356
360
if (!resource) {
357
- LOG (INFO) << " resource not loaded, compiling: " << reference.resource_id ;
361
+ DLOG (INFO) << " resource not loaded, compiling: " << reference.resource_id ;
358
362
resource = compiler->Compile (reference.resource_id );
359
363
if (!resource->loaded ) {
360
- LOG (ERROR) << " resource could not be loaded: " << reference.resource_id ;
364
+ if (reference.optional ) {
365
+ LOG (INFO) << " optional resource not loaded: " << reference.resource_id ;
366
+ } else {
367
+ LOG (ERROR) << " resource could not be loaded: " << reference.resource_id ;
368
+ }
361
369
return nullptr ;
362
370
}
363
371
}
0 commit comments