// This file is @generated by prost-build.
/// Attributes.
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct Attributes {
    /// Set this value to false when the item does not have unique product
    /// identifiers appropriate to its category, such as GTIN, MPN, and brand.
    /// Defaults to true, if not provided.
    #[prost(bool, optional, tag = "4")]
    pub identifier_exists: ::core::option::Option<bool>,
    /// Whether the item is a business-defined sub-API. A \[sub-API\]
    /// (<https://support.google.com/merchants/answer/6324449>) is a custom
    /// grouping of different products sold by a business for a single price.
    #[prost(bool, optional, tag = "5")]
    pub is_bundle: ::core::option::Option<bool>,
    /// Title of the item.
    #[prost(string, optional, tag = "6")]
    pub title: ::core::option::Option<::prost::alloc::string::String>,
    /// Description of the item.
    #[prost(string, optional, tag = "7")]
    pub description: ::core::option::Option<::prost::alloc::string::String>,
    /// URL directly linking to your item's page on your online store.
    #[prost(string, optional, tag = "8")]
    pub link: ::core::option::Option<::prost::alloc::string::String>,
    /// URL for the mobile-optimized version of your item's landing page.
    #[prost(string, optional, tag = "9")]
    pub mobile_link: ::core::option::Option<::prost::alloc::string::String>,
    /// URL for the canonical version of your item's landing page.
    #[prost(string, optional, tag = "10")]
    pub canonical_link: ::core::option::Option<::prost::alloc::string::String>,
    /// URL of an image of the item.
    #[prost(string, optional, tag = "11")]
    pub image_link: ::core::option::Option<::prost::alloc::string::String>,
    /// Additional URLs of images of the item.
    #[prost(string, repeated, tag = "12")]
    pub additional_image_links: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
    /// Date on which the item should expire, as specified upon insertion, in
    /// [ISO
    /// 8601](<http://en.wikipedia.org/wiki/ISO_8601>) format. The actual
    /// expiration date is exposed in `productstatuses` as
    /// [googleExpirationDate](<https://support.google.com/merchants/answer/6324499>)
    /// and might be earlier if `expirationDate` is too far in the future.
    #[prost(message, optional, tag = "16")]
    pub expiration_date: ::core::option::Option<::prost_types::Timestamp>,
    /// The date time when an offer becomes visible in search results across
    /// Google’s YouTube surfaces, in [ISO
    /// 8601](<http://en.wikipedia.org/wiki/ISO_8601>) format.
    /// See [Disclosure date](<https://support.google.com/merchants/answer/13034208>)
    /// for more information.
    #[prost(message, optional, tag = "79")]
    pub disclosure_date: ::core::option::Option<::prost_types::Timestamp>,
    /// Set to true if the item is targeted towards adults.
    #[prost(bool, optional, tag = "17")]
    pub adult: ::core::option::Option<bool>,
    /// Target [age group](<https://support.google.com/merchants/answer/6324463>) of
    /// the item.
    #[prost(string, optional, tag = "18")]
    pub age_group: ::core::option::Option<::prost::alloc::string::String>,
    /// [Availability](<https://support.google.com/merchants/answer/6324448>) status
    /// of the item. For example, "in_stock" or "out_of_stock".
    #[prost(string, optional, tag = "19")]
    pub availability: ::core::option::Option<::prost::alloc::string::String>,
    /// The day a pre-ordered product becomes available for delivery, in [ISO
    /// 8601](<http://en.wikipedia.org/wiki/ISO_8601>) format.
    #[prost(message, optional, tag = "20")]
    pub availability_date: ::core::option::Option<::prost_types::Timestamp>,
    /// [Brand](<https://support.google.com/merchants/answer/6324351>) of the item.
    /// For example, "Google".
    #[prost(string, optional, tag = "21")]
    pub brand: ::core::option::Option<::prost::alloc::string::String>,
    /// [Color](<https://support.google.com/merchants/answer/6324487>) of the item.
    /// For example, "red".
    #[prost(string, optional, tag = "22")]
    pub color: ::core::option::Option<::prost::alloc::string::String>,
    /// [Condition](<https://support.google.com/merchants/answer/6324469>) or state
    /// of the item. For example, "new" or "used".
    #[prost(string, optional, tag = "23")]
    pub condition: ::core::option::Option<::prost::alloc::string::String>,
    /// Target [gender](<https://support.google.com/merchants/answer/6324479>) of the
    /// item. For example, "male" or "female".
    #[prost(string, optional, tag = "24")]
    pub gender: ::core::option::Option<::prost::alloc::string::String>,
    /// Google's category of the item (see [Google product
    /// taxonomy](<https://support.google.com/merchants/answer/1705911>)). When
    /// querying products, this field will contain the user provided value. There
    /// is currently no way to get back the auto assigned google product
    /// categories through the API.
    #[prost(string, optional, tag = "25")]
    pub google_product_category: ::core::option::Option<::prost::alloc::string::String>,
    /// Global Trade Item Numbers
    /// ([GTIN](<https://support.google.com/merchants/answer/188494#gtin>)) of the
    /// item.
    /// You can provide up to 10 GTINs.
    ///
    /// Deprecated: Use `gtins` instead.
    #[deprecated]
    #[prost(string, repeated, tag = "26")]
    pub gtin: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
    /// Global Trade Item Numbers
    /// ([GTIN](<https://support.google.com/merchants/answer/188494#gtin>)) of the
    /// item.
    /// You can provide up to 10 GTINs.
    #[prost(string, repeated, tag = "140")]
    pub gtins: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
    /// Shared identifier for all variants of the same product.
    #[prost(string, optional, tag = "27")]
    pub item_group_id: ::core::option::Option<::prost::alloc::string::String>,
    /// The [material](<https://support.google.com/merchants/answer/6324410>) of
    /// which the item is made. For example, "Leather" or "Cotton".
    #[prost(string, optional, tag = "28")]
    pub material: ::core::option::Option<::prost::alloc::string::String>,
    /// Manufacturer Part Number
    /// ([MPN](<https://support.google.com/merchants/answer/188494#mpn>)) of the
    /// item.
    #[prost(string, optional, tag = "29")]
    pub mpn: ::core::option::Option<::prost::alloc::string::String>,
    /// The item's [pattern](<https://support.google.com/merchants/answer/6324483>).
    /// For example, polka dots.
    #[prost(string, optional, tag = "30")]
    pub pattern: ::core::option::Option<::prost::alloc::string::String>,
    /// Price of the item.
    #[prost(message, optional, tag = "31")]
    pub price: ::core::option::Option<super::super::super::r#type::Price>,
    /// Maximum retail price (MRP) of the item. Applicable to India only.
    #[prost(message, optional, tag = "139")]
    pub maximum_retail_price: ::core::option::Option<super::super::super::r#type::Price>,
    /// Number and amount of installments to pay for an item.
    #[prost(message, optional, tag = "32")]
    pub installment: ::core::option::Option<Installment>,
    /// Number of periods (months or years) and amount of payment per period
    /// for an item with an associated subscription contract.
    #[prost(message, optional, tag = "33")]
    pub subscription_cost: ::core::option::Option<SubscriptionCost>,
    /// Loyalty points that users receive after purchasing the item. Japan only.
    #[prost(message, optional, tag = "34")]
    pub loyalty_points: ::core::option::Option<LoyaltyPoints>,
    /// A list of loyalty program information that is used to surface loyalty
    /// benefits (for example, better pricing, points, etc) to the user of this
    /// item.
    #[prost(message, repeated, tag = "136")]
    pub loyalty_programs: ::prost::alloc::vec::Vec<LoyaltyProgram>,
    /// Categories of the item (formatted as in [product data
    /// specification](<https://support.google.com/merchants/answer/7052112#product_category>)).
    #[prost(string, repeated, tag = "35")]
    pub product_types: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
    /// Advertised sale price of the item.
    #[prost(message, optional, tag = "36")]
    pub sale_price: ::core::option::Option<super::super::super::r#type::Price>,
    /// Date range during which the item is on sale, see [product data
    /// specification](<https://support.google.com/merchants/answer/7052112#price_and_availability>).
    #[prost(message, optional, tag = "37")]
    pub sale_price_effective_date: ::core::option::Option<
        super::super::super::super::r#type::Interval,
    >,
    /// The quantity of the product that is available for selling on Google.
    /// Supported only for online products.
    #[prost(int64, optional, tag = "38")]
    pub sell_on_google_quantity: ::core::option::Option<i64>,
    /// The height of the product in the units provided. The value must be
    /// between
    /// 0 (exclusive) and 3000 (inclusive).
    #[prost(message, optional, tag = "119")]
    pub product_height: ::core::option::Option<ProductDimension>,
    /// The length of the product in the units provided. The value must be
    /// between 0 (exclusive) and 3000 (inclusive).
    #[prost(message, optional, tag = "120")]
    pub product_length: ::core::option::Option<ProductDimension>,
    /// The width of the product in the units provided. The value must be between
    /// 0 (exclusive) and 3000 (inclusive).
    #[prost(message, optional, tag = "121")]
    pub product_width: ::core::option::Option<ProductDimension>,
    /// The weight of the product in the units provided. The value must be
    /// between 0 (exclusive) and 2000 (inclusive).
    #[prost(message, optional, tag = "122")]
    pub product_weight: ::core::option::Option<ProductWeight>,
    /// Shipping rules.
    #[prost(message, repeated, tag = "39")]
    pub shipping: ::prost::alloc::vec::Vec<Shipping>,
    /// Conditions to be met for a product to have free shipping.
    #[prost(message, repeated, tag = "135")]
    pub free_shipping_threshold: ::prost::alloc::vec::Vec<FreeShippingThreshold>,
    /// Weight of the item for shipping.
    #[prost(message, optional, tag = "40")]
    pub shipping_weight: ::core::option::Option<ShippingWeight>,
    /// Length of the item for shipping.
    #[prost(message, optional, tag = "41")]
    pub shipping_length: ::core::option::Option<ShippingDimension>,
    /// Width of the item for shipping.
    #[prost(message, optional, tag = "42")]
    pub shipping_width: ::core::option::Option<ShippingDimension>,
    /// Height of the item for shipping.
    #[prost(message, optional, tag = "43")]
    pub shipping_height: ::core::option::Option<ShippingDimension>,
    /// Maximal product handling time (in business days).
    #[prost(int64, optional, tag = "44")]
    pub max_handling_time: ::core::option::Option<i64>,
    /// Minimal product handling time (in business days).
    #[prost(int64, optional, tag = "45")]
    pub min_handling_time: ::core::option::Option<i64>,
    /// The shipping label of the product, used to group product in account-level
    /// shipping rules.
    #[prost(string, optional, tag = "46")]
    pub shipping_label: ::core::option::Option<::prost::alloc::string::String>,
    /// The transit time label of the product, used to group product in
    /// account-level transit time tables.
    #[prost(string, optional, tag = "47")]
    pub transit_time_label: ::core::option::Option<::prost::alloc::string::String>,
    /// Size of the item. Only one value is allowed. For variants with different
    /// sizes, insert a separate product for each size with the same
    /// `itemGroupId` value, see
    /// [Size](<https://support.google.com/merchants/answer/6324492>).
    #[prost(string, optional, tag = "48")]
    pub size: ::core::option::Option<::prost::alloc::string::String>,
    /// System in which the size is specified. Recommended for apparel items.
    /// For example, "US", "UK", "DE".
    /// For more information, see
    /// [Size system](<https://support.google.com/merchants/answer/6324502>).
    #[prost(string, optional, tag = "49")]
    pub size_system: ::core::option::Option<::prost::alloc::string::String>,
    /// The cut of the item. It can be used to represent combined size types for
    /// apparel items. Maximum two of size types can be provided, see
    /// [Size type](<https://support.google.com/merchants/answer/6324497>).
    /// For example, "petite", "plus size".
    #[prost(string, repeated, tag = "50")]
    pub size_types: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
    /// Tax information.
    #[deprecated]
    #[prost(message, repeated, tag = "51")]
    pub taxes: ::prost::alloc::vec::Vec<Tax>,
    /// The [tax category](<https://support.google.com/merchants/answer/7569847>) of
    /// the product.
    #[deprecated]
    #[prost(string, optional, tag = "52")]
    pub tax_category: ::core::option::Option<::prost::alloc::string::String>,
    /// The energy efficiency class as defined in EU directive 2010/30/EU.
    #[prost(string, optional, tag = "53")]
    pub energy_efficiency_class: ::core::option::Option<::prost::alloc::string::String>,
    /// The energy efficiency class as defined in EU directive 2010/30/EU.
    #[prost(string, optional, tag = "54")]
    pub min_energy_efficiency_class: ::core::option::Option<
        ::prost::alloc::string::String,
    >,
    /// The energy efficiency class as defined in EU directive 2010/30/EU.
    #[prost(string, optional, tag = "55")]
    pub max_energy_efficiency_class: ::core::option::Option<
        ::prost::alloc::string::String,
    >,
    /// The measure and dimension of an item.
    #[prost(message, optional, tag = "56")]
    pub unit_pricing_measure: ::core::option::Option<UnitPricingMeasure>,
    /// The preference of the denominator of the unit price.
    #[prost(message, optional, tag = "57")]
    pub unit_pricing_base_measure: ::core::option::Option<UnitPricingBaseMeasure>,
    /// The number of identical products in a business-defined multipack.
    #[prost(int64, optional, tag = "58")]
    pub multipack: ::core::option::Option<i64>,
    /// Used to group items in an arbitrary way. Only for CPA%, discouraged
    /// otherwise. For more information, see
    /// [Display ads
    /// attribute](<https://support.google.com/merchants/answer/6069387>).
    #[prost(string, optional, tag = "59")]
    pub ads_grouping: ::core::option::Option<::prost::alloc::string::String>,
    /// Similar to ads_grouping, but only works on CPC.
    #[prost(string, repeated, tag = "60")]
    pub ads_labels: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
    /// Allows advertisers to override the item URL when the product is shown
    /// within the context of Product ads.
    #[prost(string, optional, tag = "61")]
    pub ads_redirect: ::core::option::Option<::prost::alloc::string::String>,
    /// Cost of goods sold. Used for gross profit reporting.
    #[prost(message, optional, tag = "62")]
    pub cost_of_goods_sold: ::core::option::Option<super::super::super::r#type::Price>,
    /// Technical specification or additional product details.
    #[prost(message, repeated, tag = "63")]
    pub product_details: ::prost::alloc::vec::Vec<ProductDetail>,
    /// Bullet points describing the most relevant [product
    /// highlights](<https://support.google.com/merchants/answer/9216100>).
    #[prost(string, repeated, tag = "64")]
    pub product_highlights: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
    /// An identifier for an item for dynamic remarketing campaigns.
    #[prost(string, optional, tag = "65")]
    pub display_ads_id: ::core::option::Option<::prost::alloc::string::String>,
    /// Advertiser-specified recommendations. For more information, see
    /// [Display ads attribute
    /// specification](<https://support.google.com/merchants/answer/6069387>).
    #[prost(string, repeated, tag = "66")]
    pub display_ads_similar_ids: ::prost::alloc::vec::Vec<
        ::prost::alloc::string::String,
    >,
    /// Title of an item for dynamic remarketing campaigns.
    #[prost(string, optional, tag = "67")]
    pub display_ads_title: ::core::option::Option<::prost::alloc::string::String>,
    /// URL directly to your item's landing page for dynamic remarketing
    /// campaigns.
    #[prost(string, optional, tag = "68")]
    pub display_ads_link: ::core::option::Option<::prost::alloc::string::String>,
    /// Offer margin for dynamic remarketing campaigns. For more information, see
    /// [Display ads
    /// attribute](<https://support.google.com/merchants/answer/6069387>).
    #[prost(double, optional, tag = "69")]
    pub display_ads_value: ::core::option::Option<f64>,
    /// The unique ID of a promotion.
    #[prost(string, repeated, tag = "70")]
    pub promotion_ids: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
    /// The [pickup](<https://support.google.com/merchants/answer/14634021>) option
    /// for the item.
    #[prost(string, optional, tag = "80")]
    pub pickup_method: ::core::option::Option<::prost::alloc::string::String>,
    /// Item store pickup timeline. For more information, see
    /// [Pickup SLA](<https://support.google.com/merchants/answer/14635400>).
    #[prost(string, optional, tag = "81")]
    pub pickup_sla: ::core::option::Option<::prost::alloc::string::String>,
    /// [Link template](<https://support.google.com/merchants/answer/13871172>) for
    /// business hosted local storefront.
    #[prost(string, optional, tag = "82")]
    pub link_template: ::core::option::Option<::prost::alloc::string::String>,
    /// [Link template](<https://support.google.com/merchants/answer/13870216>) for
    /// business hosted local storefront optimized for mobile
    /// devices.
    #[prost(string, optional, tag = "83")]
    pub mobile_link_template: ::core::option::Option<::prost::alloc::string::String>,
    /// [Custom label 0](<https://support.google.com/merchants/answer/6324473>) for
    /// custom grouping of items in a Shopping campaign.
    #[prost(string, optional, tag = "71")]
    pub custom_label_0: ::core::option::Option<::prost::alloc::string::String>,
    /// [Custom label 1](<https://support.google.com/merchants/answer/6324473>)
    /// for custom grouping of items in a Shopping campaign.
    #[prost(string, optional, tag = "72")]
    pub custom_label_1: ::core::option::Option<::prost::alloc::string::String>,
    /// [Custom label 2](<https://support.google.com/merchants/answer/6324473>)
    /// for custom grouping of items in a Shopping campaign.
    #[prost(string, optional, tag = "73")]
    pub custom_label_2: ::core::option::Option<::prost::alloc::string::String>,
    /// [Custom label 3](<https://support.google.com/merchants/answer/6324473>)
    /// for custom grouping of items in a Shopping campaign.
    #[prost(string, optional, tag = "74")]
    pub custom_label_3: ::core::option::Option<::prost::alloc::string::String>,
    /// [Custom label 4](<https://support.google.com/merchants/answer/6324473>) for
    /// custom grouping of items in a Shopping campaign.
    #[prost(string, optional, tag = "75")]
    pub custom_label_4: ::core::option::Option<::prost::alloc::string::String>,
    /// The list of destinations to include for this target (corresponds to
    /// checked check boxes in Merchant Center). Default destinations are always
    /// included unless provided in `excludedDestinations`.
    ///
    /// For more information, see
    /// [Included
    /// destination](<https://support.google.com/merchants/answer/7501026>).
    ///
    /// Note: We recommend setting destinations on datasources level for most use
    /// cases. Use this field within products to only setup exceptions.
    #[prost(string, repeated, tag = "76")]
    pub included_destinations: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
    /// The list of destinations to exclude for this target (corresponds to
    /// unchecked check boxes in Merchant Center).
    ///
    /// For more information, see
    /// [Excluded
    /// destination](<https://support.google.com/merchants/answer/6324486>).
    ///
    /// Note: We recommend setting destinations on datasources level for most use
    /// cases. Use this field within products to only setup exceptions.
    #[prost(string, repeated, tag = "77")]
    pub excluded_destinations: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
    /// List of country codes [(ISO 3166-1
    /// alpha-2)](<https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2>) to exclude the
    /// offer from Shopping Ads destination. Countries from this list are removed
    /// from countries configured in data source settings.
    #[prost(string, repeated, tag = "78")]
    pub shopping_ads_excluded_countries: ::prost::alloc::vec::Vec<
        ::prost::alloc::string::String,
    >,
    /// Required for multi-seller accounts. Use this attribute if you're a
    /// marketplace uploading products for various sellers to your multi-seller
    /// account.
    #[prost(string, optional, tag = "1")]
    pub external_seller_id: ::core::option::Option<::prost::alloc::string::String>,
    /// Publication of this item will be temporarily
    /// [paused](<https://support.google.com/merchants/answer/11909930>).
    #[prost(string, optional, tag = "13")]
    pub pause: ::core::option::Option<::prost::alloc::string::String>,
    /// Additional URLs of lifestyle images of the item, used to explicitly
    /// identify images that showcase your item in a real-world context. See the
    /// [Help Center article](<https://support.google.com/merchants/answer/9103186>)
    /// for more information.
    #[prost(string, repeated, tag = "14")]
    pub lifestyle_image_links: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
    /// Extra fields to export to the Cloud Retail program.
    #[prost(message, repeated, tag = "84")]
    pub cloud_export_additional_properties: ::prost::alloc::vec::Vec<
        CloudExportAdditionalProperties,
    >,
    /// URL of the 3D image of the item. See the
    /// [Help Center article](<https://support.google.com/merchants/answer/13674896>)
    /// for more information.
    #[prost(string, optional, tag = "130")]
    pub virtual_model_link: ::core::option::Option<::prost::alloc::string::String>,
    /// Product Certifications, for example for energy efficiency labeling of
    /// products recorded in the [EU EPREL](<https://eprel.ec.europa.eu/screen/home>)
    /// database. See the [Help
    /// Center](<https://support.google.com/merchants/answer/13528839>)
    /// article for more information.
    #[prost(message, repeated, tag = "123")]
    pub certifications: ::prost::alloc::vec::Vec<Certification>,
    /// Structured title, for algorithmically (AI)-generated titles.
    #[prost(message, optional, tag = "132")]
    pub structured_title: ::core::option::Option<ProductStructuredTitle>,
    /// Structured description, for algorithmically (AI)-generated descriptions.
    #[prost(message, optional, tag = "133")]
    pub structured_description: ::core::option::Option<ProductStructuredDescription>,
    /// A safeguard in the \[automated discounts\]
    /// (<https://support.google.com/merchants/answer/10295759>) and
    /// "Dynamic Promotions"
    /// (<https://support.google.com/merchants/answer/13949249>) projects,
    /// ensuring that discounts on business offers do not fall below this value,
    /// thereby preserving the offer's value and profitability.
    #[prost(message, optional, tag = "124")]
    pub auto_pricing_min_price: ::core::option::Option<
        super::super::super::r#type::Price,
    >,
    /// The list of sustainability incentive programs.
    #[prost(message, repeated, tag = "138")]
    pub sustainability_incentives: ::prost::alloc::vec::Vec<
        ProductSustainabilityIncentive,
    >,
}
/// The Tax of the product.
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct Tax {
    /// The percentage of tax rate that applies to the item price.
    #[prost(double, tag = "1")]
    pub rate: f64,
    /// The country within which the item is taxed, specified as a [CLDR
    /// territory
    /// code](<http://www.unicode.org/repos/cldr/tags/latest/common/main/en.xml>).
    #[prost(string, tag = "2")]
    pub country: ::prost::alloc::string::String,
    /// The geographic region to which the tax rate applies.
    #[prost(string, tag = "3")]
    pub region: ::prost::alloc::string::String,
    /// Set to true if tax is charged on shipping.
    #[prost(bool, tag = "4")]
    pub tax_ship: bool,
    /// The numeric ID of a location that the tax rate applies to as defined in
    /// the [AdWords
    /// API](<https://developers.google.com/adwords/api/docs/appendix/geotargeting>).
    #[prost(int64, tag = "5")]
    pub location_id: i64,
    /// The postal code range that the tax rate applies to, represented by
    /// a ZIP code, a ZIP code prefix using * wildcard, a range between two ZIP
    /// codes or two ZIP code prefixes of equal length.
    /// Examples: 94114, 94\*, 94002-95460, 94\*-95\*.
    #[prost(string, tag = "6")]
    pub postal_code: ::prost::alloc::string::String,
}
/// The ShippingWeight of the product.
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ShippingWeight {
    /// The weight of the product used to calculate the shipping cost of the
    /// item.
    #[prost(double, tag = "1")]
    pub value: f64,
    /// The unit of value.
    #[prost(string, tag = "2")]
    pub unit: ::prost::alloc::string::String,
}
/// The ShippingDimension of the product.
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ShippingDimension {
    /// The dimension of the product used to calculate the shipping cost of the
    /// item.
    #[prost(double, tag = "1")]
    pub value: f64,
    /// The unit of value.
    #[prost(string, tag = "2")]
    pub unit: ::prost::alloc::string::String,
}
/// The UnitPricingBaseMeasure of the product.
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct UnitPricingBaseMeasure {
    /// The denominator of the unit price.
    #[prost(int64, tag = "1")]
    pub value: i64,
    /// The unit of the denominator.
    #[prost(string, tag = "2")]
    pub unit: ::prost::alloc::string::String,
}
/// The UnitPricingMeasure of the product.
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct UnitPricingMeasure {
    /// The measure of an item.
    #[prost(double, tag = "1")]
    pub value: f64,
    /// The unit of the measure.
    #[prost(string, tag = "2")]
    pub unit: ::prost::alloc::string::String,
}
/// The SubscriptionCost of the product.
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct SubscriptionCost {
    /// The type of subscription period.
    /// Supported values are:
    ///
    /// * "`month`"
    /// * "`year`"
    #[prost(enumeration = "SubscriptionPeriod", tag = "1")]
    pub period: i32,
    /// The number of subscription periods the buyer has to pay.
    #[prost(int64, tag = "2")]
    pub period_length: i64,
    /// The amount the buyer has to pay per subscription period.
    #[prost(message, optional, tag = "3")]
    pub amount: ::core::option::Option<super::super::super::r#type::Price>,
}
/// A message that represents installment.
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct Installment {
    /// The number of installments the buyer has to pay.
    #[prost(int64, tag = "1")]
    pub months: i64,
    /// The amount the buyer has to pay per month.
    #[prost(message, optional, tag = "2")]
    pub amount: ::core::option::Option<super::super::super::r#type::Price>,
    /// The up-front down payment amount the buyer has to pay.
    #[prost(message, optional, tag = "3")]
    pub downpayment: ::core::option::Option<super::super::super::r#type::Price>,
    /// Type of installment payments.
    /// Supported values are:
    ///
    /// * "`finance`"
    /// * "`lease`"
    #[prost(string, optional, tag = "4")]
    pub credit_type: ::core::option::Option<::prost::alloc::string::String>,
}
/// A message that represents loyalty points.
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct LoyaltyPoints {
    /// Name of loyalty points program. It is recommended to limit the name to
    /// 12 full-width characters or 24 Roman characters.
    #[prost(string, tag = "1")]
    pub name: ::prost::alloc::string::String,
    /// The retailer's loyalty points in absolute value.
    #[prost(int64, tag = "2")]
    pub points_value: i64,
    /// The ratio of a point when converted to currency. Google assumes currency
    /// based on Merchant Center settings. If ratio is left out, it defaults to
    /// 1.0.
    #[prost(double, tag = "3")]
    pub ratio: f64,
}
/// A message that represents loyalty program.
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct LoyaltyProgram {
    /// The label of the loyalty program. This is an internal label that uniquely
    /// identifies the relationship between a business entity and a loyalty
    /// program entity. The label must be provided so that the system can associate
    /// the assets below (for example, price and points) with a business. The
    /// corresponding program must be linked to the Merchant Center account.
    #[prost(string, optional, tag = "1")]
    pub program_label: ::core::option::Option<::prost::alloc::string::String>,
    /// The label of the tier within the loyalty program.
    /// Must match one of the labels within the program.
    #[prost(string, optional, tag = "2")]
    pub tier_label: ::core::option::Option<::prost::alloc::string::String>,
    /// The price for members of the given tier, that is, the instant discount
    /// price. Must be smaller or equal to the regular price.
    #[prost(message, optional, tag = "3")]
    pub price: ::core::option::Option<super::super::super::r#type::Price>,
    /// The cashback that can be used for future purchases.
    #[prost(message, optional, tag = "4")]
    pub cashback_for_future_use: ::core::option::Option<
        super::super::super::r#type::Price,
    >,
    /// The amount of loyalty points earned on a purchase.
    #[prost(int64, optional, tag = "5")]
    pub loyalty_points: ::core::option::Option<i64>,
    /// A date range during which the item is eligible for member price. If not
    /// specified, the member price is always applicable. The date range is
    /// represented by a pair of ISO 8601 dates separated by a space,
    /// comma, or slash.
    #[prost(message, optional, tag = "6")]
    pub member_price_effective_date: ::core::option::Option<
        super::super::super::super::r#type::Interval,
    >,
    /// The label of the shipping benefit. If the field has value, this offer has
    /// loyalty shipping benefit. If the field value isn't provided, the item is
    /// not eligible for loyalty shipping for the given loyalty tier.
    #[prost(string, optional, tag = "7")]
    pub shipping_label: ::core::option::Option<::prost::alloc::string::String>,
}
/// The Shipping of the product.
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct Shipping {
    /// Fixed shipping price, represented as a number.
    #[prost(message, optional, tag = "1")]
    pub price: ::core::option::Option<super::super::super::r#type::Price>,
    /// The [CLDR territory
    /// code](<http://www.unicode.org/repos/cldr/tags/latest/common/main/en.xml>)
    /// of the country to which an item will ship.
    #[prost(string, tag = "2")]
    pub country: ::prost::alloc::string::String,
    /// The geographic region to which a shipping rate applies.
    /// See [region](<https://support.google.com/merchants/answer/6324484>) for more
    /// information.
    #[prost(string, tag = "3")]
    pub region: ::prost::alloc::string::String,
    /// A free-form description of the service class or delivery speed.
    #[prost(string, tag = "4")]
    pub service: ::prost::alloc::string::String,
    /// The numeric ID of a location that the shipping rate applies to as
    /// defined in the [AdWords
    /// API](<https://developers.google.com/adwords/api/docs/appendix/geotargeting>).
    #[prost(int64, tag = "5")]
    pub location_id: i64,
    /// The location where the shipping is applicable, represented by a
    /// location group name.
    #[prost(string, tag = "6")]
    pub location_group_name: ::prost::alloc::string::String,
    /// The postal code range that the shipping rate applies to, represented by
    /// a postal code, a postal code prefix followed by a * wildcard, a range
    /// between two postal codes or two postal code prefixes of equal length.
    #[prost(string, tag = "7")]
    pub postal_code: ::prost::alloc::string::String,
    /// Minimum handling time (inclusive) between when the order is received and
    /// shipped in business days. 0 means that the order is shipped on the same
    /// day as it is received if it happens before the cut-off time.
    /// \[minHandlingTime\]\[google.shopping.merchant.products.v1beta.Shipping.min_handling_time\]
    /// can only be present together with
    /// \[maxHandlingTime\]\[google.shopping.merchant.products.v1beta.Shipping.max_handling_time\];
    /// but it is not required if
    /// \[maxHandlingTime\]\[google.shopping.merchant.products.v1beta.Shipping.max_handling_time\]
    /// is present.
    #[prost(int64, optional, tag = "8")]
    pub min_handling_time: ::core::option::Option<i64>,
    /// Maximum handling time (inclusive) between when the order is received and
    /// shipped in business days. 0 means that the order is shipped on the same
    /// day as it is received if it happens before the cut-off time. Both
    /// \[maxHandlingTime\]\[google.shopping.merchant.products.v1beta.Shipping.max_handling_time\]
    /// and
    /// \[maxTransitTime\]\[google.shopping.merchant.products.v1beta.Shipping.max_transit_time\]
    /// are required if providing shipping speeds.
    /// \[minHandlingTime\]\[google.shopping.merchant.products.v1beta.Shipping.min_handling_time\]
    /// is optional if
    /// \[maxHandlingTime\]\[google.shopping.merchant.products.v1beta.Shipping.max_handling_time\]
    /// is present.
    #[prost(int64, optional, tag = "9")]
    pub max_handling_time: ::core::option::Option<i64>,
    /// Minimum transit time (inclusive) between when the order has shipped and
    /// when it is delivered in business days. 0 means that the order is
    /// delivered on the same day as it ships.
    /// \[minTransitTime\]\[google.shopping.merchant.products.v1beta.Shipping.min_transit_time\]
    /// can only be present together with
    /// \[maxTransitTime\]\[google.shopping.merchant.products.v1beta.Shipping.max_transit_time\];
    /// but it is not required if
    /// \[maxTransitTime\]\[google.shopping.merchant.products.v1beta.Shipping.max_transit_time\]
    /// is present.
    #[prost(int64, optional, tag = "10")]
    pub min_transit_time: ::core::option::Option<i64>,
    /// Maximum transit time (inclusive) between when the order has shipped and
    /// when it is delivered in business days. 0 means that the order is
    /// delivered on the same day as it ships. Both
    /// \[maxHandlingTime\]\[google.shopping.merchant.products.v1beta.Shipping.max_handling_time\]
    /// and
    /// \[maxTransitTime\]\[google.shopping.merchant.products.v1beta.Shipping.max_transit_time\]
    /// are required if providing shipping speeds.
    /// \[minTransitTime\]\[google.shopping.merchant.products.v1beta.Shipping.min_transit_time\]
    /// is optional if
    /// \[maxTransitTime\]\[google.shopping.merchant.products.v1beta.Shipping.max_transit_time\]
    /// is present.
    #[prost(int64, optional, tag = "11")]
    pub max_transit_time: ::core::option::Option<i64>,
}
/// Conditions to be met for a product to have free shipping.
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct FreeShippingThreshold {
    /// The [CLDR territory
    /// code](<http://www.unicode.org/repos/cldr/tags/latest/common/main/en.xml>)
    /// of the country to which an item will ship.
    #[prost(string, optional, tag = "1")]
    pub country: ::core::option::Option<::prost::alloc::string::String>,
    /// The minimum product price for the shipping cost to become free. Represented
    /// as a number.
    #[prost(message, optional, tag = "2")]
    pub price_threshold: ::core::option::Option<super::super::super::r#type::Price>,
}
/// The product details.
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct ProductDetail {
    /// The section header used to group a set of product details.
    #[prost(string, tag = "1")]
    pub section_name: ::prost::alloc::string::String,
    /// The name of the product detail.
    #[prost(string, tag = "2")]
    pub attribute_name: ::prost::alloc::string::String,
    /// The value of the product detail.
    #[prost(string, tag = "3")]
    pub attribute_value: ::prost::alloc::string::String,
}
/// Product
/// [certification](<https://support.google.com/merchants/answer/13528839>),
/// initially introduced for EU energy efficiency labeling compliance using the
/// EU EPREL database.
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct Certification {
    /// The certification authority, for example "European_Commission".
    /// Maximum length is 2000 characters.
    #[prost(string, optional, tag = "1")]
    pub certification_authority: ::core::option::Option<::prost::alloc::string::String>,
    /// The name of the certification, for example "EPREL".
    /// Maximum length is 2000 characters.
    #[prost(string, optional, tag = "2")]
    pub certification_name: ::core::option::Option<::prost::alloc::string::String>,
    /// The certification code.
    /// Maximum length is 2000 characters.
    #[prost(string, optional, tag = "3")]
    pub certification_code: ::core::option::Option<::prost::alloc::string::String>,
    /// The certification value (also known as class, level or grade), for example
    /// "A+", "C", "gold".
    /// Maximum length is 2000 characters.
    #[prost(string, optional, tag = "4")]
    pub certification_value: ::core::option::Option<::prost::alloc::string::String>,
}
/// Structured title, for algorithmically (AI)-generated titles.
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct ProductStructuredTitle {
    /// The digital source type, for example "trained_algorithmic_media".
    /// Following [IPTC](<https://cv.iptc.org/newscodes/digitalsourcetype>).
    /// Maximum length is 40 characters.
    #[prost(string, optional, tag = "1")]
    pub digital_source_type: ::core::option::Option<::prost::alloc::string::String>,
    /// The title text
    /// Maximum length is 150 characters
    #[prost(string, optional, tag = "2")]
    pub content: ::core::option::Option<::prost::alloc::string::String>,
}
/// Structured description, for algorithmically (AI)-generated descriptions.
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct ProductStructuredDescription {
    /// The digital source type, for example "trained_algorithmic_media".
    /// Following [IPTC](<https://cv.iptc.org/newscodes/digitalsourcetype>).
    /// Maximum length is 40 characters.
    #[prost(string, optional, tag = "1")]
    pub digital_source_type: ::core::option::Option<::prost::alloc::string::String>,
    /// The description text
    /// Maximum length is 5000 characters
    #[prost(string, optional, tag = "2")]
    pub content: ::core::option::Option<::prost::alloc::string::String>,
}
/// The dimension of the product.
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ProductDimension {
    /// Required. The dimension value represented as a number. The value can have a
    /// maximum precision of four decimal places.
    #[prost(double, tag = "1")]
    pub value: f64,
    /// Required. The dimension units.
    /// Acceptable values are:
    ///
    /// * "`in`"
    /// * "`cm`"
    #[prost(string, tag = "2")]
    pub unit: ::prost::alloc::string::String,
}
/// The weight of the product.
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ProductWeight {
    /// Required. The weight represented as a number. The weight can have a maximum
    /// precision of four decimal places.
    #[prost(double, tag = "1")]
    pub value: f64,
    /// Required. The weight unit.
    /// Acceptable values are:
    ///
    /// * "`g`"
    /// * "`kg`"
    /// * "`oz`"
    /// * "`lb`"
    #[prost(string, tag = "2")]
    pub unit: ::prost::alloc::string::String,
}
/// The status of a product, data validation issues, that is, information about
/// a product computed asynchronously.
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ProductStatus {
    /// The intended destinations for the product.
    #[prost(message, repeated, tag = "3")]
    pub destination_statuses: ::prost::alloc::vec::Vec<
        product_status::DestinationStatus,
    >,
    /// A list of all issues associated with the product.
    #[prost(message, repeated, tag = "4")]
    pub item_level_issues: ::prost::alloc::vec::Vec<product_status::ItemLevelIssue>,
    /// Date on which the item has been created, in [ISO
    /// 8601](<http://en.wikipedia.org/wiki/ISO_8601>) format.
    #[prost(message, optional, tag = "5")]
    pub creation_date: ::core::option::Option<::prost_types::Timestamp>,
    /// Date on which the item has been last updated, in [ISO
    /// 8601](<http://en.wikipedia.org/wiki/ISO_8601>) format.
    #[prost(message, optional, tag = "6")]
    pub last_update_date: ::core::option::Option<::prost_types::Timestamp>,
    /// Date on which the item expires, in [ISO
    /// 8601](<http://en.wikipedia.org/wiki/ISO_8601>) format.
    #[prost(message, optional, tag = "7")]
    pub google_expiration_date: ::core::option::Option<::prost_types::Timestamp>,
}
/// Nested message and enum types in `ProductStatus`.
pub mod product_status {
    /// The destination status of the product status.
    #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
    pub struct DestinationStatus {
        /// The name of the reporting context.
        #[prost(
            enumeration = "super::super::super::super::r#type::reporting_context::ReportingContextEnum",
            tag = "1"
        )]
        pub reporting_context: i32,
        /// List of country codes (ISO 3166-1 alpha-2) where the offer is approved.
        #[prost(string, repeated, tag = "2")]
        pub approved_countries: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
        /// List of country codes (ISO 3166-1 alpha-2) where the offer is pending
        /// approval.
        #[prost(string, repeated, tag = "3")]
        pub pending_countries: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
        /// List of country codes (ISO 3166-1 alpha-2) where the offer is
        /// disapproved.
        #[prost(string, repeated, tag = "4")]
        pub disapproved_countries: ::prost::alloc::vec::Vec<
            ::prost::alloc::string::String,
        >,
    }
    /// The ItemLevelIssue of the product status.
    #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
    pub struct ItemLevelIssue {
        /// The error code of the issue.
        #[prost(string, tag = "1")]
        pub code: ::prost::alloc::string::String,
        /// How this issue affects serving of the offer.
        #[prost(enumeration = "item_level_issue::Severity", tag = "2")]
        pub severity: i32,
        /// Whether the issue can be resolved by the business.
        #[prost(string, tag = "3")]
        pub resolution: ::prost::alloc::string::String,
        /// The attribute's name, if the issue is caused by a single attribute.
        #[prost(string, tag = "4")]
        pub attribute: ::prost::alloc::string::String,
        /// The reporting context the issue applies to.
        #[prost(
            enumeration = "super::super::super::super::r#type::reporting_context::ReportingContextEnum",
            tag = "5"
        )]
        pub reporting_context: i32,
        /// A short issue description in English.
        #[prost(string, tag = "6")]
        pub description: ::prost::alloc::string::String,
        /// A detailed issue description in English.
        #[prost(string, tag = "7")]
        pub detail: ::prost::alloc::string::String,
        /// The URL of a web page to help with resolving this issue.
        #[prost(string, tag = "8")]
        pub documentation: ::prost::alloc::string::String,
        /// List of country codes (ISO 3166-1 alpha-2) where issue applies to the
        /// offer.
        #[prost(string, repeated, tag = "9")]
        pub applicable_countries: ::prost::alloc::vec::Vec<
            ::prost::alloc::string::String,
        >,
    }
    /// Nested message and enum types in `ItemLevelIssue`.
    pub mod item_level_issue {
        /// How the issue affects the serving of the product.
        #[derive(
            Clone,
            Copy,
            Debug,
            PartialEq,
            Eq,
            Hash,
            PartialOrd,
            Ord,
            ::prost::Enumeration
        )]
        #[repr(i32)]
        pub enum Severity {
            /// Not specified.
            Unspecified = 0,
            /// This issue represents a warning and does not have a direct affect
            /// on the product.
            NotImpacted = 1,
            /// The product is demoted and most likely have limited performance
            /// in search results
            Demoted = 2,
            /// Issue disapproves the product.
            Disapproved = 3,
        }
        impl Severity {
            /// String value of the enum field names used in the ProtoBuf definition.
            ///
            /// The values are not transformed in any way and thus are considered stable
            /// (if the ProtoBuf definition does not change) and safe for programmatic use.
            pub fn as_str_name(&self) -> &'static str {
                match self {
                    Self::Unspecified => "SEVERITY_UNSPECIFIED",
                    Self::NotImpacted => "NOT_IMPACTED",
                    Self::Demoted => "DEMOTED",
                    Self::Disapproved => "DISAPPROVED",
                }
            }
            /// Creates an enum from field names used in the ProtoBuf definition.
            pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
                match value {
                    "SEVERITY_UNSPECIFIED" => Some(Self::Unspecified),
                    "NOT_IMPACTED" => Some(Self::NotImpacted),
                    "DEMOTED" => Some(Self::Demoted),
                    "DISAPPROVED" => Some(Self::Disapproved),
                    _ => None,
                }
            }
        }
    }
}
/// Product property for the Cloud Retail API.
/// For example, properties for a TV product could be "Screen-Resolution" or
/// "Screen-Size".
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct CloudExportAdditionalProperties {
    /// Name of the given property. For example,
    /// "Screen-Resolution" for a TV product. Maximum string size is 256
    /// characters.
    #[prost(string, optional, tag = "1")]
    pub property_name: ::core::option::Option<::prost::alloc::string::String>,
    /// Text value of the given property. For example,
    /// "8K(UHD)" could be a text value for a TV product. Maximum
    /// repeatedness of this value is 400. Values are stored in an arbitrary but
    /// consistent order. Maximum string size is 256 characters.
    #[prost(string, repeated, tag = "2")]
    pub text_value: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
    /// Boolean value of the given property. For example for a TV product,
    /// "True" or "False" if the screen is UHD.
    #[prost(bool, optional, tag = "3")]
    pub bool_value: ::core::option::Option<bool>,
    /// Integer values of the given property. For example, 1080 for a TV
    /// product's Screen Resolution. Maximum repeatedness of this value
    /// is 400. Values are stored in an arbitrary but consistent order.
    #[prost(int64, repeated, tag = "4")]
    pub int_value: ::prost::alloc::vec::Vec<i64>,
    /// Float values of the given property. For example for a TV product
    /// 1.2345. Maximum repeatedness of this value is 400. Values
    /// are stored in an arbitrary but consistent order.
    #[prost(float, repeated, tag = "5")]
    pub float_value: ::prost::alloc::vec::Vec<f32>,
    /// Minimum float value of the given property. For example for a TV
    /// product 1.00.
    #[prost(float, optional, tag = "6")]
    pub min_value: ::core::option::Option<f32>,
    /// Maximum float value of the given property. For example for a TV
    /// product 100.00.
    #[prost(float, optional, tag = "7")]
    pub max_value: ::core::option::Option<f32>,
    /// Unit of the given property. For example, "Pixels" for a TV product. Maximum
    /// string size is 256B.
    #[prost(string, optional, tag = "8")]
    pub unit_code: ::core::option::Option<::prost::alloc::string::String>,
}
/// Information regarding sustainability-related incentive programs such as
/// rebates or tax relief.
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ProductSustainabilityIncentive {
    /// Sustainability incentive program.
    #[prost(enumeration = "product_sustainability_incentive::Type", optional, tag = "1")]
    pub r#type: ::core::option::Option<i32>,
    /// Sustainability incentive value.
    #[prost(oneof = "product_sustainability_incentive::Value", tags = "2, 3")]
    pub value: ::core::option::Option<product_sustainability_incentive::Value>,
}
/// Nested message and enum types in `ProductSustainabilityIncentive`.
pub mod product_sustainability_incentive {
    /// Types of supported sustainability incentive programs.
    #[derive(
        Clone,
        Copy,
        Debug,
        PartialEq,
        Eq,
        Hash,
        PartialOrd,
        Ord,
        ::prost::Enumeration
    )]
    #[repr(i32)]
    pub enum Type {
        /// Unspecified or unknown sustainability incentive type.
        Unspecified = 0,
        /// Program offering tax liability reductions for electric vehicles and, in
        /// some countries, plug-in hybrids. These reductions can be based on a
        /// specific amount or a percentage of the sale price.
        EvTaxCredit = 1,
        /// A subsidy program, often called an environmental bonus, provides a
        /// purchase grant for electric vehicles and, in some countries, plug-in
        /// hybrids. The grant amount may be a fixed sum or a percentage of the sale
        /// price.
        EvPriceDiscount = 2,
    }
    impl Type {
        /// String value of the enum field names used in the ProtoBuf definition.
        ///
        /// The values are not transformed in any way and thus are considered stable
        /// (if the ProtoBuf definition does not change) and safe for programmatic use.
        pub fn as_str_name(&self) -> &'static str {
            match self {
                Self::Unspecified => "TYPE_UNSPECIFIED",
                Self::EvTaxCredit => "EV_TAX_CREDIT",
                Self::EvPriceDiscount => "EV_PRICE_DISCOUNT",
            }
        }
        /// Creates an enum from field names used in the ProtoBuf definition.
        pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
            match value {
                "TYPE_UNSPECIFIED" => Some(Self::Unspecified),
                "EV_TAX_CREDIT" => Some(Self::EvTaxCredit),
                "EV_PRICE_DISCOUNT" => Some(Self::EvPriceDiscount),
                _ => None,
            }
        }
    }
    /// Sustainability incentive value.
    #[derive(Clone, PartialEq, ::prost::Oneof)]
    pub enum Value {
        /// The fixed amount of the incentive.
        #[prost(message, tag = "2")]
        Amount(super::super::super::super::r#type::Price),
        /// The percentage of the sale price that the incentive is applied to.
        #[prost(double, tag = "3")]
        Percentage(f64),
    }
}
/// Information regarding Automated Discounts.
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct AutomatedDiscounts {
    /// The price prior to the application of the first price reduction.
    /// Absent if the information about the prior price of the product is not
    /// available.
    #[prost(message, optional, tag = "1")]
    pub prior_price: ::core::option::Option<super::super::super::r#type::Price>,
    /// The price prior to the application of consecutive price reductions.
    /// Absent if the information about the prior price of the product is not
    /// available.
    #[prost(message, optional, tag = "2")]
    pub prior_price_progressive: ::core::option::Option<
        super::super::super::r#type::Price,
    >,
    /// The current sale price for products with a price optimized using Google
    /// Automated Discounts (GAD). Absent if the information about the GAD_price of
    /// the product is not available.
    #[prost(message, optional, tag = "3")]
    pub gad_price: ::core::option::Option<super::super::super::r#type::Price>,
}
/// The subscription period of the product.
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
#[repr(i32)]
pub enum SubscriptionPeriod {
    /// Indicates that the subscription period is unspecified.
    Unspecified = 0,
    /// Indicates that the subscription period is month.
    Month = 1,
    /// Indicates that the subscription period is year.
    Year = 2,
}
impl SubscriptionPeriod {
    /// String value of the enum field names used in the ProtoBuf definition.
    ///
    /// The values are not transformed in any way and thus are considered stable
    /// (if the ProtoBuf definition does not change) and safe for programmatic use.
    pub fn as_str_name(&self) -> &'static str {
        match self {
            Self::Unspecified => "SUBSCRIPTION_PERIOD_UNSPECIFIED",
            Self::Month => "MONTH",
            Self::Year => "YEAR",
        }
    }
    /// Creates an enum from field names used in the ProtoBuf definition.
    pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
        match value {
            "SUBSCRIPTION_PERIOD_UNSPECIFIED" => Some(Self::Unspecified),
            "MONTH" => Some(Self::Month),
            "YEAR" => Some(Self::Year),
            _ => None,
        }
    }
}
/// This resource represents input data you submit for a product, not the
/// processed product that you see in Merchant Center, in Shopping ads, or
/// across Google surfaces. Product inputs, rules and supplemental data source
/// data are combined to create the processed
/// \[Product\]\[google.shopping.merchant.products.v1beta.Product\]. For more
/// information, see [Manage products](/merchant/api/guides/products/overview).
///
/// Required product input attributes to pass data validation checks are
/// primarily defined in the [Products Data
/// Specification](<https://support.google.com/merchants/answer/188494>).
///
/// The following attributes are required:
/// \[feedLabel\]\[google.shopping.merchant.products.v1beta.Product.feed_label\],
/// \[contentLanguage\]\[google.shopping.merchant.products.v1beta.Product.content_language\]
/// and \[offerId\]\[google.shopping.merchant.products.v1beta.Product.offer_id\].
///
/// After inserting, updating, or deleting a product input, it may take several
/// minutes before the processed product can be retrieved.
///
/// All fields in the product input and its sub-messages match the English name
/// of their corresponding attribute in the [Products Data
/// Specification](<https://support.google.com/merchants/answer/188494>) with
/// [some exceptions](<https://support.google.com/merchants/answer/7052112>).
/// The following reference documentation lists the field names in the
/// **camelCase** casing style while the Products Data Specification lists the
/// names in the **snake_case** casing style.
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ProductInput {
    /// Identifier. The name of the product input.
    /// Format: `accounts/{account}/productInputs/{productinput}`
    /// where the last section `productinput` consists of 4 parts:
    /// `channel~content_language~feed_label~offer_id`
    /// example for product input name is
    /// `accounts/123/productInputs/online~en~US~sku123`
    #[prost(string, tag = "1")]
    pub name: ::prost::alloc::string::String,
    /// Output only. The name of the processed product.
    /// Format: `accounts/{account}/products/{product}`
    #[prost(string, tag = "2")]
    pub product: ::prost::alloc::string::String,
    /// Immutable. The
    /// [channel](<https://support.google.com/merchants/answer/7361332>) of the
    /// product.
    #[prost(
        enumeration = "super::super::super::r#type::channel::ChannelEnum",
        tag = "3"
    )]
    pub channel: i32,
    /// Required. Immutable. Your unique identifier for the product. This is the
    /// same for the product input and processed product. Leading and trailing
    /// whitespaces are stripped and multiple whitespaces are replaced by a single
    /// whitespace upon submission. See the [products data
    /// specification](<https://support.google.com/merchants/answer/188494#id>) for
    /// details.
    #[prost(string, tag = "4")]
    pub offer_id: ::prost::alloc::string::String,
    /// Required. Immutable. The two-letter [ISO
    /// 639-1](<http://en.wikipedia.org/wiki/ISO_639-1>) language code for the
    /// product.
    #[prost(string, tag = "5")]
    pub content_language: ::prost::alloc::string::String,
    /// Required. Immutable. The label that lets you categorize and identify your
    /// products. The maximum allowed characters are 20, and the supported
    /// characters are `A-Z`, `0-9`, hyphen, and underscore. The feed label must
    /// not include any spaces. For more information, see [Using feed
    /// labels](//support.google.com/merchants/answer/14994087).
    #[prost(string, tag = "6")]
    pub feed_label: ::prost::alloc::string::String,
    /// Optional. Immutable. Represents the existing version (freshness) of the
    /// product, which can be used to preserve the right order when multiple
    /// updates are done at the same time.
    ///
    /// If set, the insertion is prevented when version number is lower than
    /// the current version number of the existing product. Re-insertion (for
    /// example, product refresh after 30 days) can be performed with the current
    /// `version_number`.
    ///
    /// Only supported for insertions into primary data sources.
    /// Do not set this field for updates.
    /// Do not set this field for insertions into supplemental data sources.
    ///
    /// If the operation is prevented, the aborted exception will be
    /// thrown.
    #[prost(int64, optional, tag = "7")]
    pub version_number: ::core::option::Option<i64>,
    /// Optional. A list of product attributes.
    #[prost(message, optional, tag = "8")]
    pub attributes: ::core::option::Option<Attributes>,
    /// Optional. A list of custom (merchant-provided) attributes. It can also be
    /// used for submitting any attribute of the data specification in its generic
    /// form (for example,
    /// `{ "name": "size type", "value": "regular" }`).
    /// This is useful for submitting attributes not explicitly exposed by the
    /// API.
    /// Maximum allowed number of characters for each
    /// custom attribute is 10240 (represents sum of characters for name and
    /// value). Maximum 2500 custom attributes can be set per product, with total
    /// size of 102.4kB. Underscores in custom attribute names are replaced by
    /// spaces upon insertion.
    #[prost(message, repeated, tag = "9")]
    pub custom_attributes: ::prost::alloc::vec::Vec<
        super::super::super::r#type::CustomAttribute,
    >,
}
/// Request message for the InsertProductInput method.
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct InsertProductInputRequest {
    /// Required. The account where this product will be inserted.
    /// Format: `accounts/{account}`
    #[prost(string, tag = "1")]
    pub parent: ::prost::alloc::string::String,
    /// Required. The product input to insert.
    #[prost(message, optional, tag = "2")]
    pub product_input: ::core::option::Option<ProductInput>,
    /// Required. The primary or supplemental product data source name. If the
    /// product already exists and data source provided is different, then the
    /// product will be moved to a new data source. For more information, see
    /// [Overview of Data sources
    /// sub-API](/merchant/api/guides/data-sources/overview).
    ///
    /// Only API data sources are supported.
    ///
    /// Format: `accounts/{account}/dataSources/{datasource}`. For example,
    /// `accounts/123456/dataSources/104628`.
    #[prost(string, tag = "3")]
    pub data_source: ::prost::alloc::string::String,
}
/// Request message for the UpdateProductInput method.
/// The product (primary input) must exist for the update to succeed.
/// If the update is for a primary product input, the existing primary product
/// input must be from the same data source.
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct UpdateProductInputRequest {
    /// Required. The product input resource to update. Information you submit will
    /// be applied to the processed product as well.
    #[prost(message, optional, tag = "1")]
    pub product_input: ::core::option::Option<ProductInput>,
    /// Optional. The list of product attributes to be updated.
    ///
    /// If the update mask is omitted, then it is treated as implied field mask
    /// equivalent to all fields that are populated (have a non-empty value).
    ///
    /// Attributes specified in the update mask without a value specified in the
    /// body will be deleted from the product.
    ///
    /// Update mask can only be specified for top level fields in
    /// attributes and custom attributes.
    ///
    /// To specify the update mask for custom attributes you need to add the
    /// `custom_attribute.` prefix.
    ///
    /// Providing special "\*" value for full product replacement is not supported.
    #[prost(message, optional, tag = "2")]
    pub update_mask: ::core::option::Option<::prost_types::FieldMask>,
    /// Required. The primary or supplemental product data source where
    /// `data_source` name identifies the product input to be updated.
    ///
    /// Only API data sources are supported.
    ///
    /// Format: `accounts/{account}/dataSources/{datasource}`. For example,
    /// `accounts/123456/dataSources/104628`.
    #[prost(string, tag = "3")]
    pub data_source: ::prost::alloc::string::String,
}
/// Request message for the DeleteProductInput method.
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct DeleteProductInputRequest {
    /// Required. The name of the product input resource to delete.
    /// Format: `accounts/{account}/productInputs/{product}`
    /// where the last section `product` consists of 4 parts:
    /// `channel~content_language~feed_label~offer_id`
    /// example for product name is
    /// `accounts/123/productInputs/online~en~US~sku123`.
    #[prost(string, tag = "1")]
    pub name: ::prost::alloc::string::String,
    /// Required. The primary or supplemental data source from which the product
    /// input should be deleted. Format:
    /// `accounts/{account}/dataSources/{datasource}`. For example,
    /// `accounts/123456/dataSources/104628`.
    #[prost(string, tag = "2")]
    pub data_source: ::prost::alloc::string::String,
}
/// Generated client implementations.
pub mod product_inputs_service_client {
    #![allow(
        unused_variables,
        dead_code,
        missing_docs,
        clippy::wildcard_imports,
        clippy::let_unit_value,
    )]
    use tonic::codegen::*;
    use tonic::codegen::http::Uri;
    /// Service to use ProductInput resource.
    /// This service works for products with online channel only.
    #[derive(Debug, Clone)]
    pub struct ProductInputsServiceClient<T> {
        inner: tonic::client::Grpc<T>,
    }
    impl ProductInputsServiceClient<tonic::transport::Channel> {
        /// Attempt to create a new client by connecting to a given endpoint.
        pub async fn connect<D>(dst: D) -> Result<Self, tonic::transport::Error>
        where
            D: TryInto<tonic::transport::Endpoint>,
            D::Error: Into<StdError>,
        {
            let conn = tonic::transport::Endpoint::new(dst)?.connect().await?;
            Ok(Self::new(conn))
        }
    }
    impl<T> ProductInputsServiceClient<T>
    where
        T: tonic::client::GrpcService<tonic::body::Body>,
        T::Error: Into<StdError>,
        T::ResponseBody: Body<Data = Bytes> + std::marker::Send + 'static,
        <T::ResponseBody as Body>::Error: Into<StdError> + std::marker::Send,
    {
        pub fn new(inner: T) -> Self {
            let inner = tonic::client::Grpc::new(inner);
            Self { inner }
        }
        pub fn with_origin(inner: T, origin: Uri) -> Self {
            let inner = tonic::client::Grpc::with_origin(inner, origin);
            Self { inner }
        }
        pub fn with_interceptor<F>(
            inner: T,
            interceptor: F,
        ) -> ProductInputsServiceClient<InterceptedService<T, F>>
        where
            F: tonic::service::Interceptor,
            T::ResponseBody: Default,
            T: tonic::codegen::Service<
                http::Request<tonic::body::Body>,
                Response = http::Response<
                    <T as tonic::client::GrpcService<tonic::body::Body>>::ResponseBody,
                >,
            >,
            <T as tonic::codegen::Service<
                http::Request<tonic::body::Body>,
            >>::Error: Into<StdError> + std::marker::Send + std::marker::Sync,
        {
            ProductInputsServiceClient::new(InterceptedService::new(inner, interceptor))
        }
        /// Compress requests with the given encoding.
        ///
        /// This requires the server to support it otherwise it might respond with an
        /// error.
        #[must_use]
        pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self {
            self.inner = self.inner.send_compressed(encoding);
            self
        }
        /// Enable decompressing responses.
        #[must_use]
        pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self {
            self.inner = self.inner.accept_compressed(encoding);
            self
        }
        /// Limits the maximum size of a decoded message.
        ///
        /// Default: `4MB`
        #[must_use]
        pub fn max_decoding_message_size(mut self, limit: usize) -> Self {
            self.inner = self.inner.max_decoding_message_size(limit);
            self
        }
        /// Limits the maximum size of an encoded message.
        ///
        /// Default: `usize::MAX`
        #[must_use]
        pub fn max_encoding_message_size(mut self, limit: usize) -> Self {
            self.inner = self.inner.max_encoding_message_size(limit);
            self
        }
        /// [Uploads a product input to your Merchant Center
        /// account](/merchant/api/guides/products/overview#upload-product-input). You
        /// must have a products data source to be able to insert a product. The unique
        /// identifier of the data source is passed as a query parameter in the request
        /// URL.
        ///
        /// If an input with the same contentLanguage, offerId, and dataSource already
        /// exists, this method replaces that entry.
        ///
        /// After inserting, updating, or deleting a product input, it may take several
        /// minutes before the processed product can be retrieved.
        pub async fn insert_product_input(
            &mut self,
            request: impl tonic::IntoRequest<super::InsertProductInputRequest>,
        ) -> std::result::Result<tonic::Response<super::ProductInput>, tonic::Status> {
            self.inner
                .ready()
                .await
                .map_err(|e| {
                    tonic::Status::unknown(
                        format!("Service was not ready: {}", e.into()),
                    )
                })?;
            let codec = tonic_prost::ProstCodec::default();
            let path = http::uri::PathAndQuery::from_static(
                "/google.shopping.merchant.products.v1beta.ProductInputsService/InsertProductInput",
            );
            let mut req = request.into_request();
            req.extensions_mut()
                .insert(
                    GrpcMethod::new(
                        "google.shopping.merchant.products.v1beta.ProductInputsService",
                        "InsertProductInput",
                    ),
                );
            self.inner.unary(req, path, codec).await
        }
        /// Updates the existing product input in your Merchant Center account.
        ///
        /// After inserting, updating, or deleting a product input, it may take several
        /// minutes before the processed product can be retrieved.
        pub async fn update_product_input(
            &mut self,
            request: impl tonic::IntoRequest<super::UpdateProductInputRequest>,
        ) -> std::result::Result<tonic::Response<super::ProductInput>, tonic::Status> {
            self.inner
                .ready()
                .await
                .map_err(|e| {
                    tonic::Status::unknown(
                        format!("Service was not ready: {}", e.into()),
                    )
                })?;
            let codec = tonic_prost::ProstCodec::default();
            let path = http::uri::PathAndQuery::from_static(
                "/google.shopping.merchant.products.v1beta.ProductInputsService/UpdateProductInput",
            );
            let mut req = request.into_request();
            req.extensions_mut()
                .insert(
                    GrpcMethod::new(
                        "google.shopping.merchant.products.v1beta.ProductInputsService",
                        "UpdateProductInput",
                    ),
                );
            self.inner.unary(req, path, codec).await
        }
        /// Deletes a product input from your Merchant Center account.
        ///
        /// After inserting, updating, or deleting a product input, it may take several
        /// minutes before the processed product can be retrieved.
        pub async fn delete_product_input(
            &mut self,
            request: impl tonic::IntoRequest<super::DeleteProductInputRequest>,
        ) -> std::result::Result<tonic::Response<()>, tonic::Status> {
            self.inner
                .ready()
                .await
                .map_err(|e| {
                    tonic::Status::unknown(
                        format!("Service was not ready: {}", e.into()),
                    )
                })?;
            let codec = tonic_prost::ProstCodec::default();
            let path = http::uri::PathAndQuery::from_static(
                "/google.shopping.merchant.products.v1beta.ProductInputsService/DeleteProductInput",
            );
            let mut req = request.into_request();
            req.extensions_mut()
                .insert(
                    GrpcMethod::new(
                        "google.shopping.merchant.products.v1beta.ProductInputsService",
                        "DeleteProductInput",
                    ),
                );
            self.inner.unary(req, path, codec).await
        }
    }
}
/// The processed product, built from multiple \[product
/// inputs\]\[google.shopping.merchant.products.v1main.ProductInput\]
/// after applying rules and supplemental data sources. This processed product
/// matches what is shown in your Merchant Center account. Each product is built
/// from exactly one primary data source product input, and multiple supplemental
/// data source inputs. After inserting, updating, or deleting a product input,
/// it may take several minutes before the updated processed product can be
/// retrieved.
///
/// All fields in the processed product and its sub-messages match the name of
/// their corresponding attribute in the [Product data
/// specification](<https://support.google.com/merchants/answer/7052112>) with some
/// exceptions.
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct Product {
    /// The name of the product.
    /// Format:
    /// `accounts/{account}/products/{product}` where the last
    /// section `product` consists of 4 parts:
    /// `channel~content_language~feed_label~offer_id`
    /// example for product name is `accounts/123/products/online~en~US~sku123`
    #[prost(string, tag = "1")]
    pub name: ::prost::alloc::string::String,
    /// Output only. The
    /// [channel](<https://support.google.com/merchants/answer/7361332>) of the
    /// product.
    #[prost(
        enumeration = "super::super::super::r#type::channel::ChannelEnum",
        tag = "2"
    )]
    pub channel: i32,
    /// Output only. Your unique identifier for the product. This is the same for
    /// the product input and processed product. Leading and trailing whitespaces
    /// are stripped and multiple whitespaces are replaced by a single whitespace
    /// upon submission. See the [product data
    /// specification](<https://support.google.com/merchants/answer/188494#id>) for
    /// details.
    #[prost(string, tag = "3")]
    pub offer_id: ::prost::alloc::string::String,
    /// Output only. The two-letter [ISO
    /// 639-1](<http://en.wikipedia.org/wiki/ISO_639-1>) language code for the
    /// product.
    #[prost(string, tag = "4")]
    pub content_language: ::prost::alloc::string::String,
    /// Output only. The feed label lets you categorize and identify your products.
    /// The maximum allowed characters is 20 and the supported characters are`A-Z`,
    /// `0-9`, hyphen and underscore. The feed label must not include any spaces.
    /// For more information, see [Using feed
    /// labels](//support.google.com/merchants/answer/14994087)
    #[prost(string, tag = "5")]
    pub feed_label: ::prost::alloc::string::String,
    /// Output only. The primary data source of the product.
    #[prost(string, tag = "6")]
    pub data_source: ::prost::alloc::string::String,
    /// Output only. Represents the existing version (freshness) of the product,
    /// which can be used to preserve the right order when multiple updates are
    /// done at the same time.
    ///
    /// If set, the insertion is prevented when version number is lower than
    /// the current version number of the existing product. Re-insertion (for
    /// example, product refresh after 30 days) can be performed with the current
    /// `version_number`.
    ///
    /// Only supported for insertions into primary data sources.
    ///
    /// If the operation is prevented, the aborted exception will be
    /// thrown.
    #[prost(int64, optional, tag = "7")]
    pub version_number: ::core::option::Option<i64>,
    /// Output only. A list of product attributes.
    #[prost(message, optional, tag = "8")]
    pub attributes: ::core::option::Option<Attributes>,
    /// Output only. A list of custom (merchant-provided) attributes. It can also
    /// be used to submit any attribute of the data specification in its generic
    /// form (for example,
    /// `{ "name": "size type", "value": "regular" }`).
    /// This is useful for submitting attributes not explicitly exposed by the
    /// API, such as additional attributes used for Buy on Google.
    #[prost(message, repeated, tag = "9")]
    pub custom_attributes: ::prost::alloc::vec::Vec<
        super::super::super::r#type::CustomAttribute,
    >,
    /// Output only. The status of a product, data validation issues, that is,
    /// information about a product computed asynchronously.
    #[prost(message, optional, tag = "10")]
    pub product_status: ::core::option::Option<ProductStatus>,
    /// Output only. The automated discounts information for the product.
    #[prost(message, optional, tag = "12")]
    pub automated_discounts: ::core::option::Option<AutomatedDiscounts>,
}
/// Request message for the GetProduct method.
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct GetProductRequest {
    /// Required. The name of the product to retrieve.
    /// Format: `accounts/{account}/products/{product}`
    /// where the last section `product` consists of 4 parts:
    /// `channel~content_language~feed_label~offer_id`
    /// example for product name is
    /// `accounts/123/products/online~en~US~sku123`
    #[prost(string, tag = "1")]
    pub name: ::prost::alloc::string::String,
}
/// Request message for the ListProducts method.
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct ListProductsRequest {
    /// Required. The account to list processed products for.
    /// Format: `accounts/{account}`
    #[prost(string, tag = "1")]
    pub parent: ::prost::alloc::string::String,
    /// The maximum number of products to return. The service may return fewer than
    /// this value.
    /// The maximum value is 1000; values above 1000 will be coerced to 1000.
    /// If unspecified, the maximum number of products will be returned.
    #[prost(int32, tag = "2")]
    pub page_size: i32,
    /// A page token, received from a previous `ListProducts` call.
    /// Provide this to retrieve the subsequent page.
    ///
    /// When paginating, all other parameters provided to `ListProducts` must
    /// match the call that provided the page token.
    #[prost(string, tag = "3")]
    pub page_token: ::prost::alloc::string::String,
}
/// Response message for the ListProducts method.
#[derive(Clone, PartialEq, ::prost::Message)]
pub struct ListProductsResponse {
    /// The processed products from the specified account. These are your processed
    /// products after applying rules and supplemental data sources.
    #[prost(message, repeated, tag = "1")]
    pub products: ::prost::alloc::vec::Vec<Product>,
    /// A token, which can be sent as `page_token` to retrieve the next page.
    /// If this field is omitted, there are no subsequent pages.
    #[prost(string, tag = "2")]
    pub next_page_token: ::prost::alloc::string::String,
}
/// Generated client implementations.
pub mod products_service_client {
    #![allow(
        unused_variables,
        dead_code,
        missing_docs,
        clippy::wildcard_imports,
        clippy::let_unit_value,
    )]
    use tonic::codegen::*;
    use tonic::codegen::http::Uri;
    /// Service to use Product resource.
    #[derive(Debug, Clone)]
    pub struct ProductsServiceClient<T> {
        inner: tonic::client::Grpc<T>,
    }
    impl ProductsServiceClient<tonic::transport::Channel> {
        /// Attempt to create a new client by connecting to a given endpoint.
        pub async fn connect<D>(dst: D) -> Result<Self, tonic::transport::Error>
        where
            D: TryInto<tonic::transport::Endpoint>,
            D::Error: Into<StdError>,
        {
            let conn = tonic::transport::Endpoint::new(dst)?.connect().await?;
            Ok(Self::new(conn))
        }
    }
    impl<T> ProductsServiceClient<T>
    where
        T: tonic::client::GrpcService<tonic::body::Body>,
        T::Error: Into<StdError>,
        T::ResponseBody: Body<Data = Bytes> + std::marker::Send + 'static,
        <T::ResponseBody as Body>::Error: Into<StdError> + std::marker::Send,
    {
        pub fn new(inner: T) -> Self {
            let inner = tonic::client::Grpc::new(inner);
            Self { inner }
        }
        pub fn with_origin(inner: T, origin: Uri) -> Self {
            let inner = tonic::client::Grpc::with_origin(inner, origin);
            Self { inner }
        }
        pub fn with_interceptor<F>(
            inner: T,
            interceptor: F,
        ) -> ProductsServiceClient<InterceptedService<T, F>>
        where
            F: tonic::service::Interceptor,
            T::ResponseBody: Default,
            T: tonic::codegen::Service<
                http::Request<tonic::body::Body>,
                Response = http::Response<
                    <T as tonic::client::GrpcService<tonic::body::Body>>::ResponseBody,
                >,
            >,
            <T as tonic::codegen::Service<
                http::Request<tonic::body::Body>,
            >>::Error: Into<StdError> + std::marker::Send + std::marker::Sync,
        {
            ProductsServiceClient::new(InterceptedService::new(inner, interceptor))
        }
        /// Compress requests with the given encoding.
        ///
        /// This requires the server to support it otherwise it might respond with an
        /// error.
        #[must_use]
        pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self {
            self.inner = self.inner.send_compressed(encoding);
            self
        }
        /// Enable decompressing responses.
        #[must_use]
        pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self {
            self.inner = self.inner.accept_compressed(encoding);
            self
        }
        /// Limits the maximum size of a decoded message.
        ///
        /// Default: `4MB`
        #[must_use]
        pub fn max_decoding_message_size(mut self, limit: usize) -> Self {
            self.inner = self.inner.max_decoding_message_size(limit);
            self
        }
        /// Limits the maximum size of an encoded message.
        ///
        /// Default: `usize::MAX`
        #[must_use]
        pub fn max_encoding_message_size(mut self, limit: usize) -> Self {
            self.inner = self.inner.max_encoding_message_size(limit);
            self
        }
        /// Retrieves the processed product from your Merchant Center account.
        ///
        /// After inserting, updating, or deleting a product input, it may take several
        /// minutes before the updated final product can be retrieved.
        pub async fn get_product(
            &mut self,
            request: impl tonic::IntoRequest<super::GetProductRequest>,
        ) -> std::result::Result<tonic::Response<super::Product>, tonic::Status> {
            self.inner
                .ready()
                .await
                .map_err(|e| {
                    tonic::Status::unknown(
                        format!("Service was not ready: {}", e.into()),
                    )
                })?;
            let codec = tonic_prost::ProstCodec::default();
            let path = http::uri::PathAndQuery::from_static(
                "/google.shopping.merchant.products.v1beta.ProductsService/GetProduct",
            );
            let mut req = request.into_request();
            req.extensions_mut()
                .insert(
                    GrpcMethod::new(
                        "google.shopping.merchant.products.v1beta.ProductsService",
                        "GetProduct",
                    ),
                );
            self.inner.unary(req, path, codec).await
        }
        /// Lists the processed products in your Merchant Center account. The response
        /// might contain fewer items than specified by `pageSize`. Rely on `pageToken`
        /// to determine if there are more items to be requested.
        ///
        /// After inserting, updating, or deleting a product input, it may take several
        /// minutes before the updated processed product can be retrieved.
        pub async fn list_products(
            &mut self,
            request: impl tonic::IntoRequest<super::ListProductsRequest>,
        ) -> std::result::Result<
            tonic::Response<super::ListProductsResponse>,
            tonic::Status,
        > {
            self.inner
                .ready()
                .await
                .map_err(|e| {
                    tonic::Status::unknown(
                        format!("Service was not ready: {}", e.into()),
                    )
                })?;
            let codec = tonic_prost::ProstCodec::default();
            let path = http::uri::PathAndQuery::from_static(
                "/google.shopping.merchant.products.v1beta.ProductsService/ListProducts",
            );
            let mut req = request.into_request();
            req.extensions_mut()
                .insert(
                    GrpcMethod::new(
                        "google.shopping.merchant.products.v1beta.ProductsService",
                        "ListProducts",
                    ),
                );
            self.inner.unary(req, path, codec).await
        }
    }
}
