google_analytics_api_ga4/
types.rs

1use serde::{Deserialize, Serialize};
2
3/// https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/CohortSpec#CohortsRange
4#[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/// https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/DateRange
37#[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/// https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/Dimension
57#[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/// https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/DimensionHeader
106#[derive(Default, Debug, Serialize, Deserialize, Clone)]
107pub struct DimensionHeader {
108    pub name: Option<String>,
109}
110
111
112/// https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/DimensionMetadata
113#[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/// https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/DimensionValue
128#[derive(Default, Debug, Serialize, Deserialize, Clone)]
129pub struct DimensionValue {
130    pub value: Option<String>,
131}
132
133/// https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/FilterExpression
134#[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/// https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/Metric
239#[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/// https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/MetricAggregation
263#[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/// https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/MetricHeader
278#[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/// https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/MetricHeader
286#[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/// https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/MetricType
306#[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/// https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/OrderBy
338#[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/// https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/Pivot
385#[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/// https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/PropertyQuota
400#[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/// https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/ResponseMetaData
421#[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/// https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/Row
462#[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/// https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/RunPivotReportResponse
476#[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/// https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/RunReportResponse
507#[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}