From 87dedeb9fa7f52aaa2489de2ede4ae04343fdf06 Mon Sep 17 00:00:00 2001 From: CEL Dev Team Date: Thu, 1 May 2025 14:31:15 -0700 Subject: [PATCH] Function for conversion of string to bool PiperOrigin-RevId: 753731195 --- conformance/BUILD | 6 ----- runtime/standard/type_conversion_functions.cc | 23 +++++++++++++++++-- .../type_conversion_functions_test.cc | 8 ++++--- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/conformance/BUILD b/conformance/BUILD index c1056166e..91562b1e9 100644 --- a/conformance/BUILD +++ b/conformance/BUILD @@ -224,9 +224,6 @@ _TESTS_TO_SKIP_MODERN = [ "string_ext/quote", "string_ext/value_errors", "string_ext/type_errors", - - # TODO(uncreated-issue/77): Add missing conversion function - "conversions/bool", ] _TESTS_TO_SKIP_MODERN_DASHBOARD = [ @@ -286,9 +283,6 @@ _TESTS_TO_SKIP_LEGACY = [ "proto3/set_null/list_value", "proto3/set_null/single_struct", - # TODO(uncreated-issue/77): Add missing conversion function - "conversions/bool", - # cel.@block "block_ext/basic/optional_list", "block_ext/basic/optional_map", diff --git a/runtime/standard/type_conversion_functions.cc b/runtime/standard/type_conversion_functions.cc index 174424a6e..6d47f5ba3 100644 --- a/runtime/standard/type_conversion_functions.cc +++ b/runtime/standard/type_conversion_functions.cc @@ -44,8 +44,27 @@ using ::cel::internal::MinTimestamp; absl::Status RegisterBoolConversionFunctions(FunctionRegistry& registry, const RuntimeOptions&) { // bool -> bool - return UnaryFunctionAdapter::RegisterGlobalOverload( - cel::builtin::kBool, [](bool v) { return v; }, registry); + absl::Status status = + UnaryFunctionAdapter::RegisterGlobalOverload( + cel::builtin::kBool, [](bool v) { return v; }, registry); + CEL_RETURN_IF_ERROR(status); + + // string -> bool + return UnaryFunctionAdapter::RegisterGlobalOverload( + cel::builtin::kBool, + [](const StringValue& v) -> Value { + if ((v == "true") || (v == "True") || (v == "TRUE") || (v == "t") || + (v == "1")) { + return TrueValue(); + } else if ((v == "false") || (v == "FALSE") || (v == "False") || + (v == "f") || (v == "0")) { + return FalseValue(); + } else { + return ErrorValue(absl::InvalidArgumentError( + "Type conversion error from 'string' to 'bool'")); + } + }, + registry); } absl::Status RegisterIntConversionFunctions(FunctionRegistry& registry, diff --git a/runtime/standard/type_conversion_functions_test.cc b/runtime/standard/type_conversion_functions_test.cc index 5c0d08438..1c433c7ab 100644 --- a/runtime/standard/type_conversion_functions_test.cc +++ b/runtime/standard/type_conversion_functions_test.cc @@ -39,9 +39,11 @@ TEST(RegisterTypeConversionFunctions, RegisterBoolConversionFunctions) { ASSERT_OK(RegisterTypeConversionFunctions(registry, options)); - EXPECT_THAT(registry.FindStaticOverloads(builtin::kBool, false, {Kind::kAny}), - UnorderedElementsAre( - MatchesUnaryDescriptor(builtin::kBool, false, Kind::kBool))); + EXPECT_THAT( + registry.FindStaticOverloads(builtin::kBool, false, {Kind::kAny}), + UnorderedElementsAre( + MatchesUnaryDescriptor(builtin::kBool, false, Kind::kBool), + MatchesUnaryDescriptor(builtin::kBool, false, Kind::kString))); } TEST(RegisterTypeConversionFunctions, RegisterIntConversionFunctions) {