Skip to content

Commit 87dedeb

Browse files
CEL Dev Teamcopybara-github
authored andcommitted
Function for conversion of string to bool
PiperOrigin-RevId: 753731195
1 parent 9662d7f commit 87dedeb

3 files changed

Lines changed: 26 additions & 11 deletions

File tree

conformance/BUILD

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -224,9 +224,6 @@ _TESTS_TO_SKIP_MODERN = [
224224
"string_ext/quote",
225225
"string_ext/value_errors",
226226
"string_ext/type_errors",
227-
228-
# TODO(uncreated-issue/77): Add missing conversion function
229-
"conversions/bool",
230227
]
231228

232229
_TESTS_TO_SKIP_MODERN_DASHBOARD = [
@@ -286,9 +283,6 @@ _TESTS_TO_SKIP_LEGACY = [
286283
"proto3/set_null/list_value",
287284
"proto3/set_null/single_struct",
288285

289-
# TODO(uncreated-issue/77): Add missing conversion function
290-
"conversions/bool",
291-
292286
# cel.@block
293287
"block_ext/basic/optional_list",
294288
"block_ext/basic/optional_map",

runtime/standard/type_conversion_functions.cc

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,27 @@ using ::cel::internal::MinTimestamp;
4444
absl::Status RegisterBoolConversionFunctions(FunctionRegistry& registry,
4545
const RuntimeOptions&) {
4646
// bool -> bool
47-
return UnaryFunctionAdapter<bool, bool>::RegisterGlobalOverload(
48-
cel::builtin::kBool, [](bool v) { return v; }, registry);
47+
absl::Status status =
48+
UnaryFunctionAdapter<bool, bool>::RegisterGlobalOverload(
49+
cel::builtin::kBool, [](bool v) { return v; }, registry);
50+
CEL_RETURN_IF_ERROR(status);
51+
52+
// string -> bool
53+
return UnaryFunctionAdapter<Value, StringValue>::RegisterGlobalOverload(
54+
cel::builtin::kBool,
55+
[](const StringValue& v) -> Value {
56+
if ((v == "true") || (v == "True") || (v == "TRUE") || (v == "t") ||
57+
(v == "1")) {
58+
return TrueValue();
59+
} else if ((v == "false") || (v == "FALSE") || (v == "False") ||
60+
(v == "f") || (v == "0")) {
61+
return FalseValue();
62+
} else {
63+
return ErrorValue(absl::InvalidArgumentError(
64+
"Type conversion error from 'string' to 'bool'"));
65+
}
66+
},
67+
registry);
4968
}
5069

5170
absl::Status RegisterIntConversionFunctions(FunctionRegistry& registry,

runtime/standard/type_conversion_functions_test.cc

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,11 @@ TEST(RegisterTypeConversionFunctions, RegisterBoolConversionFunctions) {
3939

4040
ASSERT_OK(RegisterTypeConversionFunctions(registry, options));
4141

42-
EXPECT_THAT(registry.FindStaticOverloads(builtin::kBool, false, {Kind::kAny}),
43-
UnorderedElementsAre(
44-
MatchesUnaryDescriptor(builtin::kBool, false, Kind::kBool)));
42+
EXPECT_THAT(
43+
registry.FindStaticOverloads(builtin::kBool, false, {Kind::kAny}),
44+
UnorderedElementsAre(
45+
MatchesUnaryDescriptor(builtin::kBool, false, Kind::kBool),
46+
MatchesUnaryDescriptor(builtin::kBool, false, Kind::kString)));
4547
}
4648

4749
TEST(RegisterTypeConversionFunctions, RegisterIntConversionFunctions) {

0 commit comments

Comments
 (0)