// Copyright 2018 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
// implied. See the License for the specific language governing
// permissions and limitations under the License.


// Proto file describing the common error protos
syntax = "proto3";

package google.ads.googleads.v0.errors;

import "google/ads/googleads/v0/common/policy.proto";
import "google/ads/googleads/v0/common/value.proto";
import "google/ads/googleads/v0/errors/ad_customizer_error.proto";
import "google/ads/googleads/v0/errors/ad_error.proto";
import "google/ads/googleads/v0/errors/ad_group_ad_error.proto";
import "google/ads/googleads/v0/errors/ad_group_bid_modifier_error.proto";
import "google/ads/googleads/v0/errors/ad_group_criterion_error.proto";
import "google/ads/googleads/v0/errors/ad_group_error.proto";
import "google/ads/googleads/v0/errors/ad_sharing_error.proto";
import "google/ads/googleads/v0/errors/adx_error.proto";
import "google/ads/googleads/v0/errors/authentication_error.proto";
import "google/ads/googleads/v0/errors/authorization_error.proto";
import "google/ads/googleads/v0/errors/bidding_error.proto";
import "google/ads/googleads/v0/errors/bidding_strategy_error.proto";
import "google/ads/googleads/v0/errors/campaign_budget_error.proto";
import "google/ads/googleads/v0/errors/campaign_criterion_error.proto";
import "google/ads/googleads/v0/errors/campaign_error.proto";
import "google/ads/googleads/v0/errors/collection_size_error.proto";
import "google/ads/googleads/v0/errors/context_error.proto";
import "google/ads/googleads/v0/errors/criterion_error.proto";
import "google/ads/googleads/v0/errors/date_error.proto";
import "google/ads/googleads/v0/errors/date_range_error.proto";
import "google/ads/googleads/v0/errors/distinct_error.proto";
import "google/ads/googleads/v0/errors/feed_attribute_reference_error.proto";
import "google/ads/googleads/v0/errors/field_error.proto";
import "google/ads/googleads/v0/errors/field_mask_error.proto";
import "google/ads/googleads/v0/errors/function_error.proto";
import "google/ads/googleads/v0/errors/function_parsing_error.proto";
import "google/ads/googleads/v0/errors/id_error.proto";
import "google/ads/googleads/v0/errors/image_error.proto";
import "google/ads/googleads/v0/errors/internal_error.proto";
import "google/ads/googleads/v0/errors/list_operation_error.proto";
import "google/ads/googleads/v0/errors/media_bundle_error.proto";
import "google/ads/googleads/v0/errors/media_error.proto";
import "google/ads/googleads/v0/errors/multiplier_error.proto";
import "google/ads/googleads/v0/errors/mutate_error.proto";
import "google/ads/googleads/v0/errors/new_resource_creation_error.proto";
import "google/ads/googleads/v0/errors/not_empty_error.proto";
import "google/ads/googleads/v0/errors/null_error.proto";
import "google/ads/googleads/v0/errors/operation_access_denied_error.proto";
import "google/ads/googleads/v0/errors/operator_error.proto";
import "google/ads/googleads/v0/errors/query_error.proto";
import "google/ads/googleads/v0/errors/quota_error.proto";
import "google/ads/googleads/v0/errors/range_error.proto";
import "google/ads/googleads/v0/errors/recommendation_error.proto";
import "google/ads/googleads/v0/errors/region_code_error.proto";
import "google/ads/googleads/v0/errors/request_error.proto";
import "google/ads/googleads/v0/errors/resource_access_denied_error.proto";
import
  "google/ads/googleads/v0/errors/resource_count_limit_exceeded_error.proto";
import "google/ads/googleads/v0/errors/setting_error.proto";
import "google/ads/googleads/v0/errors/string_format_error.proto";
import "google/ads/googleads/v0/errors/string_length_error.proto";
import "google/ads/googleads/v0/errors/url_field_error.proto";
import "google/protobuf/wrappers.proto";

option java_package = "com.google.ads.googleads.v0.errors";
option java_outer_classname = "ErrorsProto";
option java_multiple_files = true;

// Objective-C prefix. Google Ads API.
option objc_class_prefix = "GAA";
option csharp_namespace = "Google.Ads.GoogleAds.V0.Errors";
option php_namespace = "Google\\Ads\\GoogleAds\\V0\\Errors";
option php_metadata_namespace = "Google\\Ads\\GoogleAds\\V0\\Errors";

// Describes how a GoogleAds API call failed. It's returned inside
// google.rpc.Status.details when a call fails.
message GoogleAdsFailure {

  // The list of errors that occurred.
  repeated GoogleAdsError errors = 1;
}

// GoogleAds-specific error.
message GoogleAdsError {

  // An enum value that indicates which error occurred.
  ErrorCode error_code = 1;

  // A human-readable description of the error.
  string message = 2;

  // The value that triggered the error.
  common.Value trigger = 3;

  // Describes the part of the request proto that caused the error.
  ErrorLocation location = 4;

  // Additional error details, which are returned by certain error codes. Most
  // error codes do not include details.
  ErrorDetails details = 5;
}

// The error reason represented by type and enum.
message ErrorCode {

  // The list of error enums
  oneof error_code {

    // An error caused by the request
    RequestErrorEnum.RequestError request_error = 1;

    // An error with a Bidding Strategy mutate.
    BiddingStrategyErrorEnum.BiddingStrategyError bidding_strategy_error = 2;

    // An error with a URL field mutate.
    UrlFieldErrorEnum.UrlFieldError url_field_error = 3;

    // An error with a list operation.
    ListOperationErrorEnum.ListOperationError list_operation_error = 4;

    // An error with an AWQL query
    QueryErrorEnum.QueryError query_error = 5;

    // An error with a mutate
    MutateErrorEnum.MutateError mutate_error = 7;

    // An error with a field mask
    FieldMaskErrorEnum.FieldMaskError field_mask_error = 8;

    // An error encountered when trying to authorize a user.
    AuthorizationErrorEnum.AuthorizationError authorization_error = 9;

    // An unexpected server-side error.
    InternalErrorEnum.InternalError internal_error = 10;

    // An error with the amonut of quota remaining.
    QuotaErrorEnum.QuotaError quota_error = 11;

    // An error with an Ad Group Ad mutate.
    AdErrorEnum.AdError ad_error = 12;

    // An error with an Ad Group mutate.
    AdGroupErrorEnum.AdGroupError ad_group_error = 13;

    // An error with a Campaign Budget mutate.
    CampaignBudgetErrorEnum.CampaignBudgetError campaign_budget_error = 14;

    // An error with a Campaign mutate.
    CampaignErrorEnum.CampaignError campaign_error = 15;

    // Indicates failure to properly authenticate user.
    AuthenticationErrorEnum.AuthenticationError authentication_error = 17;

    // Indicates failure to properly authenticate user.
    AdGroupCriterionErrorEnum.AdGroupCriterionError ad_group_criterion_error =
      18;

    // The reasons for the ad customizer error
    AdCustomizerErrorEnum.AdCustomizerError ad_customizer_error = 19;

    // The reasons for the ad group ad error
    AdGroupAdErrorEnum.AdGroupAdError ad_group_ad_error = 21;

    // The reasons for the ad sharing error
    AdSharingErrorEnum.AdSharingError ad_sharing_error = 24;

    // The reasons for the adx error
    AdxErrorEnum.AdxError adx_error = 25;

    // The reasons for the bidding errors
    BiddingErrorEnum.BiddingError bidding_error = 26;

    // The reasons for the campaign criterion error
    CampaignCriterionErrorEnum.CampaignCriterionError campaign_criterion_error =
      29;

    // The reasons for the collection size error
    CollectionSizeErrorEnum.CollectionSizeError collection_size_error = 31;

    // The reasons for the criterion error
    CriterionErrorEnum.CriterionError criterion_error = 32;

    // The reasons for the date error
    DateErrorEnum.DateError date_error = 33;

    // The reasons for the date range error
    DateRangeErrorEnum.DateRangeError date_range_error = 34;

    // The reasons for the distinct error
    DistinctErrorEnum.DistinctError distinct_error = 35;

    // The reasons for the feed attribute reference error
    FeedAttributeReferenceErrorEnum.FeedAttributeReferenceError
      feed_attribute_reference_error = 36;

    // The reasons for the function error
    FunctionErrorEnum.FunctionError function_error = 37;

    // The reasons for the function parsing error
    FunctionParsingErrorEnum.FunctionParsingError function_parsing_error = 38;

    // The reasons for the id error
    IdErrorEnum.IdError id_error = 39;

    // The reasons for the image error
    ImageErrorEnum.ImageError image_error = 40;

    // The reasons for the media bundle error
    MediaBundleErrorEnum.MediaBundleError media_bundle_error = 42;

    // The reasons for the media error
    MediaErrorEnum.MediaError media_error = 43;

    // The reasons for the multiplier error
    MultiplierErrorEnum.MultiplierError multiplier_error = 44;

    // The reasons for the new resource creation error
    NewResourceCreationErrorEnum.NewResourceCreationError
      new_resource_creation_error = 45;

    // The reasons for the not empty error
    NotEmptyErrorEnum.NotEmptyError not_empty_error = 46;

    // The reasons for the null error
    NullErrorEnum.NullError null_error = 47;

    // The reasons for the operator error
    OperatorErrorEnum.OperatorError operator_error = 48;

    // The reasons for the range error
    RangeErrorEnum.RangeError range_error = 49;

    // The reasons for error in applying a recommendation
    RecommendationErrorEnum.RecommendationError recommendation_error = 58;

    // The reasons for the region code error
    RegionCodeErrorEnum.RegionCodeError region_code_error = 51;

    // The reasons for the setting error
    SettingErrorEnum.SettingError setting_error = 52;

    // The reasons for the string format error
    StringFormatErrorEnum.StringFormatError string_format_error = 53;

    // The reasons for the string length error
    StringLengthErrorEnum.StringLengthError string_length_error = 54;

    // The reasons for the operation access denied error
    OperationAccessDeniedErrorEnum.OperationAccessDeniedError
      operation_access_denied_error = 55;

    // The reasons for the resource access denied error
    ResourceAccessDeniedErrorEnum.ResourceAccessDeniedError
      resource_access_denied_error = 56;

    // The reasons for the resource count limit exceeded error
    ResourceCountLimitExceededErrorEnum.ResourceCountLimitExceededError
      resource_count_limit_exceeded_error = 57;

    // The reasons for the ad group bid modifier error
    AdGroupBidModifierErrorEnum.AdGroupBidModifierError
      ad_group_bid_modifier_error = 59;

    // The reasons for the context error
    ContextErrorEnum.ContextError context_error = 60;

    // The reasons for the field error
    FieldErrorEnum.FieldError field_error = 61;
  }
}

// Describes the part of the request proto that caused the error.
message ErrorLocation {

  // The mutate operation that failed
  google.protobuf.Int64Value operation_index = 1;

  // A field path that indicates which field was invalid in the resource being
  // mutated.
  repeated FieldPathElement field_path_elements = 2;

  // A part of a field path.
  message FieldPathElement {

    // The name of a field
    string field_name = 1;

    // If field_name is a list, this is the element that failed
    google.protobuf.Int64Value index = 2;
  }
}

// Additional error details.
message ErrorDetails {

  // The error code that should have been returned, but wasn't. This is used
  // when the error code is InternalError.ERROR_CODE_NOT_PUBLISHED.
  string unpublished_error_code = 1;

  // Describes an ad policy violation.
  PolicyViolationDetails policy_violation_details = 2;
}

// Error returned as part of a mutate response.
// This error indicates single policy violation by some text
// in one of the fields.
message PolicyViolationDetails {

  // Human readable description of policy violation.
  string external_policy_description = 2;

  // Unique identifier for this violation.
  // If policy is exemptible, this key may be used to request exemption.
  common.PolicyViolationKey key = 4;

  // Human readable name of the policy.
  string external_policy_name = 5;

  // Whether user can file an exemption request for this violation.
  bool is_exemptible = 6;
}
