@@ -1013,6 +1013,30 @@ absl::Status RegisterTimestampFunctions(CelFunctionRegistry* registry,
10131013 return absl::OkStatus ();
10141014}
10151015
1016+ absl::Status RegisterBytesConversionFunctions (CelFunctionRegistry* registry,
1017+ const InterpreterOptions&) {
1018+ // bytes -> bytes
1019+ auto status = FunctionAdapter<CelValue::BytesHolder, CelValue::BytesHolder>::
1020+ CreateAndRegister (
1021+ builtin::kBytes , false ,
1022+ [](Arena*, CelValue::BytesHolder value) -> CelValue::BytesHolder {
1023+ return value;
1024+ },
1025+ registry);
1026+ if (!status.ok ()) return status;
1027+
1028+ // string -> bytes
1029+ status = FunctionAdapter<CelValue, CelValue::StringHolder>::CreateAndRegister (
1030+ builtin::kBytes , false ,
1031+ [](Arena* arena, CelValue::StringHolder value) -> CelValue {
1032+ return CelValue::CreateBytesView (value.value ());
1033+ },
1034+ registry);
1035+ if (!status.ok ()) return status;
1036+
1037+ return absl::OkStatus ();
1038+ }
1039+
10161040absl::Status RegisterDoubleConversionFunctions (CelFunctionRegistry* registry,
10171041 const InterpreterOptions&) {
10181042 // double -> double
@@ -1121,6 +1145,8 @@ absl::Status RegisterStringConversionFunctions(
11211145 return absl::OkStatus ();
11221146 }
11231147
1148+ // TODO(issues/82): ensure the bytes conversion to string handles UTF-8
1149+ // properly, and avoids unncessary allocations.
11241150 // bytes -> string
11251151 auto status = FunctionAdapter<CelValue::StringHolder, CelValue::BytesHolder>::
11261152 CreateAndRegister (
@@ -1229,7 +1255,10 @@ absl::Status RegisterUintConversionFunctions(CelFunctionRegistry* registry,
12291255
12301256absl::Status RegisterConversionFunctions (CelFunctionRegistry* registry,
12311257 const InterpreterOptions& options) {
1232- auto status = RegisterDoubleConversionFunctions (registry, options);
1258+ auto status = RegisterBytesConversionFunctions (registry, options);
1259+ if (!status.ok ()) return status;
1260+
1261+ status = RegisterDoubleConversionFunctions (registry, options);
12331262 if (!status.ok ()) return status;
12341263
12351264 // duration() conversion from string.
0 commit comments