# Copyright 2019 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.

# NOTE: This file is auto generated by the elixir code generator program.
# Do not edit this file manually.

defmodule GoogleApi.Dataplex.V1.Model.GoogleCloudDataplexV1AspectTypeMetadataTemplate do
  @moduledoc """
  MetadataTemplate definition for an AspectType.

  ## Attributes

  *   `annotations` (*type:* `GoogleApi.Dataplex.V1.Model.GoogleCloudDataplexV1AspectTypeMetadataTemplateAnnotations.t`, *default:* `nil`) - Optional. Specifies annotations on this field.
  *   `arrayItems` (*type:* `GoogleApi.Dataplex.V1.Model.GoogleCloudDataplexV1AspectTypeMetadataTemplate.t`, *default:* `nil`) - Optional. If the type is array, set array_items. array_items can refer to a primitive field or a complex (record only) field. To specify a primitive field, you only need to set name and type in the nested MetadataTemplate. The recommended value for the name field is item, as this isn't used in the actual payload.
  *   `constraints` (*type:* `GoogleApi.Dataplex.V1.Model.GoogleCloudDataplexV1AspectTypeMetadataTemplateConstraints.t`, *default:* `nil`) - Optional. Specifies the constraints on this field.
  *   `enumValues` (*type:* `list(GoogleApi.Dataplex.V1.Model.GoogleCloudDataplexV1AspectTypeMetadataTemplateEnumValue.t)`, *default:* `nil`) - Optional. The list of values for an enum type. You must define it if the type is enum.
  *   `index` (*type:* `integer()`, *default:* `nil`) - Optional. Index is used to encode Template messages. The value of index can range between 1 and 2,147,483,647. Index must be unique within all fields in a Template. (Nested Templates can reuse indexes). Once a Template is defined, the index cannot be changed, because it identifies the field in the actual storage format. Index is a mandatory field, but it is optional for top level fields, and map/array "values" definitions.
  *   `mapItems` (*type:* `GoogleApi.Dataplex.V1.Model.GoogleCloudDataplexV1AspectTypeMetadataTemplate.t`, *default:* `nil`) - Optional. If the type is map, set map_items. map_items can refer to a primitive field or a complex (record only) field. To specify a primitive field, you only need to set name and type in the nested MetadataTemplate. The recommended value for the name field is item, as this isn't used in the actual payload.
  *   `name` (*type:* `String.t`, *default:* `nil`) - Required. The name of the field.
  *   `recordFields` (*type:* `list(GoogleApi.Dataplex.V1.Model.GoogleCloudDataplexV1AspectTypeMetadataTemplate.t)`, *default:* `nil`) - Optional. Field definition. You must specify it if the type is record. It defines the nested fields.
  *   `type` (*type:* `String.t`, *default:* `nil`) - Required. The datatype of this field. The following values are supported:Primitive types: string integer boolean double datetime. Must be of the format RFC3339 UTC "Zulu" (Examples: "2014-10-02T15:01:23Z" and "2014-10-02T15:01:23.045123456Z").Complex types: enum array map record
  *   `typeId` (*type:* `String.t`, *default:* `nil`) - Optional. You can use type id if this definition of the field needs to be reused later. The type id must be unique across the entire template. You can only specify it if the field type is record.
  *   `typeRef` (*type:* `String.t`, *default:* `nil`) - Optional. A reference to another field definition (not an inline definition). The value must be equal to the value of an id field defined elsewhere in the MetadataTemplate. Only fields with record type can refer to other fields.
  """

  use GoogleApi.Gax.ModelBase

  @type t :: %__MODULE__{
          :annotations =>
            GoogleApi.Dataplex.V1.Model.GoogleCloudDataplexV1AspectTypeMetadataTemplateAnnotations.t()
            | nil,
          :arrayItems =>
            GoogleApi.Dataplex.V1.Model.GoogleCloudDataplexV1AspectTypeMetadataTemplate.t() | nil,
          :constraints =>
            GoogleApi.Dataplex.V1.Model.GoogleCloudDataplexV1AspectTypeMetadataTemplateConstraints.t()
            | nil,
          :enumValues =>
            list(
              GoogleApi.Dataplex.V1.Model.GoogleCloudDataplexV1AspectTypeMetadataTemplateEnumValue.t()
            )
            | nil,
          :index => integer() | nil,
          :mapItems =>
            GoogleApi.Dataplex.V1.Model.GoogleCloudDataplexV1AspectTypeMetadataTemplate.t() | nil,
          :name => String.t() | nil,
          :recordFields =>
            list(GoogleApi.Dataplex.V1.Model.GoogleCloudDataplexV1AspectTypeMetadataTemplate.t())
            | nil,
          :type => String.t() | nil,
          :typeId => String.t() | nil,
          :typeRef => String.t() | nil
        }

  field(:annotations,
    as: GoogleApi.Dataplex.V1.Model.GoogleCloudDataplexV1AspectTypeMetadataTemplateAnnotations
  )

  field(:arrayItems,
    as: GoogleApi.Dataplex.V1.Model.GoogleCloudDataplexV1AspectTypeMetadataTemplate
  )

  field(:constraints,
    as: GoogleApi.Dataplex.V1.Model.GoogleCloudDataplexV1AspectTypeMetadataTemplateConstraints
  )

  field(:enumValues,
    as: GoogleApi.Dataplex.V1.Model.GoogleCloudDataplexV1AspectTypeMetadataTemplateEnumValue,
    type: :list
  )

  field(:index)

  field(:mapItems, as: GoogleApi.Dataplex.V1.Model.GoogleCloudDataplexV1AspectTypeMetadataTemplate)

  field(:name)

  field(:recordFields,
    as: GoogleApi.Dataplex.V1.Model.GoogleCloudDataplexV1AspectTypeMetadataTemplate,
    type: :list
  )

  field(:type)
  field(:typeId)
  field(:typeRef)
end

defimpl Poison.Decoder,
  for: GoogleApi.Dataplex.V1.Model.GoogleCloudDataplexV1AspectTypeMetadataTemplate do
  def decode(value, options) do
    GoogleApi.Dataplex.V1.Model.GoogleCloudDataplexV1AspectTypeMetadataTemplate.decode(
      value,
      options
    )
  end
end

defimpl Poison.Encoder,
  for: GoogleApi.Dataplex.V1.Model.GoogleCloudDataplexV1AspectTypeMetadataTemplate do
  def encode(value, options) do
    GoogleApi.Gax.ModelBase.encode(value, options)
  end
end
