@@ -47,24 +47,23 @@ using nanopb::Writer;
47
47
using util::Status;
48
48
using util::StringFormat;
49
49
50
- void LocalSerializer::EncodeMaybeDocument (
51
- Writer* writer, const MaybeDocument& maybe_doc) const {
50
+ firestore_client_MaybeDocument LocalSerializer::EncodeMaybeDocument (
51
+ const MaybeDocument& maybe_doc) const {
52
+ firestore_client_MaybeDocument result =
53
+ firestore_client_MaybeDocument_init_zero;
54
+
52
55
switch (maybe_doc.type ()) {
53
56
case MaybeDocument::Type::Document:
54
- writer->WriteTag (
55
- {PB_WT_STRING, firestore_client_MaybeDocument_document_tag});
56
- writer->WriteNestedMessage ([&](Writer* writer) {
57
- EncodeDocument (writer, static_cast <const Document&>(maybe_doc));
58
- });
59
- return ;
57
+ result.which_document_type = firestore_client_MaybeDocument_document_tag;
58
+ result.document = EncodeDocument (static_cast <const Document&>(maybe_doc));
59
+ return result;
60
60
61
61
case MaybeDocument::Type::NoDocument:
62
- writer->WriteTag (
63
- {PB_WT_STRING, firestore_client_MaybeDocument_no_document_tag});
64
- writer->WriteNestedMessage ([&](Writer* writer) {
65
- EncodeNoDocument (writer, static_cast <const NoDocument&>(maybe_doc));
66
- });
67
- return ;
62
+ result.which_document_type =
63
+ firestore_client_MaybeDocument_no_document_tag;
64
+ result.no_document =
65
+ EncodeNoDocument (static_cast <const NoDocument&>(maybe_doc));
66
+ return result;
68
67
69
68
case MaybeDocument::Type::Unknown:
70
69
// TODO(rsgowman)
@@ -95,43 +94,49 @@ std::unique_ptr<MaybeDocument> LocalSerializer::DecodeMaybeDocument(
95
94
UNREACHABLE ();
96
95
}
97
96
98
- void LocalSerializer::EncodeDocument (Writer* writer,
99
- const Document& doc) const {
97
+ google_firestore_v1beta1_Document LocalSerializer::EncodeDocument (
98
+ const Document& doc) const {
99
+ google_firestore_v1beta1_Document result =
100
+ google_firestore_v1beta1_Document_init_zero;
101
+
100
102
// Encode Document.name
101
- writer-> WriteTag ({PB_WT_STRING, google_firestore_v1beta1_Document_name_tag});
102
- writer-> WriteString (rpc_serializer_.EncodeKey (doc.key ()));
103
+ result. name =
104
+ rpc_serializer_. EncodeString (rpc_serializer_.EncodeKey (doc.key ()));
103
105
104
106
// Encode Document.fields (unless it's empty)
105
- const ObjectValue& object_value = doc.data ().object_value ();
106
- if (!object_value.internal_value .empty ()) {
107
- rpc_serializer_.EncodeObjectMap (
108
- writer, object_value.internal_value ,
109
- google_firestore_v1beta1_Document_fields_tag,
110
- google_firestore_v1beta1_Document_FieldsEntry_key_tag,
111
- google_firestore_v1beta1_Document_FieldsEntry_value_tag);
107
+ size_t count = doc.data ().object_value ().internal_value .size ();
108
+ result.fields_count = count;
109
+ result.fields =
110
+ reinterpret_cast <google_firestore_v1beta1_Document_FieldsEntry*>(malloc (
111
+ sizeof (google_firestore_v1beta1_Document_FieldsEntry) * count));
112
+ int i = 0 ;
113
+ for (const auto & kv : doc.data ().object_value ().internal_value ) {
114
+ result.fields [i] = google_firestore_v1beta1_Document_FieldsEntry_init_zero;
115
+ result.fields [i].key = rpc_serializer_.EncodeString (kv.first );
116
+ result.fields [i].value = rpc_serializer_.EncodeFieldValue (kv.second );
117
+ i++;
112
118
}
113
119
114
120
// Encode Document.update_time
115
- writer->WriteTag (
116
- {PB_WT_STRING, google_firestore_v1beta1_Document_update_time_tag});
117
- writer->WriteNestedMessage ([&](Writer* writer) {
118
- rpc_serializer_.EncodeVersion (writer, doc.version ());
119
- });
121
+ result.update_time = rpc_serializer_.EncodeVersion (doc.version ());
120
122
121
123
// Ignore Document.create_time. (We don't use this in our on-disk protos.)
124
+
125
+ return result;
122
126
}
123
127
124
- void LocalSerializer::EncodeNoDocument (Writer* writer,
125
- const NoDocument& no_doc) const {
128
+ firestore_client_NoDocument LocalSerializer::EncodeNoDocument (
129
+ const NoDocument& no_doc) const {
130
+ firestore_client_NoDocument result = firestore_client_NoDocument_init_zero;
131
+
126
132
// Encode NoDocument.name
127
- writer-> WriteTag ({PB_WT_STRING, firestore_client_NoDocument_name_tag});
128
- writer-> WriteString (rpc_serializer_.EncodeKey (no_doc.key ()));
133
+ result. name =
134
+ rpc_serializer_. EncodeString (rpc_serializer_.EncodeKey (no_doc.key ()));
129
135
130
136
// Encode NoDocument.read_time
131
- writer->WriteTag ({PB_WT_STRING, firestore_client_NoDocument_read_time_tag});
132
- writer->WriteNestedMessage ([&](Writer* writer) {
133
- rpc_serializer_.EncodeVersion (writer, no_doc.version ());
134
- });
137
+ result.read_time = rpc_serializer_.EncodeVersion (no_doc.version ());
138
+
139
+ return result;
135
140
}
136
141
137
142
std::unique_ptr<NoDocument> LocalSerializer::DecodeNoDocument (
@@ -147,38 +152,30 @@ std::unique_ptr<NoDocument> LocalSerializer::DecodeNoDocument(
147
152
*std::move (version));
148
153
}
149
154
150
- void LocalSerializer::EncodeQueryData (Writer* writer,
151
- const QueryData& query_data) const {
152
- writer->WriteTag ({PB_WT_VARINT, firestore_client_Target_target_id_tag});
153
- writer->WriteInteger (query_data.target_id ());
154
-
155
- writer->WriteTag (
156
- {PB_WT_STRING, firestore_client_Target_snapshot_version_tag});
157
- writer->WriteNestedMessage ([&](Writer* writer) {
158
- rpc_serializer_.EncodeTimestamp (writer,
159
- query_data.snapshot_version ().timestamp ());
160
- });
155
+ firestore_client_Target LocalSerializer::EncodeQueryData (
156
+ const QueryData& query_data) const {
157
+ firestore_client_Target result = firestore_client_Target_init_zero;
161
158
162
- writer->WriteTag ({PB_WT_STRING, firestore_client_Target_resume_token_tag});
163
- writer->WriteBytes (query_data.resume_token ());
159
+ result.target_id = query_data.target_id ();
160
+ result.snapshot_version = rpc_serializer_.EncodeTimestamp (
161
+ query_data.snapshot_version ().timestamp ());
162
+ result.resume_token = rpc_serializer_.EncodeBytes (query_data.resume_token ());
164
163
165
164
const Query& query = query_data.query ();
166
165
if (query.IsDocumentQuery ()) {
167
166
// TODO(rsgowman): Implement. Probably like this (once EncodeDocumentsTarget
168
167
// exists):
169
168
/*
170
- writer->WriteTag({PB_WT_STRING, firestore_client_Target_documents_tag});
171
- writer->WriteNestedMessage([&](Writer* writer) {
172
- rpc_serializer_.EncodeDocumentsTarget(writer, query);
173
- });
169
+ result.which_target_type = firestore_client_Target_document_tag;
170
+ result.documents = rpc_serializer_.EncodeDocumentsTarget(query);
174
171
*/
175
172
abort ();
176
173
} else {
177
- writer->WriteTag ({PB_WT_STRING, firestore_client_Target_query_tag});
178
- writer->WriteNestedMessage ([&](Writer* writer) {
179
- rpc_serializer_.EncodeQueryTarget (writer, query);
180
- });
174
+ result.which_target_type = firestore_client_Target_query_tag;
175
+ result.query = rpc_serializer_.EncodeQueryTarget (query);
181
176
}
177
+
178
+ return result;
182
179
}
183
180
184
181
absl::optional<QueryData> LocalSerializer::DecodeQueryData (
0 commit comments