1use serde::{Deserialize, Serialize};
2
3#[derive(Default, Debug, Serialize, Deserialize, Clone)]
5pub struct CohortSpec {
6 cohorts: Option<Vec<Cohort>>,
7 #[serde(rename = "cohortsRange")]
8 cohorts_range: Option<Vec<Cohort>>,
9 #[serde(rename = "cohortReportSettings")]
10 cohort_report_settings: Option<CohortReportSettings>,
11}
12
13
14#[derive(Default, Debug, Serialize, Deserialize, Clone)]
15pub struct Cohort {
16 name: Option<String>,
17 dimension: Option<String>,
18 #[serde(rename = "dateRange")]
19 date_range: Option<DateRange>,
20}
21
22#[derive(Default, Debug, Serialize, Deserialize, Clone)]
23pub struct CohortsRange {
24 granularity: Option<String>,
25 #[serde(rename = "startOffset")]
26 start_offset: Option<i32>,
27 #[serde(rename = "endOffset")]
28 end_offset: Option<i32>,
29}
30
31#[derive(Default, Debug, Serialize, Deserialize, Clone)]
32pub struct CohortReportSettings {
33 accumulate: Option<bool>,
34}
35
36#[derive(Default, Debug, Serialize, Deserialize, Clone)]
38pub struct DateRange {
39 #[serde(rename = "startDate")]
40 pub start_date: Option<String>,
41 #[serde(rename = "endDate")]
42 pub end_date: Option<String>,
43 pub name: Option<String>,
44}
45
46impl DateRange {
47 pub fn new(name: &str, start: &str, end: &str) -> DateRange {
48 DateRange {
49 name: Some(name.to_string()),
50 start_date: Some(start.to_string()),
51 end_date: Some(end.to_string()),
52 }
53 }
54}
55
56#[derive(Default, Debug, Serialize, Deserialize, Clone)]
58pub struct Dimension {
59 pub name: Option<String>,
60 #[serde(rename = "dimensionExpression")]
61 pub dimension_expression: Option<DimensionExpression>,
62}
63
64impl Dimension {
65 pub fn new(name: &str) -> Dimension {
66 Dimension {
67 name: Some(name.to_string()),
68 ..Dimension::default()
69 }
70 }
71}
72
73#[derive(Default, Debug, Serialize, Deserialize, Clone)]
74pub struct DimensionExpression {
75 #[serde(rename = "lowerCase")]
76 pub lower_case: Option<CaseExpression>,
77 #[serde(rename = "upperCase")]
78 pub upper_case: Option<CaseExpression>,
79 #[serde(rename = "concatenate")]
80 pub concatenate: Option<ConcatenateExpression>,
81
82}
83
84#[derive(Default, Debug, Serialize, Deserialize, Clone)]
85pub struct CaseExpression {
86 #[serde(rename = "dimensionName")]
87 pub dimension_name: Option<String>,
88
89}
90
91#[derive(Default, Debug, Serialize, Deserialize, Clone)]
92pub struct ConcatenateExpression {
93 #[serde(rename = "dimensionNames")]
94 pub dimension_names: Option<Vec<String>>,
95 pub delimiter: Option<String>,
96}
97
98#[derive(Default, Debug, Serialize, Deserialize, Clone)]
100pub struct DimensionHeader {
101 pub name: Option<String>,
102}
103
104
105#[derive(Default, Debug, Serialize, Deserialize, Clone)]
107pub struct DimensionMetadata {
108 #[serde(rename = "apiName")]
109 pub api_name: Option<String>,
110 #[serde(rename = "uiName")]
111 pub ui_name: Option<String>,
112 pub description: Option<String>,
113 #[serde(rename = "deprecatedApiNames")]
114 pub deprecated_api_names: Option<Vec<String>>,
115 #[serde(rename = "customDefinition")]
116 pub custom_definition: Option<bool>,
117 pub category: Option<String>,
118}
119
120#[derive(Default, Debug, Serialize, Deserialize, Clone)]
122pub struct DimensionValue {
123 pub value: Option<String>,
124}
125
126#[derive(Default, Debug, Serialize, Deserialize, Clone)]
128pub struct FilterExpression {
129 #[serde(rename = "andGroup")]
130 pub and_group: Option<FilterExpressionList>,
131 #[serde(rename = "orGroup")]
132 pub or_group: Option<FilterExpressionList>,
133 #[serde(rename = "notExpression")]
134 pub not_expression: Box<Option<FilterExpression>>,
135 pub filter: Option<Filter>,
136}
137
138#[derive(Default, Debug, Serialize, Deserialize, Clone)]
139pub struct FilterExpressionList {
140 pub expressions: Option<Vec<FilterExpression>>,
141}
142
143#[derive(Default, Debug, Serialize, Deserialize, Clone)]
144pub struct Filter {
145 #[serde(rename = "fieldName")]
146 pub field_name: Option<String>,
147 #[serde(rename = "stringFilter")]
148 pub string_filter: Option<StringFilter>,
149 #[serde(rename = "inListFilter")]
150 pub in_list_filter: Option<InListFilter>,
151 #[serde(rename = "numericFilter")]
152 pub numeric_filter: Option<NumericFilter>,
153 #[serde(rename = "betweenFilter")]
154 pub between_filter: Option<BetweenFilter>,
155}
156
157#[derive(Default, Debug, Serialize, Deserialize, Clone)]
158pub struct StringFilter {
159 #[serde(rename = "matchType")]
160 pub match_type: Option<MatchType>,
161 pub value: Option<String>,
162 #[serde(rename = "caseSensitive")]
163 pub case_sensitive: Option<bool>,
164}
165
166#[derive(Debug, Serialize, Deserialize,Clone)]
167pub enum MatchType {
168 #[serde(rename = "MATCH_TYPE_UNSPECIFIED")]
169 MatchTypeUnspecified,
170 #[serde(rename = "EXACT")]
171 Exact,
172 #[serde(rename = "BEGINS_WITH")]
173 BeginsWith,
174 #[serde(rename = "ENDS_WITH")]
175 EndsWith,
176 #[serde(rename = "CONTAINS")]
177 Contains,
178 #[serde(rename = "FULL_REGEXP")]
179 FullRegexp,
180 #[serde(rename = "PARTIAL_REGEXP")]
181 PartialRegexp,
182}
183
184#[derive(Default, Debug, Serialize, Deserialize, Clone)]
185pub struct InListFilter {
186 values: Option<Vec<String>>,
187 #[serde(rename = "caseSensitive")]
188 case_sensitive: Option<bool>,
189}
190
191#[derive(Default, Debug, Serialize, Deserialize, Clone)]
192pub struct NumericFilter {
193 operation: Option<Operation>,
194 value: Option<NumericValue>,
195}
196
197#[derive(Debug, Serialize, Deserialize,Clone)]
198pub enum Operation {
199 #[serde(rename = "OPERATION_UNSPECIFIED")]
200 OperationUnspecified,
201 #[serde(rename = "EQUAL")]
202 Equal,
203 #[serde(rename = "LESS_THAN")]
204 LessThan,
205 #[serde(rename = "LESS_THAN_OR_EQUAL")]
206 LessThanOrEqual,
207 #[serde(rename = "GREATER_THAN")]
208 GreaterThan,
209 #[serde(rename = "GREATER_THAN_OR_EQUAL")]
210 GreaterThanOrEqual,
211}
212
213
214#[derive(Default, Debug, Serialize, Deserialize, Clone)]
215pub struct NumericValue {
216 #[serde(rename = "int64Value")]
217 int_64_value: Option<String>,
218 #[serde(rename = "doubleValue")]
219 double_value: Option<i32>,
220}
221
222#[derive(Default, Debug, Serialize, Deserialize, Clone)]
223pub struct BetweenFilter {
224 #[serde(rename = "fromValue")]
225 from_value: Option<NumericValue>,
226 #[serde(rename = "toValue")]
227 to_value: Option<NumericValue>,
228
229}
230
231#[derive(Default, Debug, Serialize, Deserialize, Clone)]
233pub struct Metric {
234 pub name: Option<String>,
235 pub expression: Option<String>,
236 pub invisible: Option<bool>,
237}
238
239impl Metric {
240 pub fn new(name: &str) -> Metric {
241 Metric {
242 name: Some(name.to_string()),
243 ..Metric::default()
244 }
245 }
246}
247
248#[derive(Debug, Serialize, Deserialize,Clone)]
250pub enum MetricAggregation {
251 #[serde(rename = "METRIC_AGGREGATION_UNSPECIFIED")]
252 MetricAggregationUnspecified,
253 #[serde(rename = "TOTAL")]
254 Total,
255 #[serde(rename = "MINIMUM")]
256 Minimum,
257 #[serde(rename = "MAXIMUM")]
258 Maximum,
259 #[serde(rename = "COUNT")]
260 Count,
261}
262
263#[derive(Default, Debug, Serialize, Deserialize, Clone)]
265pub struct MetricHeader {
266 pub name: Option<String>,
267 #[serde(rename = "type")]
268 pub metric_type: Option<String>,
269}
270
271#[derive(Default, Debug, Serialize, Deserialize, Clone)]
273pub struct MetricMetadata {
274 #[serde(rename = "apiName")]
275 pub api_name: String,
276 #[serde(rename = "uiName")]
277 pub ui_name: String,
278 pub description: String,
279 #[serde(rename = "deprecatedApiNames")]
280 pub deprecated_api_names: Vec<String>,
281 #[serde(rename = "type")]
282 pub metric_type: String,
283 pub expression: String,
284 #[serde(rename = "customDefinition")]
285 pub custom_definition: bool,
286 #[serde(rename = "blockedReasons")]
287 pub blocked_reasons: Vec<String>,
288 pub category: String,
289}
290
291#[derive(Debug, Serialize, Deserialize,Clone)]
293pub enum MetricType {
294 #[serde(rename = "METRIC_TYPE_UNSPECIFIED")]
295 MetricTypeUnspecified,
296 #[serde(rename = "TYPE_INTEGER")]
297 TypeInteger,
298 #[serde(rename = "TYPE_FLOAT")]
299 TypeFloat,
300 #[serde(rename = "TYPE_SECONDS")]
301 TypeSeconds,
302 #[serde(rename = "TYPE_MILLISECONDS")]
303 TypeMilliseconds,
304 #[serde(rename = "TYPE_MINUTES")]
305 TypeMinutes,
306 #[serde(rename = "TYPE_HOURS")]
307 TypeHours,
308 #[serde(rename = "TYPE_STANDARD")]
309 TypeStandard,
310 #[serde(rename = "TYPE_CURRENCY")]
311 TypeCurrency,
312 #[serde(rename = "TYPE_FEET")]
313 TypeFeet,
314 #[serde(rename = "TYPE_MILES")]
315 TypeMiles,
316 #[serde(rename = "TYPE_METERS")]
317 TypeMeters,
318 #[serde(rename = "TYPE_KILOMETERS")]
319 TypeKilometers,
320
321}
322
323#[derive(Default, Debug, Serialize, Deserialize, Clone)]
325pub struct OrderBy {}
326
327#[derive(Default, Debug, Serialize, Deserialize, Clone)]
328pub struct MetricOrderBy {
329 #[serde(rename = "metricName")]
330 pub metric_name: Option<String>,
331}
332
333#[derive(Default, Debug, Serialize, Deserialize, Clone)]
334pub struct DimensionOrderBy {
335 #[serde(rename = "dimensionName")]
336 pub dimension_name: Option<String>,
337 #[serde(rename = "orderType")]
338 pub order_type: Option<OrderType>,
339}
340
341#[derive(Debug, Serialize, Deserialize,Clone)]
342pub enum OrderType {
343 #[serde(rename = "ORDER_TYPE_UNSPECIFIED")]
344 OrderTypeUnspecified,
345 #[serde(rename = "ALPHANUMERIC")]
346 Alphanumeric,
347 #[serde(rename = "CASE_INSENSITIVE_ALPHANUMERIC")]
348 CaseInsensitiveAlphanumeric,
349 #[serde(rename = "NUMERIC")]
350 Numeric,
351}
352
353#[derive(Default, Debug, Serialize, Deserialize, Clone)]
354pub struct PivotOrderBy {
355 #[serde(rename = "metricName")]
356 pub metric_name: Option<String>,
357 #[serde(rename = "pivotSelections")]
358 pub pivot_selections: Option<Vec<PivotSelection>>,
359}
360
361#[derive(Default, Debug, Serialize, Deserialize, Clone)]
362pub struct PivotSelection {
363 #[serde(rename = "dimensionName")]
364 pub dimension_name: Option<String>,
365 #[serde(rename = "dimensionValue")]
366 pub dimension_value: Option<String>,
367}
368
369
370#[derive(Default, Debug, Serialize, Deserialize, Clone)]
372pub struct Pivot {
373 #[serde(rename = "fieldNames")]
374 pub field_names: Option<Vec<String>>,
375 #[serde(rename = "orderBys")]
376 pub order_bys: Option<Vec<OrderBy>>,
377 #[serde(rename = "offset")]
378 pub offset: Option<String>,
379 #[serde(rename = "limit")]
380 pub limit: Option<String>,
381 #[serde(rename = "metricAggregations")]
382 pub metric_aggregations: Option<Vec<MetricAggregation>>,
383}
384
385#[derive(Default, Debug, Serialize, Deserialize, Clone)]
387pub struct PropertyQuota {
388 #[serde(rename = "tokensPerDay")]
389 pub tokens_per_day: Option<QuotaStatus>,
390 #[serde(rename = "tokensPerHour")]
391 pub tokens_per_hour: Option<QuotaStatus>,
392 #[serde(rename = "concurrentRequests")]
393 pub concurrent_requests: Option<QuotaStatus>,
394 #[serde(rename = "serverErrorsPerProjectPerHour")]
395 pub server_errors_per_project_per_hour: Option<QuotaStatus>,
396 #[serde(rename = "potentiallyThresholdedRequestsPerHour")]
397 pub potentially_thresholded_requests_per_hour: Option<QuotaStatus>,
398}
399
400#[derive(Default, Debug, Serialize, Deserialize, Clone)]
401pub struct QuotaStatus {
402 pub consumed: i32,
403 pub remaining: i32,
404}
405
406#[derive(Default, Debug, Serialize, Deserialize, Clone)]
408pub struct ResponseMetaData {
409 #[serde(rename = "dataLossFromOtherRow")]
410 pub data_loss_from_other_row: Option<bool>,
411 #[serde(rename = "schemaRestrictionResponse")]
412 pub schema_restriction_response: Option<SchemaRestrictionResponse>,
413 #[serde(rename = "currencyCode")]
414 pub currency_code: Option<String>,
415 #[serde(rename = "timeZone")]
416 pub time_zone: Option<String>,
417 #[serde(rename = "emptyReason")]
418 pub empty_reason: Option<String>,
419 #[serde(rename = "subjectToThresholding")]
420 pub subject_to_thresholding: Option<bool>,
421}
422
423#[derive(Default, Debug, Serialize, Deserialize, Clone)]
424pub struct SchemaRestrictionResponse {
425 #[serde(rename = "activeMetricRestrictions")]
426 pub active_metric_restrictions: Option<Vec<ActiveMetricRestriction>>,
427}
428
429#[derive(Default, Debug, Serialize, Deserialize, Clone)]
430pub struct ActiveMetricRestriction {
431 #[serde(rename = "restrictedMetricTypes")]
432 pub restricted_metric_types: Option<Vec<RestrictedMetricType>>,
433 #[serde(rename = "metricName")]
434 pub metric_name: Option<bool>,
435}
436
437#[derive(Debug, Serialize, Deserialize,Clone)]
438pub enum RestrictedMetricType {
439 #[serde(rename = "RESTRICTED_METRIC_TYPE_UNSPECIFIED")]
440 RestrictedMetricTypeUnspecified,
441 #[serde(rename = "COST_DATA")]
442 CostData,
443 #[serde(rename = "REVENUE_DATA")]
444 RevenueData,
445}
446
447#[derive(Default, Debug, Serialize, Deserialize, Clone)]
449pub struct Row {
450 #[serde(rename = "dimensionValues")]
451 pub dimension_values: Option<Vec<DimensionValue>>,
452 #[serde(rename = "metricValues")]
453 pub metric_values: Option<Vec<MetricValue>>,
454}
455
456#[derive(Default, Debug, Serialize, Deserialize, Clone)]
457pub struct MetricValue {
458 pub value: Option<String>,
459}
460
461#[derive(Default, Debug, Serialize, Deserialize, Clone)]
463pub struct RunPivotReportResponse {
464 #[serde(rename = "pivotHeaders")]
465 pub pivot_headers: Option<Vec<PivotHeader>>,
466 #[serde(rename = "dimensionHeaders")]
467 pub dimension_headers: Option<Vec<DimensionHeader>>,
468 #[serde(rename = "metricHeaders")]
469 pub metric_headers: Option<Vec<MetricHeader>>,
470 pub rows: Option<Vec<Row>>,
471 pub aggregates: Option<Vec<Row>>,
472 pub metadata: Option<ResponseMetaData>,
473 #[serde(rename = "propertyQuota")]
474 pub property_quota: Option<PropertyQuota>,
475 pub kind: Option<String>,
476}
477
478#[derive(Default, Debug, Serialize, Deserialize, Clone)]
479pub struct PivotHeader {
480 #[serde(rename = "pivotDimensionHeaders")]
481 pub pivot_dimension_headers: Option<Vec<PivotDimensionHeader>>,
482 #[serde(rename = "rowCount")]
483 pub row_count: Option<i32>,
484}
485
486#[derive(Default, Debug, Serialize, Deserialize, Clone)]
487pub struct PivotDimensionHeader {
488 #[serde(rename = "dimensionValues")]
489 pub dimension_values: Option<Vec<DimensionValue>>,
490}
491
492#[derive(Default, Debug, Serialize, Deserialize, Clone)]
494pub struct RunReportResponse {
495 #[serde(rename = "dimensionHeaders")]
496 pub dimension_headers: Option<Vec<DimensionHeader>>,
497 #[serde(rename = "metricHeaders")]
498 pub metric_headers: Option<Vec<MetricHeader>>,
499 pub rows: Option<Vec<Row>>,
500 pub totals: Option<Vec<Row>>,
501 pub maximums: Option<Vec<Row>>,
502 pub minimums: Option<Vec<Row>>,
503 #[serde(rename = "rowCount")]
504 pub row_count: Option<i32>,
505 pub metadata: Option<ResponseMetaData>,
506 #[serde(rename = "propertyQuota")]
507 pub property_quota: Option<PropertyQuota>,
508 pub kind: Option<String>,
509}