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