| 1774 | namespace { |
| 1775 | |
| 1776 | class JsonEqualsState final { |
| 1777 | public: |
| 1778 | explicit JsonEqualsState(const JsonAccessor* absl_nonnull lhs_accessor, |
| 1779 | const JsonAccessor* absl_nonnull rhs_accessor) |
| 1780 | : lhs_accessor_(lhs_accessor), rhs_accessor_(rhs_accessor) {} |
| 1781 | |
| 1782 | bool ValueEqual(const google::protobuf::MessageLite& lhs, |
| 1783 | const google::protobuf::MessageLite& rhs) { |
| 1784 | auto lhs_kind_case = lhs_accessor_->GetKindCase(lhs); |
| 1785 | if (lhs_kind_case == google::protobuf::Value::KIND_NOT_SET) { |
| 1786 | lhs_kind_case = google::protobuf::Value::kNullValue; |
| 1787 | } |
| 1788 | auto rhs_kind_case = rhs_accessor_->GetKindCase(rhs); |
| 1789 | if (rhs_kind_case == google::protobuf::Value::KIND_NOT_SET) { |
| 1790 | rhs_kind_case = google::protobuf::Value::kNullValue; |
| 1791 | } |
| 1792 | if (lhs_kind_case != rhs_kind_case) { |
| 1793 | return false; |
| 1794 | } |
| 1795 | switch (lhs_kind_case) { |
| 1796 | case google::protobuf::Value::KIND_NOT_SET: |
| 1797 | ABSL_UNREACHABLE(); |
| 1798 | case google::protobuf::Value::kNullValue: |
| 1799 | return true; |
| 1800 | case google::protobuf::Value::kBoolValue: |
| 1801 | return lhs_accessor_->GetBoolValue(lhs) == |
| 1802 | rhs_accessor_->GetBoolValue(rhs); |
| 1803 | case google::protobuf::Value::kNumberValue: |
| 1804 | return lhs_accessor_->GetNumberValue(lhs) == |
| 1805 | rhs_accessor_->GetNumberValue(rhs); |
| 1806 | case google::protobuf::Value::kStringValue: |
| 1807 | return lhs_accessor_->GetStringValue(lhs, lhs_scratch_) == |
| 1808 | rhs_accessor_->GetStringValue(rhs, rhs_scratch_); |
| 1809 | case google::protobuf::Value::kListValue: |
| 1810 | return ListValueEqual(lhs_accessor_->GetListValue(lhs), |
| 1811 | rhs_accessor_->GetListValue(rhs)); |
| 1812 | case google::protobuf::Value::kStructValue: |
| 1813 | return StructEqual(lhs_accessor_->GetStructValue(lhs), |
| 1814 | rhs_accessor_->GetStructValue(rhs)); |
| 1815 | default: |
| 1816 | // Should not get here, but if for some terrible reason |
| 1817 | // `google.protobuf.Value` is expanded, default to false. |
| 1818 | return false; |
| 1819 | } |
| 1820 | } |
| 1821 | |
| 1822 | bool ListValueEqual(const google::protobuf::MessageLite& lhs, |
| 1823 | const google::protobuf::MessageLite& rhs) { |
| 1824 | const int lhs_size = lhs_accessor_->ValuesSize(lhs); |
| 1825 | const int rhs_size = rhs_accessor_->ValuesSize(rhs); |
| 1826 | if (lhs_size != rhs_size) { |
| 1827 | return false; |
| 1828 | } |
| 1829 | for (int i = 0; i < lhs_size; ++i) { |
| 1830 | if (!ValueEqual(lhs_accessor_->Values(lhs, i), |
| 1831 | rhs_accessor_->Values(rhs, i))) { |
| 1832 | return false; |
| 1833 | } |
no outgoing calls
no test coverage detected