1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3
4#[derive(Serialize, Deserialize, Debug, Clone)]
6#[serde(rename_all = "camelCase")]
7pub struct Document {
8 pub name: String,
10 pub fields: HashMap<String, Value>,
12 pub create_time: String,
14 pub update_time: String,
16}
17
18#[derive(Serialize, Deserialize, Debug, Clone)]
20#[serde(rename_all = "camelCase")]
21pub struct Value {
22 #[serde(flatten)]
24 pub value_type: ValueType,
25}
26
27#[derive(Serialize, Deserialize, Debug, Clone)]
29#[serde(rename_all = "camelCase")]
30pub enum ValueType {
31 StringValue(String),
33 IntegerValue(String), DoubleValue(f64),
37 BooleanValue(bool),
39 MapValue(MapValue),
41 ArrayValue(ArrayValue),
43 NullValue(()),
45 TimestampValue(String),
47 GeoPointValue(GeoPoint),
49 BytesValue(String), ReferenceValue(String),
53}
54
55#[derive(Serialize, Deserialize, Debug, Clone)]
57pub struct MapValue {
58 pub fields: HashMap<String, Value>,
60}
61
62#[derive(Serialize, Deserialize, Debug, Clone)]
64pub struct ArrayValue {
65 pub values: Vec<Value>,
67}
68
69#[derive(Serialize, Deserialize, Debug, Clone)]
71pub struct GeoPoint {
72 pub latitude: f64,
74 pub longitude: f64,
76}
77
78#[derive(Serialize, Deserialize, Debug, Clone)]
80pub struct ListDocumentsResponse {
81 pub documents: Vec<Document>,
83 #[serde(rename = "nextPageToken")]
85 pub next_page_token: Option<String>,
86}
87
88#[derive(Serialize, Deserialize, Debug, Clone)]
92#[serde(rename_all = "camelCase")]
93pub struct BeginTransactionRequest {
94 #[serde(skip_serializing_if = "Option::is_none")]
96 pub options: Option<TransactionOptions>,
97}
98
99#[derive(Serialize, Deserialize, Debug, Clone)]
101#[serde(rename_all = "camelCase")]
102pub struct TransactionOptions {
103 #[serde(flatten)]
105 pub mode: Option<TransactionMode>,
106}
107
108#[derive(Serialize, Deserialize, Debug, Clone)]
110#[serde(rename_all = "camelCase")]
111pub enum TransactionMode {
112 ReadOnly(ReadOnlyOptions),
114 ReadWrite(ReadWriteOptions),
116}
117
118#[derive(Serialize, Deserialize, Debug, Clone)]
120#[serde(rename_all = "camelCase")]
121pub struct ReadOnlyOptions {
122 #[serde(skip_serializing_if = "Option::is_none")]
124 pub read_time: Option<String>,
125}
126
127#[derive(Serialize, Deserialize, Debug, Clone)]
129#[serde(rename_all = "camelCase")]
130pub struct ReadWriteOptions {
131 #[serde(skip_serializing_if = "Option::is_none")]
133 pub retry_transaction: Option<String>, }
135
136#[derive(Serialize, Deserialize, Debug, Clone)]
138#[serde(rename_all = "camelCase")]
139pub struct BeginTransactionResponse {
140 pub transaction: String,
142}
143
144#[derive(Serialize, Deserialize, Debug, Clone)]
146#[serde(rename_all = "camelCase")]
147pub struct RollbackRequest {
148 pub transaction: String,
150}
151
152#[derive(Serialize, Deserialize, Debug, Clone)]
154#[serde(rename_all = "camelCase")]
155pub struct CommitRequest {
156 #[serde(skip_serializing_if = "Option::is_none")]
158 pub transaction: Option<String>,
159 pub writes: Vec<Write>,
161}
162
163#[derive(Serialize, Deserialize, Debug, Clone)]
165#[serde(rename_all = "camelCase")]
166pub struct CommitResponse {
167 #[serde(default)]
169 pub write_results: Vec<WriteResult>,
170 #[serde(skip_serializing_if = "Option::is_none")]
172 pub commit_time: Option<String>,
173}
174
175#[derive(Serialize, Deserialize, Debug, Clone)]
177#[serde(rename_all = "camelCase")]
178pub struct WriteResult {
179 #[serde(skip_serializing_if = "Option::is_none")]
181 pub update_time: Option<String>,
182 #[serde(default)]
184 pub transform_results: Vec<Value>,
185}
186
187#[derive(Serialize, Deserialize, Debug, Clone)]
189#[serde(rename_all = "camelCase")]
190pub struct Write {
191 #[serde(skip_serializing_if = "Option::is_none")]
193 pub update_mask: Option<DocumentMask>,
194 #[serde(skip_serializing_if = "Option::is_none")]
196 pub update_transforms: Option<Vec<FieldTransform>>,
197 #[serde(skip_serializing_if = "Option::is_none")]
199 pub current_document: Option<Precondition>,
200 #[serde(flatten)]
202 pub operation: WriteOperation,
203}
204
205#[derive(Serialize, Deserialize, Debug, Clone)]
207#[serde(rename_all = "camelCase")]
208pub enum WriteOperation {
209 Update(Document),
211 Delete(String), Transform(DocumentTransform),
215}
216
217#[derive(Serialize, Deserialize, Debug, Clone)]
219#[serde(rename_all = "camelCase")]
220pub struct DocumentMask {
221 pub field_paths: Vec<String>,
223}
224
225#[derive(Serialize, Deserialize, Debug, Clone)]
227#[serde(rename_all = "camelCase")]
228pub struct Precondition {
229 #[serde(skip_serializing_if = "Option::is_none")]
232 pub exists: Option<bool>,
233 #[serde(skip_serializing_if = "Option::is_none")]
235 pub update_time: Option<String>,
236}
237
238#[derive(Serialize, Deserialize, Debug, Clone)]
240#[serde(rename_all = "camelCase")]
241pub struct DocumentTransform {
242 pub document: String,
244 pub field_transforms: Vec<FieldTransform>,
246}
247
248#[derive(Serialize, Deserialize, Debug, Clone)]
250#[serde(rename_all = "camelCase")]
251pub struct FieldTransform {
252 pub field_path: String,
254 #[serde(flatten)]
256 pub transform_type: TransformType,
257}
258
259#[derive(Serialize, Deserialize, Debug, Clone)]
261#[serde(rename_all = "camelCase")]
262pub enum TransformType {
263 SetToServerValue(String), Increment(Value),
267 Maximum(Value),
269 Minimum(Value),
271 AppendMissingElements(ArrayValue),
273 RemoveAllFromArray(ArrayValue),
275}
276
277#[derive(Serialize, Deserialize, Debug, Clone)]
281#[serde(rename_all = "camelCase")]
282pub struct ListenRequest {
283 pub database: String,
285 #[serde(skip_serializing_if = "Option::is_none")]
287 pub add_target: Option<Target>,
288 #[serde(skip_serializing_if = "Option::is_none")]
290 pub remove_target: Option<i32>,
291 #[serde(skip_serializing_if = "Option::is_none")]
293 pub labels: Option<HashMap<String, String>>,
294}
295
296#[derive(Serialize, Deserialize, Debug, Clone)]
298#[serde(rename_all = "camelCase")]
299pub struct Target {
300 #[serde(flatten)]
302 pub target_type: Option<TargetType>,
303 #[serde(skip_serializing_if = "Option::is_none")]
305 pub resume_token: Option<String>, #[serde(skip_serializing_if = "Option::is_none")]
308 pub read_time: Option<String>, #[serde(skip_serializing_if = "Option::is_none")]
311 pub target_id: Option<i32>,
312 #[serde(skip_serializing_if = "Option::is_none")]
314 pub once: Option<bool>,
315 #[serde(skip_serializing_if = "Option::is_none")]
317 pub expected_count: Option<i32>,
318}
319
320#[derive(Serialize, Deserialize, Debug, Clone)]
322#[serde(rename_all = "camelCase")]
323pub enum TargetType {
324 Query(QueryTarget),
326 Documents(DocumentsTarget),
328}
329
330#[derive(Serialize, Deserialize, Debug, Clone)]
332#[serde(rename_all = "camelCase")]
333pub struct QueryTarget {
334 pub parent: String,
336 #[serde(skip_serializing_if = "Option::is_none")]
338 pub structured_query: Option<StructuredQuery>,
339}
340
341#[derive(Serialize, Deserialize, Debug, Clone)]
343#[serde(rename_all = "camelCase")]
344pub struct DocumentsTarget {
345 pub documents: Vec<String>,
347}
348
349#[derive(Serialize, Deserialize, Debug, Clone)]
351#[serde(rename_all = "camelCase")]
352pub struct ListenResponse {
353 #[serde(skip_serializing_if = "Option::is_none")]
355 pub target_change: Option<TargetChange>,
356 #[serde(skip_serializing_if = "Option::is_none")]
358 pub document_change: Option<DocumentChange>,
359 #[serde(skip_serializing_if = "Option::is_none")]
361 pub document_delete: Option<DocumentDelete>,
362 #[serde(skip_serializing_if = "Option::is_none")]
364 pub document_remove: Option<DocumentRemove>,
365 #[serde(skip_serializing_if = "Option::is_none")]
367 pub filter: Option<ExistenceFilter>,
368}
369
370#[derive(Serialize, Deserialize, Debug, Clone)]
372#[serde(rename_all = "camelCase")]
373pub struct TargetChange {
374 #[serde(default)]
376 pub target_change_type: TargetChangeType,
377 #[serde(default)]
379 pub target_ids: Vec<i32>,
380 #[serde(skip_serializing_if = "Option::is_none")]
382 pub cause: Option<Status>,
383 #[serde(skip_serializing_if = "Option::is_none")]
386 pub resume_token: Option<String>, #[serde(skip_serializing_if = "Option::is_none")]
389 pub read_time: Option<String>,
390}
391
392#[derive(Serialize, Deserialize, Debug, Clone)]
394#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
395pub enum TargetChangeType {
396 NoChange,
398 Add,
400 Remove,
402 Current,
405 Reset,
407}
408
409impl Default for TargetChangeType {
410 fn default() -> Self {
411 TargetChangeType::NoChange
412 }
413}
414
415#[derive(Serialize, Deserialize, Debug, Clone)]
417#[serde(rename_all = "camelCase")]
418pub struct DocumentChange {
419 #[serde(skip_serializing_if = "Option::is_none")]
421 pub document: Option<Document>,
422 #[serde(default)]
424 pub target_ids: Vec<i32>,
425 #[serde(default)]
427 pub removed_target_ids: Vec<i32>,
428}
429
430#[derive(Serialize, Deserialize, Debug, Clone)]
432#[serde(rename_all = "camelCase")]
433pub struct DocumentDelete {
434 pub document: String,
436 #[serde(default)]
438 pub removed_target_ids: Vec<i32>,
439 #[serde(skip_serializing_if = "Option::is_none")]
441 pub read_time: Option<String>,
442}
443
444#[derive(Serialize, Deserialize, Debug, Clone)]
446#[serde(rename_all = "camelCase")]
447pub struct DocumentRemove {
448 pub document: String,
450 #[serde(default)]
452 pub removed_target_ids: Vec<i32>,
453 #[serde(skip_serializing_if = "Option::is_none")]
455 pub read_time: Option<String>,
456}
457
458#[derive(Serialize, Deserialize, Debug, Clone)]
460#[serde(rename_all = "camelCase")]
461pub struct ExistenceFilter {
462 pub count: i32,
464 pub target_id: i32,
466 #[serde(skip_serializing_if = "Option::is_none")]
468 pub unchanged_names: Option<BloomFilter>,
469}
470
471#[derive(Serialize, Deserialize, Debug, Clone)]
473#[serde(rename_all = "camelCase")]
474pub struct BloomFilter {
475 #[serde(skip_serializing_if = "Option::is_none")]
477 pub bits: Option<BitSequence>,
478 pub hash_count: i32,
480}
481
482#[derive(Serialize, Deserialize, Debug, Clone)]
484#[serde(rename_all = "camelCase")]
485pub struct BitSequence {
486 pub bitmap: String,
488 pub padding: i32,
490}
491
492#[derive(Serialize, Deserialize, Debug, Clone)]
494#[serde(rename_all = "camelCase")]
495pub struct Status {
496 pub code: i32,
498 pub message: String,
500 #[serde(default)]
502 pub details: Vec<HashMap<String, serde_json::Value>>,
503}
504
505#[derive(Serialize, Deserialize, Debug, Clone)]
509#[serde(rename_all = "camelCase")]
510pub struct StructuredQuery {
511 #[serde(skip_serializing_if = "Option::is_none")]
513 pub select: Option<Projection>,
514 #[serde(skip_serializing_if = "Option::is_none")]
516 pub from: Option<Vec<CollectionSelector>>,
517 #[serde(rename = "where", skip_serializing_if = "Option::is_none")]
519 pub where_clause: Option<QueryFilter>,
520 #[serde(skip_serializing_if = "Option::is_none")]
522 pub order_by: Option<Vec<Order>>,
523 #[serde(skip_serializing_if = "Option::is_none")]
525 pub start_at: Option<Cursor>,
526 #[serde(skip_serializing_if = "Option::is_none")]
528 pub end_at: Option<Cursor>,
529 #[serde(skip_serializing_if = "Option::is_none")]
531 pub offset: Option<i32>,
532 #[serde(skip_serializing_if = "Option::is_none")]
534 pub limit: Option<i32>,
535}
536
537#[derive(Serialize, Deserialize, Debug, Clone)]
539#[serde(rename_all = "camelCase")]
540pub struct RunQueryRequest {
541 pub parent: String,
543 #[serde(skip_serializing_if = "Option::is_none")]
545 pub structured_query: Option<StructuredQuery>,
546 }
551
552#[derive(Serialize, Deserialize, Debug, Clone)]
554#[serde(rename_all = "camelCase")]
555pub struct RunQueryResponse {
556 #[serde(skip_serializing_if = "Option::is_none")]
558 pub transaction: Option<String>,
559 #[serde(skip_serializing_if = "Option::is_none")]
561 pub document: Option<Document>,
562 #[serde(skip_serializing_if = "Option::is_none")]
564 pub read_time: Option<String>,
565 #[serde(skip_serializing_if = "Option::is_none")]
568 pub skipped_results: Option<i32>,
569}
570
571#[derive(Serialize, Deserialize, Debug, Clone)]
573#[serde(rename_all = "camelCase")]
574pub struct Projection {
575 #[serde(skip_serializing_if = "Option::is_none")]
577 pub fields: Option<Vec<FieldReference>>,
578}
579
580#[derive(Serialize, Deserialize, Debug, Clone)]
582#[serde(rename_all = "camelCase")]
583pub struct CollectionSelector {
584 pub collection_id: String,
586 #[serde(skip_serializing_if = "Option::is_none")]
590 pub all_descendants: Option<bool>,
591}
592
593#[derive(Serialize, Deserialize, Debug, Clone)]
595#[serde(rename_all = "camelCase")]
596pub struct QueryFilter {
597 #[serde(flatten)]
599 pub filter_type: Option<FilterType>,
600}
601
602#[derive(Serialize, Deserialize, Debug, Clone)]
604#[serde(rename_all = "camelCase")]
605pub enum FilterType {
606 CompositeFilter(CompositeFilter),
608 FieldFilter(FieldFilter),
610 UnaryFilter(UnaryFilter),
612}
613
614#[derive(Serialize, Deserialize, Debug, Clone)]
616#[serde(rename_all = "camelCase")]
617pub struct CompositeFilter {
618 pub op: CompositeOperator,
620 pub filters: Vec<QueryFilter>,
622}
623
624#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
626#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
627pub enum CompositeOperator {
628 OperatorUnspecified,
630 And,
632 Or,
634}
635
636#[derive(Serialize, Deserialize, Debug, Clone)]
638#[serde(rename_all = "camelCase")]
639pub struct FieldFilter {
640 pub field: FieldReference,
642 pub op: FieldOperator,
644 pub value: Value,
646}
647
648#[derive(Serialize, Deserialize, Debug, Clone)]
650#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
651pub enum FieldOperator {
652 OperatorUnspecified,
654 LessThan,
656 LessThanOrEqual,
658 GreaterThan,
660 GreaterThanOrEqual,
662 Equal,
664 NotEqual,
666 ArrayContains,
668 In,
670 ArrayContainsAny,
672 NotIn,
674}
675
676#[derive(Serialize, Deserialize, Debug, Clone)]
678#[serde(rename_all = "camelCase")]
679pub struct UnaryFilter {
680 pub op: UnaryOperator,
682 pub field: FieldReference,
684}
685
686#[derive(Serialize, Deserialize, Debug, Clone)]
688#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
689pub enum UnaryOperator {
690 OperatorUnspecified,
692 IsNan,
694 IsNull,
696 IsNotNan,
698 IsNotNull,
700}
701
702#[derive(Serialize, Deserialize, Debug, Clone)]
704#[serde(rename_all = "camelCase")]
705pub struct Order {
706 pub field: FieldReference,
708 pub direction: Direction,
710}
711
712#[derive(Serialize, Deserialize, Debug, Clone)]
714#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
715pub enum Direction {
716 DirectionUnspecified,
718 Ascending,
720 Descending,
722}
723
724#[derive(Serialize, Deserialize, Debug, Clone)]
726#[serde(rename_all = "camelCase")]
727pub struct FieldReference {
728 pub field_path: String,
730}
731
732#[derive(Serialize, Deserialize, Debug, Clone)]
734#[serde(rename_all = "camelCase")]
735pub struct Cursor {
736 pub values: Vec<Value>,
739 #[serde(skip_serializing_if = "Option::is_none")]
741 pub before: Option<bool>,
742}
743
744#[derive(Serialize, Deserialize, Debug, Clone)]
748#[serde(rename_all = "camelCase")]
749pub struct ListCollectionIdsRequest {
750 #[serde(skip_serializing_if = "Option::is_none")]
752 pub page_size: Option<i32>,
753 #[serde(skip_serializing_if = "Option::is_none")]
755 pub page_token: Option<String>,
756}
757
758#[derive(Serialize, Deserialize, Debug, Clone)]
760#[serde(rename_all = "camelCase")]
761pub struct ListCollectionIdsResponse {
762 #[serde(default)]
764 pub collection_ids: Vec<String>,
765 #[serde(skip_serializing_if = "Option::is_none")]
767 pub next_page_token: Option<String>,
768}