1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
//! Model struct for CatalogQuery type.

use serde::Serialize;

use super::{
    CatalogQueryExact, CatalogQueryItemVariationsForItemOptionValues,
    CatalogQueryItemsForItemOptions, CatalogQueryItemsForModifierList, CatalogQueryItemsForTax,
    CatalogQueryPrefix, CatalogQueryRange, CatalogQuerySet, CatalogQuerySortedAttribute,
    CatalogQueryText,
};

/// A query composed of one or more different types of filters to narrow the scope of targeted
/// objects when calling the `SearchCatalogObjects` endpoint.
///
/// Although a query can have multiple filters, only certain query types can be combined per call to
/// `SearchCatalogObjects`. Any combination of the following types may be used together:
///
/// * [exact_query](CatalogQueryExact)
/// * [prefix_query](CatalogQueryPrefix)
/// * [range_query](CatalogQueryRange)
/// * [sorted_attribute_query](CatalogQuerySortedAttribute)
/// * [text_query](CatalogQueryText) All other query types cannot be combined with any others.
///
/// When a query filter is based on an attribute, the attribute must be searchable. Searchable
/// attributes are listed as follows, along their parent types that can be searched for with
/// applicable query filters.
///
/// * Searchable attribute and objects queryable by searchable attributes **
/// * `name`: `CatalogItem`, `CatalogItemVariation`, `CatalogCategory`, `CatalogTax`,
///   `CatalogDiscount`, `CatalogModifier`, `CatalogModifierList`, `CatalogItemOption`,
///   `CatalogItemOptionValue`
/// * `description`: `CatalogItem`, `CatalogItemOptionValue`
/// * `abbreviation`: `CatalogItem`
/// * `upc`: `CatalogItemVariation`
/// * `sku`: `CatalogItemVariation`
/// * `caption`: `CatalogImage`
/// * `display_name`: `CatalogItemOption`
///
/// For example, to search for [CatalogItem] objects by searchable attributes, you can use the
/// `"name"`, `"description"`, or `"abbreviation"` attribute in an applicable query filter.
#[derive(Clone, Debug, Default, Eq, PartialEq, Serialize)]
pub struct CatalogQuery {
    /// A query expression to sort returned query result by the given attribute.
    pub sorted_attribute_query: Option<CatalogQuerySortedAttribute>,
    /// An exact query expression to return objects with attribute name and value matching the
    /// specified attribute name and value exactly. Value matching is case insensitive.
    pub exact_query: Option<CatalogQueryExact>,
    /// A set query expression to return objects with attribute name and value matching the
    /// specified attribute name and any of the specified attribute values exactly. Value matching
    /// is case insensitive.
    pub set_query: Option<CatalogQuerySet>,
    /// A prefix query expression to return objects with attribute values that have a prefix
    /// matching the specified string value. Value matching is case insensitive.
    pub prefix_query: Option<CatalogQueryPrefix>,
    /// A range query expression to return objects with numeric values that lie in the specified
    /// range.
    pub range_query: Option<CatalogQueryRange>,
    /// A text query expression to return objects whose searchable attributes contain all of the
    /// given keywords, irrespective of their order. For example, if a `CatalogItem` contains custom
    /// attribute values of `{"name": "t-shirt"}` and `{"description": "Small, Purple"}`, the query
    /// filter of `{"keywords": ["shirt", "sma", "purp"]}` returns this item.
    pub text_query: Option<CatalogQueryText>,
    /// A query expression to return items that have any of the specified taxes (as identified by
    /// the corresponding `CatalogTax` object IDs) enabled.
    pub items_for_tax_query: Option<CatalogQueryItemsForTax>,
    /// A query expression to return items that have any of the given modifier list (as identified
    /// by the corresponding `CatalogModifierList`s IDs) enabled.
    pub items_for_modifier_list_query: Option<CatalogQueryItemsForModifierList>,
    /// A query expression to return items that contains the specified item options (as identified
    /// the corresponding `CatalogItemOption` IDs).
    pub items_for_item_options_query: Option<CatalogQueryItemsForItemOptions>,
    /// A query expression to return item variations (of the CatalogItemVariation type) that contain
    /// all of the specified `CatalogItemOption` IDs.
    pub item_variations_for_item_option_values_query:
        Option<CatalogQueryItemVariationsForItemOptionValues>,
}