77 *
88 * http://www.apache.org/licenses/LICENSE-2.0
99 *
10- * Unless Requiredd by applicable law or agreed to in writing, software
10+ * Unless required by applicable law or agreed to in writing, software
1111 * distributed under the License is distributed on an "AS IS" BASIS,
1212 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1313 * See the License for the specific language governing permissions and
@@ -393,6 +393,16 @@ const nlohmann::json& JsonReader::RequiredObject(const char* child_name,
393393 return json_object.at (child_name);
394394}
395395
396+ const nlohmann::json& JsonReader::OptionalObject (
397+ const char * child_name,
398+ const json& json_object,
399+ const nlohmann::json& default_value) {
400+ if (json_object.contains (child_name)) {
401+ return json_object.at (child_name);
402+ }
403+ return default_value;
404+ }
405+
396406double JsonReader::RequiredDouble (const char * name, const json& json_object) {
397407 if (json_object.contains (name)) {
398408 double result = DecodeDouble (json_object.at (name));
@@ -614,11 +624,22 @@ FilterList BundleSerializer::DecodeCompositeFilter(JsonReader& reader,
614624 return {};
615625 }
616626
617- auto filters = reader.RequiredArray (" filters" , filter);
627+ const std::vector<json> default_filters;
628+ const auto & filters =
629+ reader.OptionalArray (" filters" , filter, default_filters);
630+
631+ const json default_objects;
618632 FilterList result;
619633 for (const auto & f : filters) {
620- result = result.push_back (
621- DecodeFieldFilter (reader, reader.RequiredObject (" fieldFilter" , f)));
634+ const json& field_filter =
635+ reader.OptionalObject (" fieldFilter" , f, default_objects);
636+ if (!field_filter.empty ()) {
637+ result = result.push_back (DecodeFieldFilter (reader, field_filter));
638+ } else {
639+ result = result.push_back (DecodeUnaryFilter (
640+ reader, reader.OptionalObject (" unaryFilter" , f, default_objects)));
641+ }
642+
622643 if (!reader.ok ()) {
623644 return {};
624645 }
@@ -636,8 +657,10 @@ Bound BundleSerializer::DecodeBound(JsonReader& reader,
636657 return default_bound;
637658 }
638659
660+ std::vector<json> default_values;
639661 const json& bound_json = reader.RequiredObject (bound_name, query);
640- std::vector<json> values = reader.RequiredArray (" values" , bound_json);
662+ std::vector<json> values =
663+ reader.OptionalArray (" values" , bound_json, default_values);
641664 bool before = reader.OptionalBool (" before" , bound_json);
642665
643666 auto positions = MakeSharedMessage<google_firestore_v1_ArrayValue>({});
@@ -737,7 +760,9 @@ Message<google_firestore_v1_MapValue> BundleSerializer::DecodeMapValue(
737760
738761Message<google_firestore_v1_ArrayValue> BundleSerializer::DecodeArrayValue (
739762 JsonReader& reader, const json& array_json) const {
740- const auto & values = reader.RequiredArray (" values" , array_json);
763+ std::vector<json> default_values;
764+ const auto & values =
765+ reader.OptionalArray (" values" , array_json, default_values);
741766
742767 Message<google_firestore_v1_ArrayValue> array_value;
743768 SetRepeatedField (
0 commit comments