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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
//! Model struct for CatalogObject type

use std::collections::HashMap;

use serde::{Deserialize, Serialize};

use super::{
    enums::CatalogObjectType, CatalogCategory, CatalogCustomAttributeDefinition,
    CatalogCustomAttributeValue, CatalogDiscount, CatalogImage, CatalogItem, CatalogItemOption,
    CatalogItemOptionValue, CatalogItemVariation, CatalogMeasurementUnit, CatalogModifier,
    CatalogModifierList, CatalogPricingRule, CatalogProductSet, CatalogQuickAmountsSettings,
    CatalogSubscriptionPlan, CatalogTax, CatalogTimePeriod, CatalogV1Id, DateTime,
};

/// The wrapper object for the catalog entries of a given object type.
///
/// Depending on the `type` attribute value, a `CatalogObject` instance assumes a type-specific data
/// to yield the corresponding type of catalog object.
///
/// For example, if `type=ITEM`, the `CatalogObject` instance must have the ITEM-specific data set
/// on the `item_data` attribute. The resulting `CatalogObject` instance is also a `CatalogItem`
/// instance.
///
/// In general, if `type=<OBJECT_TYPE>`, the `CatalogObject` instance must have the
/// `<OBJECT_TYPE>`-specific data set on the `<object_type>_data` attribute. The resulting
/// `CatalogObject` instance is also a `Catalog<ObjectType>` instance.
///
/// For a more detailed discussion of the Catalog data model, please see the
/// [Design a Catalog](https://developer.squareup.com/docs/catalog-api/design-a-catalog) guide.
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
pub struct CatalogObject {
    /// The type of this object. Each object type has expected properties expressed in a structured
    /// format within its corresponding `*_data` field below.
    pub r#type: CatalogObjectType,
    /// An identifier to reference this object in the catalog. When a new `CatalogObject` is
    /// inserted, the client should set the id to a temporary identifier starting with a "`#`"
    /// character. Other objects being inserted or updated within the same request may use this
    /// identifier to refer to the new object.
    ///
    /// When the server receives the new object, it will supply a unique identifier that replaces
    /// the temporary identifier for all future references.
    pub id: String,
    /// **Read only** Last modification timestamp.
    pub updated_at: Option<DateTime>,
    /// The version of the object. When updating an object, the version supplied must match the
    /// version in the database, otherwise the write will be rejected as conflicting.
    pub version: Option<i64>,
    /// If `true`, the object has been deleted from the database. Must be `false` for new objects
    /// being inserted. When deleted, the `updated_at` field will equal the deletion time.
    pub is_deleted: Option<bool>,
    /// A map (key-value pairs) of application-defined custom attribute values. The value of a
    /// key-value pair is a [CatalogCustomAttributeValue] object. The key is the `key` attribute
    /// value defined in the associated [CatalogCustomAttributeDefinition] object defined by the
    /// application making the request.
    ///
    /// If the `CatalogCustomAttributeDefinition` object is defined by another application, the
    /// `CatalogCustomAttributeDefinition`'s key attribute value is prefixed by the defining
    /// application ID. For example, if the `CatalogCustomAttributeDefinition` has a `key` attribute
    /// of `"cocoa_brand"` and the defining application ID is `"abcd1234"`, the key in the map is
    /// `"abcd1234:cocoa_brand"` if the application making the request is different from the
    /// application defining the custom attribute definition. Otherwise, the key used in the map is
    /// simply `"cocoa_brand"`.
    ///
    /// Application-defined custom attributes are set at a global (location-independent) level.
    /// Custom attribute values are intended to store additional information about a catalog object
    /// or associations with an entity in another system. Do not use custom attributes to store any
    /// sensitive information (personally identifiable information, card details, etc.).
    pub custom_attribute_values: Option<HashMap<String, CatalogCustomAttributeValue>>,
    /// The Connect v1 IDs for this object at each location where it is present, where they differ
    /// from the object's Connect V2 ID. The field will only be present for objects that have been
    /// created or modified by legacy APIs.
    pub catalog_v1_ids: Option<Vec<CatalogV1Id>>,
    /// If `true`, this object is present at all locations (including future locations), except
    /// where specified in the `absent_at_location_ids` field. If `false`, this object is not
    /// present at any locations (including future locations), except where specified in the
    /// `present_at_location_ids` field. If not specified, defaults to `true`.
    pub present_at_all_locations: Option<bool>,
    /// A list of locations where the object is present, even if `present_at_all_locations` is
    /// `false`. This can include locations that are deactivated.
    pub present_at_location_ids: Option<Vec<String>>,
    /// A list of locations where the object is not present, even if `present_at_all_locations` is
    /// `true`. This can include locations that are deactivated.
    pub absent_at_location_ids: Option<Vec<String>>,
    /// Structured data for a `CatalogItem`, set for CatalogObjects of type `ITEM`.
    pub item_data: Option<CatalogItem>,
    /// Structured data for a `CatalogCategory`, set for CatalogObjects of type `CATEGORY`.
    pub category_data: Option<CatalogCategory>,
    /// Structured data for a `CatalogItemVariation`, set for CatalogObjects of type
    /// `ITEM_VARIATION`.
    pub item_variation_data: Option<CatalogItemVariation>,
    /// Structured data for a `CatalogTax`, set for CatalogObjects of type `TAX`.
    pub tax_data: Option<CatalogTax>,
    /// Structured data for a `CatalogDiscount`, set for CatalogObjects of type `DISCOUNT`.
    pub discount_data: Option<CatalogDiscount>,
    /// Structured data for a `CatalogModifierList`, set for CatalogObjects of type `MODIFIER_LIST`.
    pub modifier_list_data: Option<CatalogModifierList>,
    /// Structured data for a `CatalogModifier`, set for CatalogObjects of type `MODIFIER`.
    pub modifier_data: Option<CatalogModifier>,
    /// Structured data for a `CatalogTimePeriod`, set for CatalogObjects of type `TIME_PERIOD`.
    pub time_period_data: Option<CatalogTimePeriod>,
    /// Structured data for a `CatalogProductSet`, set for CatalogObjects of type `PRODUCT_SET`.
    pub product_set_data: Option<CatalogProductSet>,
    /// Structured data for a `CatalogPricingRule`, set for CatalogObjects of type `PRICING_RULE`. A
    /// `CatalogPricingRule` object often works with a `CatalogProductSet` object or a
    /// `CatalogTimePeriod` object.
    pub pricing_rule_data: Option<CatalogPricingRule>,
    /// Structured data for a `CatalogImage`, set for CatalogObjects of type `IMAGE`.
    pub image_data: Option<CatalogImage>,
    /// Structured data for a `CatalogMeasurementUnit`, set for CatalogObjects of type
    /// `MEASUREMENT_UNIT`.
    pub measurement_unit_data: Option<CatalogMeasurementUnit>,
    /// Structured data for a `CatalogSubscriptionPlan`, set for CatalogObjects of type
    /// `SUBSCRIPTION_PLAN`.
    pub subscription_plan_data: Option<CatalogSubscriptionPlan>,
    /// Structured data for a `CatalogItemOption`, set for CatalogObjects of type `ITEM_OPTION`.
    pub item_option_data: Option<CatalogItemOption>,
    /// Structured data for a `CatalogItemOptionValue`, set for CatalogObjects of type
    /// `ITEM_OPTION_VAL`.
    pub item_option_value_data: Option<CatalogItemOptionValue>,
    /// Structured data for a `CatalogCustomAttributeDefinition`, set for CatalogObjects of type
    /// `CUSTOM_ATTRIBUTE_DEFINITION`.
    pub custom_attribute_definition_data: Option<CatalogCustomAttributeDefinition>,
    /// Structured data for a `CatalogQuickAmountsSettings`, set for CatalogObjects of type
    /// `QUICK_AMOUNTS_SETTINGS`.
    pub quick_amounts_settings_data: Option<CatalogQuickAmountsSettings>,
}