diff --git a/eval/public/builtin_func_registrar_test.cc b/eval/public/builtin_func_registrar_test.cc index 751dde19a..a11676a48 100644 --- a/eval/public/builtin_func_registrar_test.cc +++ b/eval/public/builtin_func_registrar_test.cc @@ -264,6 +264,11 @@ INSTANTIATE_TEST_SUITE_P( {}, CelValue::CreateBool(true), OverflowChecksEnabled()}, + {"StringToBool", + "string(true) + string(false)", + {}, + CelValue::CreateStringView("truefalse"), + OverflowChecksEnabled()}, }), [](const testing::TestParamInfo& info) { return info.param.test_name; diff --git a/runtime/standard/type_conversion_functions.cc b/runtime/standard/type_conversion_functions.cc index 6d47f5ba3..871f9892f 100644 --- a/runtime/standard/type_conversion_functions.cc +++ b/runtime/standard/type_conversion_functions.cc @@ -152,6 +152,15 @@ absl::Status RegisterStringConversionFunctions(FunctionRegistry& registry, registry); CEL_RETURN_IF_ERROR(status); + // bool -> string + status = UnaryFunctionAdapter::RegisterGlobalOverload( + cel::builtin::kString, + [](bool value) -> StringValue { + return StringValue(value ? "true" : "false"); + }, + registry); + CEL_RETURN_IF_ERROR(status); + // double -> string status = UnaryFunctionAdapter::RegisterGlobalOverload( cel::builtin::kString, diff --git a/runtime/standard/type_conversion_functions_test.cc b/runtime/standard/type_conversion_functions_test.cc index 1c433c7ab..ece8d454f 100644 --- a/runtime/standard/type_conversion_functions_test.cc +++ b/runtime/standard/type_conversion_functions_test.cc @@ -104,6 +104,7 @@ TEST(RegisterTypeConversionFunctions, RegisterStringConversionFunctions) { EXPECT_THAT( registry.FindStaticOverloads(builtin::kString, false, {Kind::kAny}), UnorderedElementsAre( + MatchesUnaryDescriptor(builtin::kString, false, Kind::kBool), MatchesUnaryDescriptor(builtin::kString, false, Kind::kInt), MatchesUnaryDescriptor(builtin::kString, false, Kind::kDouble), MatchesUnaryDescriptor(builtin::kString, false, Kind::kUint),