Skip to content

Commit 0bd4d58

Browse files
jnthntatumcopybara-github
authored andcommitted
Add support for context types env.yaml
Add support for declaring a protobuf context message whose top level fields are declared as variables in the CEL environment. PiperOrigin-RevId: 930613750
1 parent d2a8a78 commit 0bd4d58

5 files changed

Lines changed: 60 additions & 0 deletions

File tree

env/config.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ class Config {
3232
void SetName(std::string name) { name_ = std::move(name); }
3333
std::string GetName() const { return name_; }
3434

35+
void SetContextType(std::string context_type) {
36+
context_type_ = std::move(context_type);
37+
}
38+
std::string GetContextType() const { return context_type_; }
39+
3540
struct ContainerConfig {
3641
std::string name;
3742
std::vector<std::string> abbreviations;
@@ -150,6 +155,7 @@ class Config {
150155

151156
private:
152157
std::string name_;
158+
std::string context_type_;
153159
ContainerConfig container_config_;
154160
std::vector<ExtensionConfig> extension_configs_;
155161
StandardLibraryConfig standard_library_config_;

env/env.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,11 @@ absl::StatusOr<std::unique_ptr<CompilerBuilder>> Env::NewCompilerBuilder() {
138138
for (const auto& abbr : config_.GetContainerConfig().abbreviations) {
139139
CEL_RETURN_IF_ERROR(container.AddAbbreviation(abbr));
140140
}
141+
142+
if (!config_.GetContextType().empty()) {
143+
CEL_RETURN_IF_ERROR(
144+
checker_builder.AddContextDeclaration(config_.GetContextType()));
145+
}
141146
for (const auto& alias : config_.GetContainerConfig().aliases) {
142147
CEL_RETURN_IF_ERROR(container.AddAlias(alias.alias, alias.qualified_name));
143148
}

env/env_test.cc

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,25 @@ TEST(ContainerConfigTest, ContainerConfigWithAliases) {
344344
EXPECT_THAT(result.GetIssues(), IsEmpty()) << result.FormatError();
345345
}
346346

347+
TEST(ContextVariableConfigTest, Basic) {
348+
Env env;
349+
env.SetDescriptorPool(internal::GetSharedTestingDescriptorPool());
350+
Config config;
351+
config.SetContextType("cel.expr.conformance.proto3.TestAllTypes");
352+
env.SetConfig(config);
353+
354+
ASSERT_OK_AND_ASSIGN(std::unique_ptr<Compiler> compiler, env.NewCompiler());
355+
356+
// Top-level fields of TestAllTypes like "single_int32" should resolve
357+
// successfully.
358+
ASSERT_OK_AND_ASSIGN(auto result, compiler->Compile("single_int32 > 10"));
359+
EXPECT_THAT(result.GetIssues(), IsEmpty());
360+
361+
ASSERT_OK_AND_ASSIGN(auto result_invalid,
362+
compiler->Compile("non_existent_field > 10"));
363+
EXPECT_THAT(result_invalid.GetIssues(), Not(IsEmpty()));
364+
}
365+
347366
struct VariableConfigWithValueTestCase {
348367
Config::VariableConfig variable_config;
349368
std::string validate_type_expr;

env/env_yaml.cc

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1245,6 +1245,25 @@ void EmitFunctionConfigs(const Config& env_config, YAML::Emitter& out,
12451245
}
12461246
out << YAML::EndSeq;
12471247
}
1248+
1249+
absl::Status ParseContextVariableConfig(Config& config, absl::string_view yaml,
1250+
const YAML::Node& root) {
1251+
const YAML::Node context_variable = root["context_variable"];
1252+
if (!context_variable.IsDefined()) {
1253+
return absl::OkStatus();
1254+
}
1255+
if (!context_variable.IsMap()) {
1256+
return YamlError(yaml, context_variable,
1257+
"Node 'context_variable' is not a map");
1258+
}
1259+
const YAML::Node type_name = context_variable["type_name"];
1260+
if (!type_name || !type_name.IsScalar()) {
1261+
return YamlError(yaml, type_name, "Node 'type_name' is not a string");
1262+
}
1263+
config.SetContextType(GetString(yaml, type_name));
1264+
return absl::OkStatus();
1265+
}
1266+
12481267
} // namespace
12491268

12501269
absl::StatusOr<Config> EnvConfigFromYaml(const std::string& yaml) {
@@ -1263,6 +1282,7 @@ absl::StatusOr<Config> EnvConfigFromYaml(const std::string& yaml) {
12631282
CEL_RETURN_IF_ERROR(ParseContainerConfig(config, yaml, root));
12641283
CEL_RETURN_IF_ERROR(ParseExtensionConfigs(config, yaml, root));
12651284
CEL_RETURN_IF_ERROR(ParseStandardLibraryConfig(config, yaml, root));
1285+
CEL_RETURN_IF_ERROR(ParseContextVariableConfig(config, yaml, root));
12661286
CEL_RETURN_IF_ERROR(ParseVariableConfigs(config, yaml, root));
12671287
CEL_RETURN_IF_ERROR(ParseFunctionConfigs(config, yaml, root));
12681288
return config;

env/env_yaml_test.cc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,16 @@ TEST(EnvYamlTest, ParseVariableConfigWithTypeParams) {
216216
EXPECT_THAT(type_info.params[1].params, IsEmpty());
217217
}
218218

219+
TEST(EnvYamlTest, ParseContextVariableConfig) {
220+
ASSERT_OK_AND_ASSIGN(Config config, EnvConfigFromYaml(R"yaml(
221+
context_variable:
222+
type_name: "cel.expr.conformance.proto3.TestAllTypes"
223+
)yaml"));
224+
225+
EXPECT_EQ(config.GetContextType(),
226+
"cel.expr.conformance.proto3.TestAllTypes");
227+
}
228+
219229
TEST(EnvYamlTest, ParseVariableConfigWithTypeParamsLegacySyntax) {
220230
ASSERT_OK_AND_ASSIGN(Config config, EnvConfigFromYaml(R"yaml(
221231
variables:

0 commit comments

Comments
 (0)