| 125 | } |
| 126 | |
| 127 | absl::StatusOr<CelValue> ValueToCelValue(const Value& value, |
| 128 | google::protobuf::Arena* arena) { |
| 129 | switch (value.kind_case()) { |
| 130 | case Value::kBoolValue: |
| 131 | return CelValue::CreateBool(value.bool_value()); |
| 132 | case Value::kBytesValue: |
| 133 | return CelValue::CreateBytes(CelValue::BytesHolder( |
| 134 | arena->Create<std::string>(arena, value.bytes_value()))); |
| 135 | case Value::kDoubleValue: |
| 136 | return CelValue::CreateDouble(value.double_value()); |
| 137 | case Value::kEnumValue: |
| 138 | return CelValue::CreateInt64(value.enum_value().value()); |
| 139 | case Value::kInt64Value: |
| 140 | return CelValue::CreateInt64(value.int64_value()); |
| 141 | case Value::kListValue: { |
| 142 | std::vector<CelValue> list; |
| 143 | for (const auto& subvalue : value.list_value().values()) { |
| 144 | CEL_ASSIGN_OR_RETURN(auto list_value, ValueToCelValue(subvalue, arena)); |
| 145 | list.push_back(list_value); |
| 146 | } |
| 147 | return CelValue::CreateList( |
| 148 | arena->Create<ContainerBackedListImpl>(arena, list)); |
| 149 | } |
| 150 | case Value::kMapValue: { |
| 151 | std::vector<std::pair<CelValue, CelValue>> key_values; |
| 152 | for (const auto& entry : value.map_value().entries()) { |
| 153 | CEL_ASSIGN_OR_RETURN(auto map_key, ValueToCelValue(entry.key(), arena)); |
| 154 | CEL_RETURN_IF_ERROR(CelValue::CheckMapKeyType(map_key)); |
| 155 | CEL_ASSIGN_OR_RETURN(auto map_value, |
| 156 | ValueToCelValue(entry.value(), arena)); |
| 157 | key_values.push_back(std::pair<CelValue, CelValue>(map_key, map_value)); |
| 158 | } |
| 159 | CEL_ASSIGN_OR_RETURN( |
| 160 | auto cel_map, |
| 161 | CreateContainerBackedMap(absl::Span<std::pair<CelValue, CelValue>>( |
| 162 | key_values.data(), key_values.size()))); |
| 163 | auto* cel_map_ptr = cel_map.release(); |
| 164 | arena->Own(cel_map_ptr); |
| 165 | return CelValue::CreateMap(cel_map_ptr); |
| 166 | } |
| 167 | case Value::kNullValue: |
| 168 | return CelValue::CreateNull(); |
| 169 | case Value::kObjectValue: { |
| 170 | auto cel_value = |
| 171 | CelProtoWrapper::CreateMessage(&value.object_value(), arena); |
| 172 | if (cel_value.IsError()) return *cel_value.ErrorOrDie(); |
| 173 | return cel_value; |
| 174 | } |
| 175 | case Value::kStringValue: |
| 176 | return CelValue::CreateString(CelValue::StringHolder( |
| 177 | arena->Create<std::string>(arena, value.string_value()))); |
| 178 | case Value::kTypeValue: |
| 179 | return CelValue::CreateCelType(CelValue::CelTypeHolder( |
| 180 | arena->Create<std::string>(arena, value.type_value()))); |
| 181 | case Value::kUint64Value: |
| 182 | return CelValue::CreateUint64(value.uint64_value()); |
| 183 | case Value::KIND_NOT_SET: |
| 184 | default: |
no test coverage detected