| 215 | namespace common_internal { |
| 216 | |
| 217 | absl::Status StructValueEqual( |
| 218 | const StructValue& lhs, const StructValue& rhs, |
| 219 | const google::protobuf::DescriptorPool* absl_nonnull descriptor_pool, |
| 220 | google::protobuf::MessageFactory* absl_nonnull message_factory, |
| 221 | google::protobuf::Arena* absl_nonnull arena, Value* absl_nonnull result) { |
| 222 | ABSL_DCHECK(descriptor_pool != nullptr); |
| 223 | ABSL_DCHECK(message_factory != nullptr); |
| 224 | ABSL_DCHECK(arena != nullptr); |
| 225 | ABSL_DCHECK(result != nullptr); |
| 226 | |
| 227 | if (lhs.GetTypeName() != rhs.GetTypeName()) { |
| 228 | *result = FalseValue(); |
| 229 | return absl::OkStatus(); |
| 230 | } |
| 231 | absl::flat_hash_map<std::string, Value> lhs_fields; |
| 232 | CEL_RETURN_IF_ERROR(lhs.ForEachField( |
| 233 | [&lhs_fields](absl::string_view name, |
| 234 | const Value& lhs_value) -> absl::StatusOr<bool> { |
| 235 | lhs_fields.insert_or_assign(std::string(name), Value(lhs_value)); |
| 236 | return true; |
| 237 | }, |
| 238 | descriptor_pool, message_factory, arena)); |
| 239 | bool equal = true; |
| 240 | size_t rhs_fields_count = 0; |
| 241 | CEL_RETURN_IF_ERROR(rhs.ForEachField( |
| 242 | [&](absl::string_view name, |
| 243 | const Value& rhs_value) -> absl::StatusOr<bool> { |
| 244 | auto lhs_field = lhs_fields.find(name); |
| 245 | if (lhs_field == lhs_fields.end()) { |
| 246 | equal = false; |
| 247 | return false; |
| 248 | } |
| 249 | CEL_RETURN_IF_ERROR(lhs_field->second.Equal( |
| 250 | rhs_value, descriptor_pool, message_factory, arena, result)); |
| 251 | if (result->IsFalse()) { |
| 252 | equal = false; |
| 253 | return false; |
| 254 | } |
| 255 | ++rhs_fields_count; |
| 256 | return true; |
| 257 | }, |
| 258 | descriptor_pool, message_factory, arena)); |
| 259 | if (!equal || rhs_fields_count != lhs_fields.size()) { |
| 260 | *result = FalseValue(); |
| 261 | return absl::OkStatus(); |
| 262 | } |
| 263 | *result = TrueValue(); |
| 264 | return absl::OkStatus(); |
| 265 | } |
| 266 | |
| 267 | absl::Status StructValueEqual( |
| 268 | const CustomStructValueInterface& lhs, const StructValue& rhs, |
no test coverage detected