From 2b0ed605b6089978aee76394d57aafc0f630674e Mon Sep 17 00:00:00 2001 From: Tristan Swadell Date: Thu, 9 Oct 2025 16:29:33 -0700 Subject: [PATCH] Introduce `string(bool)` support at runtime PiperOrigin-RevId: 817382186 --- eval/public/builtin_func_registrar_test.cc | 5 +++++ runtime/standard/type_conversion_functions.cc | 9 +++++++++ runtime/standard/type_conversion_functions_test.cc | 1 + 3 files changed, 15 insertions(+) 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),