Skip to content

Commit 14ec858

Browse files
kionzlotem
authored andcommitted
feat(config): references to optional config resources, ending with "?"
1 parent 2736f4b commit 14ec858

File tree

4 files changed

+34
-10
lines changed

4 files changed

+34
-10
lines changed

data/test/config_compiler_test.yaml

+8
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,14 @@ dependency_priorities:
5252
player: bisu
5353
__include: /starcraft/protoss
5454

55+
optional_reference:
56+
__include: nonexistent.yaml:/?
57+
__patch:
58+
- local/nonexistent_patch?
59+
- config_test:/nonexistent_patch?
60+
- nonexistent:/patch?
61+
untouched: true
62+
5563
local:
5664
patch:
5765
battlefields/@next: match point

src/rime/config/config_compiler.cc

+17-9
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ struct PendingChild : Dependency {
4646
};
4747

4848
string Reference::repr() const {
49-
return resource_id + ":" + local_path;
49+
return resource_id + ":" + local_path + (optional ? " <optional>" : "");
5050
}
5151

5252
template <class StreamT>
@@ -131,7 +131,7 @@ bool IncludeReference::Resolve(ConfigCompiler* compiler) {
131131
DLOG(INFO) << "IncludeReference::Resolve(reference = " << reference << ")";
132132
auto item = ResolveReference(compiler, reference);
133133
if (!item) {
134-
return false;
134+
return reference.optional;
135135
}
136136
*target = item;
137137
return true;
@@ -141,7 +141,7 @@ bool PatchReference::Resolve(ConfigCompiler* compiler) {
141141
DLOG(INFO) << "PatchReference::Resolve(reference = " << reference << ")";
142142
auto item = ResolveReference(compiler, reference);
143143
if (!item) {
144-
return false;
144+
return reference.optional;
145145
}
146146
if (!Is<ConfigMap>(item)) {
147147
LOG(ERROR) << "invalid patch at " << reference;
@@ -227,14 +227,18 @@ ConfigCompiler::~ConfigCompiler() {
227227
}
228228

229229
Reference ConfigCompiler::CreateReference(const string& qualified_path) {
230+
auto end = qualified_path.find_last_of("?");
231+
bool optional = end != string::npos;
230232
auto separator = qualified_path.find_first_of(":");
231233
string resource_id = resource_resolver_->ToResourceId(
232234
(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));
234237
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};
238242
}
239243

240244
void ConfigCompiler::AddDependency(an<Dependency> dependency) {
@@ -354,10 +358,14 @@ static an<ConfigItem> ResolveReference(ConfigCompiler* compiler,
354358
const Reference& reference) {
355359
auto resource = compiler->GetCompiledResource(reference.resource_id);
356360
if (!resource) {
357-
LOG(INFO) << "resource not loaded, compiling: " << reference.resource_id;
361+
DLOG(INFO) << "resource not loaded, compiling: " << reference.resource_id;
358362
resource = compiler->Compile(reference.resource_id);
359363
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+
}
361369
return nullptr;
362370
}
363371
}

src/rime/config/config_compiler.h

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ struct ConfigResource : ConfigItemRef {
3030
struct Reference {
3131
string resource_id;
3232
string local_path;
33+
bool optional;
3334

3435
string repr() const;
3536
};

test/config_compiler_test.cc

+8-1
Original file line numberDiff line numberDiff line change
@@ -129,4 +129,11 @@ TEST_F(RimeConfigCompilerTest, DependencyPriorities) {
129129
EXPECT_EQ("bisu", player);
130130
}
131131

132-
// TODO: test failure cases
132+
TEST_F(RimeConfigCompilerTest, OptionalReference) {
133+
const string& prefix = "optional_reference/";
134+
EXPECT_TRUE(config_->IsNull(prefix + "__include"));
135+
EXPECT_TRUE(config_->IsNull(prefix + "__patch"));
136+
bool untouched;
137+
EXPECT_TRUE(config_->GetBool(prefix + "untouched", &untouched));
138+
EXPECT_TRUE(untouched);
139+
}

0 commit comments

Comments
 (0)