package hybriddata

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
//
// Code generated by Microsoft (R) AutoRest Code Generator.
// Changes may cause incorrect behavior and will be lost if the code is regenerated.

import (
	"context"
	"encoding/json"
	"github.com/Azure/go-autorest/autorest"
	"github.com/Azure/go-autorest/autorest/azure"
	"github.com/Azure/go-autorest/autorest/date"
	"github.com/Azure/go-autorest/autorest/to"
	"github.com/Azure/go-autorest/tracing"
	"net/http"
)

// The package's fully qualified name.
const fqdn = "github.com/Azure/azure-sdk-for-go/services/hybriddatamanager/mgmt/2019-06-01/hybriddata"

// AvailableProviderOperation class represents provider operation
type AvailableProviderOperation struct {
	// Name - Gets or Sets Name of the operations
	Name *string `json:"name,omitempty"`
	// Display - Gets or sets Display information
	// Contains the localized display information for this particular operation/action
	Display *AvailableProviderOperationDisplay `json:"display,omitempty"`
	// Origin - Gets or sets Origin
	// The intended executor of the operation; governs the display of the operation in the RBAC UX and the audit logs UX.
	// Default value is “user,system”
	Origin *string `json:"origin,omitempty"`
	// Properties - Gets or sets Properties
	// Reserved for future use
	Properties interface{} `json:"properties,omitempty"`
}

// AvailableProviderOperationDisplay contains the localized display information for this particular
// operation / action.
// These value will be used by several clients for
// (1) custom role definitions for RBAC;
// (2) complex query filters for the event service; and (3) audit history / records for management
// operations.
type AvailableProviderOperationDisplay struct {
	// Provider - Gets or sets Provider
	// The localized friendly form of the resource provider name – it is expected to also include the publisher/company responsible.
	// It should use Title Casing and begin with “Microsoft” for 1st party services.
	Provider *string `json:"provider,omitempty"`
	// Resource - Gets or sets Resource
	// The localized friendly form of the resource type related to this action/operation – it should match the public documentation for the resource provider.
	// It should use Title Casing – for examples, please refer to the “name” section.
	Resource *string `json:"resource,omitempty"`
	// Operation - Gets or sets Operation
	// The localized friendly name for the operation, as it should be shown to the user.
	// It should be concise (to fit in drop downs) but clear (i.e. self-documenting). It should use Title Casing and include the entity/resource to which it applies.
	Operation *string `json:"operation,omitempty"`
	// Description - Gets or sets Description
	// The localized friendly description for the operation, as it should be shown to the user.
	// It should be thorough, yet concise – it will be used in tool tips and detailed views.
	Description *string `json:"description,omitempty"`
}

// AvailableProviderOperations class for set of operations used for discovery of available provider
// operations.
type AvailableProviderOperations struct {
	autorest.Response `json:"-"`
	// Value - List of operations.
	Value *[]AvailableProviderOperation `json:"value,omitempty"`
	// NextLink - Link for the next set of operations.
	NextLink *string `json:"nextLink,omitempty"`
}

// AvailableProviderOperationsIterator provides access to a complete listing of AvailableProviderOperation
// values.
type AvailableProviderOperationsIterator struct {
	i    int
	page AvailableProviderOperationsPage
}

// NextWithContext advances to the next value.  If there was an error making
// the request the iterator does not advance and the error is returned.
func (iter *AvailableProviderOperationsIterator) NextWithContext(ctx context.Context) (err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/AvailableProviderOperationsIterator.NextWithContext")
		defer func() {
			sc := -1
			if iter.Response().Response.Response != nil {
				sc = iter.Response().Response.Response.StatusCode
			}
			tracing.EndSpan(ctx, sc, err)
		}()
	}
	iter.i++
	if iter.i < len(iter.page.Values()) {
		return nil
	}
	err = iter.page.NextWithContext(ctx)
	if err != nil {
		iter.i--
		return err
	}
	iter.i = 0
	return nil
}

// Next advances to the next value.  If there was an error making
// the request the iterator does not advance and the error is returned.
// Deprecated: Use NextWithContext() instead.
func (iter *AvailableProviderOperationsIterator) Next() error {
	return iter.NextWithContext(context.Background())
}

// NotDone returns true if the enumeration should be started or is not yet complete.
func (iter AvailableProviderOperationsIterator) NotDone() bool {
	return iter.page.NotDone() && iter.i < len(iter.page.Values())
}

// Response returns the raw server response from the last page request.
func (iter AvailableProviderOperationsIterator) Response() AvailableProviderOperations {
	return iter.page.Response()
}

// Value returns the current value or a zero-initialized value if the
// iterator has advanced beyond the end of the collection.
func (iter AvailableProviderOperationsIterator) Value() AvailableProviderOperation {
	if !iter.page.NotDone() {
		return AvailableProviderOperation{}
	}
	return iter.page.Values()[iter.i]
}

// Creates a new instance of the AvailableProviderOperationsIterator type.
func NewAvailableProviderOperationsIterator(page AvailableProviderOperationsPage) AvailableProviderOperationsIterator {
	return AvailableProviderOperationsIterator{page: page}
}

// IsEmpty returns true if the ListResult contains no values.
func (apo AvailableProviderOperations) IsEmpty() bool {
	return apo.Value == nil || len(*apo.Value) == 0
}

// hasNextLink returns true if the NextLink is not empty.
func (apo AvailableProviderOperations) hasNextLink() bool {
	return apo.NextLink != nil && len(*apo.NextLink) != 0
}

// availableProviderOperationsPreparer prepares a request to retrieve the next set of results.
// It returns nil if no more results exist.
func (apo AvailableProviderOperations) availableProviderOperationsPreparer(ctx context.Context) (*http.Request, error) {
	if !apo.hasNextLink() {
		return nil, nil
	}
	return autorest.Prepare((&http.Request{}).WithContext(ctx),
		autorest.AsJSON(),
		autorest.AsGet(),
		autorest.WithBaseURL(to.String(apo.NextLink)))
}

// AvailableProviderOperationsPage contains a page of AvailableProviderOperation values.
type AvailableProviderOperationsPage struct {
	fn  func(context.Context, AvailableProviderOperations) (AvailableProviderOperations, error)
	apo AvailableProviderOperations
}

// NextWithContext advances to the next page of values.  If there was an error making
// the request the page does not advance and the error is returned.
func (page *AvailableProviderOperationsPage) NextWithContext(ctx context.Context) (err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/AvailableProviderOperationsPage.NextWithContext")
		defer func() {
			sc := -1
			if page.Response().Response.Response != nil {
				sc = page.Response().Response.Response.StatusCode
			}
			tracing.EndSpan(ctx, sc, err)
		}()
	}
	for {
		next, err := page.fn(ctx, page.apo)
		if err != nil {
			return err
		}
		page.apo = next
		if !next.hasNextLink() || !next.IsEmpty() {
			break
		}
	}
	return nil
}

// Next advances to the next page of values.  If there was an error making
// the request the page does not advance and the error is returned.
// Deprecated: Use NextWithContext() instead.
func (page *AvailableProviderOperationsPage) Next() error {
	return page.NextWithContext(context.Background())
}

// NotDone returns true if the page enumeration should be started or is not yet complete.
func (page AvailableProviderOperationsPage) NotDone() bool {
	return !page.apo.IsEmpty()
}

// Response returns the raw server response from the last page request.
func (page AvailableProviderOperationsPage) Response() AvailableProviderOperations {
	return page.apo
}

// Values returns the slice of values for the current page or nil if there are no values.
func (page AvailableProviderOperationsPage) Values() []AvailableProviderOperation {
	if page.apo.IsEmpty() {
		return nil
	}
	return *page.apo.Value
}

// Creates a new instance of the AvailableProviderOperationsPage type.
func NewAvailableProviderOperationsPage(cur AvailableProviderOperations, getNextPage func(context.Context, AvailableProviderOperations) (AvailableProviderOperations, error)) AvailableProviderOperationsPage {
	return AvailableProviderOperationsPage{
		fn:  getNextPage,
		apo: cur,
	}
}

// CustomerSecret the pair of customer secret.
type CustomerSecret struct {
	// KeyIdentifier - The identifier to the data service input object which this secret corresponds to.
	KeyIdentifier *string `json:"keyIdentifier,omitempty"`
	// KeyValue - It contains the encrypted customer secret.
	KeyValue *string `json:"keyValue,omitempty"`
	// Algorithm - The encryption algorithm used to encrypt data. Possible values include: 'SupportedAlgorithmNone', 'SupportedAlgorithmRSA15', 'SupportedAlgorithmRSAOAEP', 'SupportedAlgorithmPlainText'
	Algorithm SupportedAlgorithm `json:"algorithm,omitempty"`
}

// DataManager the DataManager resource.
type DataManager struct {
	autorest.Response `json:"-"`
	// Etag - Etag of the Resource.
	Etag *string `json:"etag,omitempty"`
	// ID - READ-ONLY; The Resource Id.
	ID *string `json:"id,omitempty"`
	// Name - READ-ONLY; The Resource Name.
	Name *string `json:"name,omitempty"`
	// Type - READ-ONLY; The Resource type.
	Type *string `json:"type,omitempty"`
	// Location - The location of the resource. This will be one of the supported and registered Azure Geo Regions (e.g. West US, East
	// US, Southeast Asia, etc.). The geo region of a resource cannot be changed once it is created, but if an identical geo
	// region is specified on update the request will succeed.
	Location *string `json:"location,omitempty"`
	// Tags - The list of key value pairs that describe the resource. These tags can be used in viewing and grouping this resource
	// (across resource groups).
	Tags map[string]*string `json:"tags"`
	// Sku - The sku type.
	Sku *Sku `json:"sku,omitempty"`
}

// MarshalJSON is the custom marshaler for DataManager.
func (dm DataManager) MarshalJSON() ([]byte, error) {
	objectMap := make(map[string]interface{})
	if dm.Etag != nil {
		objectMap["etag"] = dm.Etag
	}
	if dm.Location != nil {
		objectMap["location"] = dm.Location
	}
	if dm.Tags != nil {
		objectMap["tags"] = dm.Tags
	}
	if dm.Sku != nil {
		objectMap["sku"] = dm.Sku
	}
	return json.Marshal(objectMap)
}

// DataManagerList dataManager resources Collection.
type DataManagerList struct {
	autorest.Response `json:"-"`
	// Value - List of data manager resources.
	Value *[]DataManager `json:"value,omitempty"`
	// NextLink - Link for the next set of data stores.
	NextLink *string `json:"nextLink,omitempty"`
}

// DataManagersCreateFuture an abstraction for monitoring and retrieving the results of a long-running
// operation.
type DataManagersCreateFuture struct {
	azure.FutureAPI
	// Result returns the result of the asynchronous operation.
	// If the operation has not completed it will return an error.
	Result func(DataManagersClient) (DataManager, error)
}

// UnmarshalJSON is the custom unmarshaller for CreateFuture.
func (future *DataManagersCreateFuture) UnmarshalJSON(body []byte) error {
	var azFuture azure.Future
	if err := json.Unmarshal(body, &azFuture); err != nil {
		return err
	}
	future.FutureAPI = &azFuture
	future.Result = future.result
	return nil
}

// result is the default implementation for DataManagersCreateFuture.Result.
func (future *DataManagersCreateFuture) result(client DataManagersClient) (dm DataManager, err error) {
	var done bool
	done, err = future.DoneWithContext(context.Background(), client)
	if err != nil {
		err = autorest.NewErrorWithError(err, "hybriddata.DataManagersCreateFuture", "Result", future.Response(), "Polling failure")
		return
	}
	if !done {
		dm.Response.Response = future.Response()
		err = azure.NewAsyncOpIncompleteError("hybriddata.DataManagersCreateFuture")
		return
	}
	sender := autorest.DecorateSender(client, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))
	if dm.Response.Response, err = future.GetResult(sender); err == nil && dm.Response.Response.StatusCode != http.StatusNoContent {
		dm, err = client.CreateResponder(dm.Response.Response)
		if err != nil {
			err = autorest.NewErrorWithError(err, "hybriddata.DataManagersCreateFuture", "Result", dm.Response.Response, "Failure responding to request")
		}
	}
	return
}

// DataManagersDeleteFuture an abstraction for monitoring and retrieving the results of a long-running
// operation.
type DataManagersDeleteFuture struct {
	azure.FutureAPI
	// Result returns the result of the asynchronous operation.
	// If the operation has not completed it will return an error.
	Result func(DataManagersClient) (autorest.Response, error)
}

// UnmarshalJSON is the custom unmarshaller for CreateFuture.
func (future *DataManagersDeleteFuture) UnmarshalJSON(body []byte) error {
	var azFuture azure.Future
	if err := json.Unmarshal(body, &azFuture); err != nil {
		return err
	}
	future.FutureAPI = &azFuture
	future.Result = future.result
	return nil
}

// result is the default implementation for DataManagersDeleteFuture.Result.
func (future *DataManagersDeleteFuture) result(client DataManagersClient) (ar autorest.Response, err error) {
	var done bool
	done, err = future.DoneWithContext(context.Background(), client)
	if err != nil {
		err = autorest.NewErrorWithError(err, "hybriddata.DataManagersDeleteFuture", "Result", future.Response(), "Polling failure")
		return
	}
	if !done {
		ar.Response = future.Response()
		err = azure.NewAsyncOpIncompleteError("hybriddata.DataManagersDeleteFuture")
		return
	}
	ar.Response = future.Response()
	return
}

// DataManagersUpdateFuture an abstraction for monitoring and retrieving the results of a long-running
// operation.
type DataManagersUpdateFuture struct {
	azure.FutureAPI
	// Result returns the result of the asynchronous operation.
	// If the operation has not completed it will return an error.
	Result func(DataManagersClient) (DataManager, error)
}

// UnmarshalJSON is the custom unmarshaller for CreateFuture.
func (future *DataManagersUpdateFuture) UnmarshalJSON(body []byte) error {
	var azFuture azure.Future
	if err := json.Unmarshal(body, &azFuture); err != nil {
		return err
	}
	future.FutureAPI = &azFuture
	future.Result = future.result
	return nil
}

// result is the default implementation for DataManagersUpdateFuture.Result.
func (future *DataManagersUpdateFuture) result(client DataManagersClient) (dm DataManager, err error) {
	var done bool
	done, err = future.DoneWithContext(context.Background(), client)
	if err != nil {
		err = autorest.NewErrorWithError(err, "hybriddata.DataManagersUpdateFuture", "Result", future.Response(), "Polling failure")
		return
	}
	if !done {
		dm.Response.Response = future.Response()
		err = azure.NewAsyncOpIncompleteError("hybriddata.DataManagersUpdateFuture")
		return
	}
	sender := autorest.DecorateSender(client, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))
	if dm.Response.Response, err = future.GetResult(sender); err == nil && dm.Response.Response.StatusCode != http.StatusNoContent {
		dm, err = client.UpdateResponder(dm.Response.Response)
		if err != nil {
			err = autorest.NewErrorWithError(err, "hybriddata.DataManagersUpdateFuture", "Result", dm.Response.Response, "Failure responding to request")
		}
	}
	return
}

// DataManagerUpdateParameter the DataManagerUpdateParameter.
type DataManagerUpdateParameter struct {
	// Sku - The sku type.
	Sku *Sku `json:"sku,omitempty"`
	// Tags - The list of key value pairs that describe the resource. These tags can be used in viewing and grouping this resource
	// (across resource groups).
	Tags map[string]*string `json:"tags"`
}

// MarshalJSON is the custom marshaler for DataManagerUpdateParameter.
func (dmup DataManagerUpdateParameter) MarshalJSON() ([]byte, error) {
	objectMap := make(map[string]interface{})
	if dmup.Sku != nil {
		objectMap["sku"] = dmup.Sku
	}
	if dmup.Tags != nil {
		objectMap["tags"] = dmup.Tags
	}
	return json.Marshal(objectMap)
}

// DataService data Service.
type DataService struct {
	autorest.Response `json:"-"`
	// DataServiceProperties - DataService properties.
	*DataServiceProperties `json:"properties,omitempty"`
	// Name - READ-ONLY; Name of the object.
	Name *string `json:"name,omitempty"`
	// ID - READ-ONLY; Id of the object.
	ID *string `json:"id,omitempty"`
	// Type - READ-ONLY; Type of the object.
	Type *string `json:"type,omitempty"`
}

// MarshalJSON is the custom marshaler for DataService.
func (ds DataService) MarshalJSON() ([]byte, error) {
	objectMap := make(map[string]interface{})
	if ds.DataServiceProperties != nil {
		objectMap["properties"] = ds.DataServiceProperties
	}
	return json.Marshal(objectMap)
}

// UnmarshalJSON is the custom unmarshaler for DataService struct.
func (ds *DataService) UnmarshalJSON(body []byte) error {
	var m map[string]*json.RawMessage
	err := json.Unmarshal(body, &m)
	if err != nil {
		return err
	}
	for k, v := range m {
		switch k {
		case "properties":
			if v != nil {
				var dataServiceProperties DataServiceProperties
				err = json.Unmarshal(*v, &dataServiceProperties)
				if err != nil {
					return err
				}
				ds.DataServiceProperties = &dataServiceProperties
			}
		case "name":
			if v != nil {
				var name string
				err = json.Unmarshal(*v, &name)
				if err != nil {
					return err
				}
				ds.Name = &name
			}
		case "id":
			if v != nil {
				var ID string
				err = json.Unmarshal(*v, &ID)
				if err != nil {
					return err
				}
				ds.ID = &ID
			}
		case "type":
			if v != nil {
				var typeVar string
				err = json.Unmarshal(*v, &typeVar)
				if err != nil {
					return err
				}
				ds.Type = &typeVar
			}
		}
	}

	return nil
}

// DataServiceList data Service Collection.
type DataServiceList struct {
	autorest.Response `json:"-"`
	// Value - List of data services.
	Value *[]DataService `json:"value,omitempty"`
	// NextLink - Link for the next set of data services.
	NextLink *string `json:"nextLink,omitempty"`
}

// DataServiceListIterator provides access to a complete listing of DataService values.
type DataServiceListIterator struct {
	i    int
	page DataServiceListPage
}

// NextWithContext advances to the next value.  If there was an error making
// the request the iterator does not advance and the error is returned.
func (iter *DataServiceListIterator) NextWithContext(ctx context.Context) (err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/DataServiceListIterator.NextWithContext")
		defer func() {
			sc := -1
			if iter.Response().Response.Response != nil {
				sc = iter.Response().Response.Response.StatusCode
			}
			tracing.EndSpan(ctx, sc, err)
		}()
	}
	iter.i++
	if iter.i < len(iter.page.Values()) {
		return nil
	}
	err = iter.page.NextWithContext(ctx)
	if err != nil {
		iter.i--
		return err
	}
	iter.i = 0
	return nil
}

// Next advances to the next value.  If there was an error making
// the request the iterator does not advance and the error is returned.
// Deprecated: Use NextWithContext() instead.
func (iter *DataServiceListIterator) Next() error {
	return iter.NextWithContext(context.Background())
}

// NotDone returns true if the enumeration should be started or is not yet complete.
func (iter DataServiceListIterator) NotDone() bool {
	return iter.page.NotDone() && iter.i < len(iter.page.Values())
}

// Response returns the raw server response from the last page request.
func (iter DataServiceListIterator) Response() DataServiceList {
	return iter.page.Response()
}

// Value returns the current value or a zero-initialized value if the
// iterator has advanced beyond the end of the collection.
func (iter DataServiceListIterator) Value() DataService {
	if !iter.page.NotDone() {
		return DataService{}
	}
	return iter.page.Values()[iter.i]
}

// Creates a new instance of the DataServiceListIterator type.
func NewDataServiceListIterator(page DataServiceListPage) DataServiceListIterator {
	return DataServiceListIterator{page: page}
}

// IsEmpty returns true if the ListResult contains no values.
func (dsl DataServiceList) IsEmpty() bool {
	return dsl.Value == nil || len(*dsl.Value) == 0
}

// hasNextLink returns true if the NextLink is not empty.
func (dsl DataServiceList) hasNextLink() bool {
	return dsl.NextLink != nil && len(*dsl.NextLink) != 0
}

// dataServiceListPreparer prepares a request to retrieve the next set of results.
// It returns nil if no more results exist.
func (dsl DataServiceList) dataServiceListPreparer(ctx context.Context) (*http.Request, error) {
	if !dsl.hasNextLink() {
		return nil, nil
	}
	return autorest.Prepare((&http.Request{}).WithContext(ctx),
		autorest.AsJSON(),
		autorest.AsGet(),
		autorest.WithBaseURL(to.String(dsl.NextLink)))
}

// DataServiceListPage contains a page of DataService values.
type DataServiceListPage struct {
	fn  func(context.Context, DataServiceList) (DataServiceList, error)
	dsl DataServiceList
}

// NextWithContext advances to the next page of values.  If there was an error making
// the request the page does not advance and the error is returned.
func (page *DataServiceListPage) NextWithContext(ctx context.Context) (err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/DataServiceListPage.NextWithContext")
		defer func() {
			sc := -1
			if page.Response().Response.Response != nil {
				sc = page.Response().Response.Response.StatusCode
			}
			tracing.EndSpan(ctx, sc, err)
		}()
	}
	for {
		next, err := page.fn(ctx, page.dsl)
		if err != nil {
			return err
		}
		page.dsl = next
		if !next.hasNextLink() || !next.IsEmpty() {
			break
		}
	}
	return nil
}

// Next advances to the next page of values.  If there was an error making
// the request the page does not advance and the error is returned.
// Deprecated: Use NextWithContext() instead.
func (page *DataServiceListPage) Next() error {
	return page.NextWithContext(context.Background())
}

// NotDone returns true if the page enumeration should be started or is not yet complete.
func (page DataServiceListPage) NotDone() bool {
	return !page.dsl.IsEmpty()
}

// Response returns the raw server response from the last page request.
func (page DataServiceListPage) Response() DataServiceList {
	return page.dsl
}

// Values returns the slice of values for the current page or nil if there are no values.
func (page DataServiceListPage) Values() []DataService {
	if page.dsl.IsEmpty() {
		return nil
	}
	return *page.dsl.Value
}

// Creates a new instance of the DataServiceListPage type.
func NewDataServiceListPage(cur DataServiceList, getNextPage func(context.Context, DataServiceList) (DataServiceList, error)) DataServiceListPage {
	return DataServiceListPage{
		fn:  getNextPage,
		dsl: cur,
	}
}

// DataServiceProperties data Service properties.
type DataServiceProperties struct {
	// State - State of the data service. Possible values include: 'Disabled', 'Enabled', 'Supported'
	State State `json:"state,omitempty"`
	// SupportedDataSinkTypes - Supported data store types which can be used as a sink.
	SupportedDataSinkTypes *[]string `json:"supportedDataSinkTypes,omitempty"`
	// SupportedDataSourceTypes - Supported data store types which can be used as a source.
	SupportedDataSourceTypes *[]string `json:"supportedDataSourceTypes,omitempty"`
}

// DataStore data store.
type DataStore struct {
	autorest.Response `json:"-"`
	// DataStoreProperties - DataStore properties.
	*DataStoreProperties `json:"properties,omitempty"`
	// Name - READ-ONLY; Name of the object.
	Name *string `json:"name,omitempty"`
	// ID - READ-ONLY; Id of the object.
	ID *string `json:"id,omitempty"`
	// Type - READ-ONLY; Type of the object.
	Type *string `json:"type,omitempty"`
}

// MarshalJSON is the custom marshaler for DataStore.
func (ds DataStore) MarshalJSON() ([]byte, error) {
	objectMap := make(map[string]interface{})
	if ds.DataStoreProperties != nil {
		objectMap["properties"] = ds.DataStoreProperties
	}
	return json.Marshal(objectMap)
}

// UnmarshalJSON is the custom unmarshaler for DataStore struct.
func (ds *DataStore) UnmarshalJSON(body []byte) error {
	var m map[string]*json.RawMessage
	err := json.Unmarshal(body, &m)
	if err != nil {
		return err
	}
	for k, v := range m {
		switch k {
		case "properties":
			if v != nil {
				var dataStoreProperties DataStoreProperties
				err = json.Unmarshal(*v, &dataStoreProperties)
				if err != nil {
					return err
				}
				ds.DataStoreProperties = &dataStoreProperties
			}
		case "name":
			if v != nil {
				var name string
				err = json.Unmarshal(*v, &name)
				if err != nil {
					return err
				}
				ds.Name = &name
			}
		case "id":
			if v != nil {
				var ID string
				err = json.Unmarshal(*v, &ID)
				if err != nil {
					return err
				}
				ds.ID = &ID
			}
		case "type":
			if v != nil {
				var typeVar string
				err = json.Unmarshal(*v, &typeVar)
				if err != nil {
					return err
				}
				ds.Type = &typeVar
			}
		}
	}

	return nil
}

// DataStoreFilter contains the information about the filters for the DataStore.
type DataStoreFilter struct {
	// DataStoreTypeID - The data store type id.
	DataStoreTypeID *string `json:"dataStoreTypeId,omitempty"`
}

// DataStoreList data Store Collection.
type DataStoreList struct {
	autorest.Response `json:"-"`
	// Value - List of data stores.
	Value *[]DataStore `json:"value,omitempty"`
	// NextLink - Link for the next set of data stores.
	NextLink *string `json:"nextLink,omitempty"`
}

// DataStoreListIterator provides access to a complete listing of DataStore values.
type DataStoreListIterator struct {
	i    int
	page DataStoreListPage
}

// NextWithContext advances to the next value.  If there was an error making
// the request the iterator does not advance and the error is returned.
func (iter *DataStoreListIterator) NextWithContext(ctx context.Context) (err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/DataStoreListIterator.NextWithContext")
		defer func() {
			sc := -1
			if iter.Response().Response.Response != nil {
				sc = iter.Response().Response.Response.StatusCode
			}
			tracing.EndSpan(ctx, sc, err)
		}()
	}
	iter.i++
	if iter.i < len(iter.page.Values()) {
		return nil
	}
	err = iter.page.NextWithContext(ctx)
	if err != nil {
		iter.i--
		return err
	}
	iter.i = 0
	return nil
}

// Next advances to the next value.  If there was an error making
// the request the iterator does not advance and the error is returned.
// Deprecated: Use NextWithContext() instead.
func (iter *DataStoreListIterator) Next() error {
	return iter.NextWithContext(context.Background())
}

// NotDone returns true if the enumeration should be started or is not yet complete.
func (iter DataStoreListIterator) NotDone() bool {
	return iter.page.NotDone() && iter.i < len(iter.page.Values())
}

// Response returns the raw server response from the last page request.
func (iter DataStoreListIterator) Response() DataStoreList {
	return iter.page.Response()
}

// Value returns the current value or a zero-initialized value if the
// iterator has advanced beyond the end of the collection.
func (iter DataStoreListIterator) Value() DataStore {
	if !iter.page.NotDone() {
		return DataStore{}
	}
	return iter.page.Values()[iter.i]
}

// Creates a new instance of the DataStoreListIterator type.
func NewDataStoreListIterator(page DataStoreListPage) DataStoreListIterator {
	return DataStoreListIterator{page: page}
}

// IsEmpty returns true if the ListResult contains no values.
func (dsl DataStoreList) IsEmpty() bool {
	return dsl.Value == nil || len(*dsl.Value) == 0
}

// hasNextLink returns true if the NextLink is not empty.
func (dsl DataStoreList) hasNextLink() bool {
	return dsl.NextLink != nil && len(*dsl.NextLink) != 0
}

// dataStoreListPreparer prepares a request to retrieve the next set of results.
// It returns nil if no more results exist.
func (dsl DataStoreList) dataStoreListPreparer(ctx context.Context) (*http.Request, error) {
	if !dsl.hasNextLink() {
		return nil, nil
	}
	return autorest.Prepare((&http.Request{}).WithContext(ctx),
		autorest.AsJSON(),
		autorest.AsGet(),
		autorest.WithBaseURL(to.String(dsl.NextLink)))
}

// DataStoreListPage contains a page of DataStore values.
type DataStoreListPage struct {
	fn  func(context.Context, DataStoreList) (DataStoreList, error)
	dsl DataStoreList
}

// NextWithContext advances to the next page of values.  If there was an error making
// the request the page does not advance and the error is returned.
func (page *DataStoreListPage) NextWithContext(ctx context.Context) (err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/DataStoreListPage.NextWithContext")
		defer func() {
			sc := -1
			if page.Response().Response.Response != nil {
				sc = page.Response().Response.Response.StatusCode
			}
			tracing.EndSpan(ctx, sc, err)
		}()
	}
	for {
		next, err := page.fn(ctx, page.dsl)
		if err != nil {
			return err
		}
		page.dsl = next
		if !next.hasNextLink() || !next.IsEmpty() {
			break
		}
	}
	return nil
}

// Next advances to the next page of values.  If there was an error making
// the request the page does not advance and the error is returned.
// Deprecated: Use NextWithContext() instead.
func (page *DataStoreListPage) Next() error {
	return page.NextWithContext(context.Background())
}

// NotDone returns true if the page enumeration should be started or is not yet complete.
func (page DataStoreListPage) NotDone() bool {
	return !page.dsl.IsEmpty()
}

// Response returns the raw server response from the last page request.
func (page DataStoreListPage) Response() DataStoreList {
	return page.dsl
}

// Values returns the slice of values for the current page or nil if there are no values.
func (page DataStoreListPage) Values() []DataStore {
	if page.dsl.IsEmpty() {
		return nil
	}
	return *page.dsl.Value
}

// Creates a new instance of the DataStoreListPage type.
func NewDataStoreListPage(cur DataStoreList, getNextPage func(context.Context, DataStoreList) (DataStoreList, error)) DataStoreListPage {
	return DataStoreListPage{
		fn:  getNextPage,
		dsl: cur,
	}
}

// DataStoreProperties data Store for sources and sinks
type DataStoreProperties struct {
	// RepositoryID - Arm Id for the manager resource to which the data source is associated. This is optional.
	RepositoryID *string `json:"repositoryId,omitempty"`
	// State - State of the data source. Possible values include: 'Disabled', 'Enabled', 'Supported'
	State State `json:"state,omitempty"`
	// ExtendedProperties - A generic json used differently by each data source type.
	ExtendedProperties interface{} `json:"extendedProperties,omitempty"`
	// DataStoreTypeID - The arm id of the data store type.
	DataStoreTypeID *string `json:"dataStoreTypeId,omitempty"`
	// CustomerSecrets - List of customer secrets containing a key identifier and key value. The key identifier is a way for the specific data source to understand the key. Value contains customer secret encrypted by the encryptionKeys.
	CustomerSecrets *[]CustomerSecret `json:"customerSecrets,omitempty"`
}

// DataStoresCreateOrUpdateFuture an abstraction for monitoring and retrieving the results of a
// long-running operation.
type DataStoresCreateOrUpdateFuture struct {
	azure.FutureAPI
	// Result returns the result of the asynchronous operation.
	// If the operation has not completed it will return an error.
	Result func(DataStoresClient) (DataStore, error)
}

// UnmarshalJSON is the custom unmarshaller for CreateFuture.
func (future *DataStoresCreateOrUpdateFuture) UnmarshalJSON(body []byte) error {
	var azFuture azure.Future
	if err := json.Unmarshal(body, &azFuture); err != nil {
		return err
	}
	future.FutureAPI = &azFuture
	future.Result = future.result
	return nil
}

// result is the default implementation for DataStoresCreateOrUpdateFuture.Result.
func (future *DataStoresCreateOrUpdateFuture) result(client DataStoresClient) (ds DataStore, err error) {
	var done bool
	done, err = future.DoneWithContext(context.Background(), client)
	if err != nil {
		err = autorest.NewErrorWithError(err, "hybriddata.DataStoresCreateOrUpdateFuture", "Result", future.Response(), "Polling failure")
		return
	}
	if !done {
		ds.Response.Response = future.Response()
		err = azure.NewAsyncOpIncompleteError("hybriddata.DataStoresCreateOrUpdateFuture")
		return
	}
	sender := autorest.DecorateSender(client, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))
	if ds.Response.Response, err = future.GetResult(sender); err == nil && ds.Response.Response.StatusCode != http.StatusNoContent {
		ds, err = client.CreateOrUpdateResponder(ds.Response.Response)
		if err != nil {
			err = autorest.NewErrorWithError(err, "hybriddata.DataStoresCreateOrUpdateFuture", "Result", ds.Response.Response, "Failure responding to request")
		}
	}
	return
}

// DataStoresDeleteFuture an abstraction for monitoring and retrieving the results of a long-running
// operation.
type DataStoresDeleteFuture struct {
	azure.FutureAPI
	// Result returns the result of the asynchronous operation.
	// If the operation has not completed it will return an error.
	Result func(DataStoresClient) (autorest.Response, error)
}

// UnmarshalJSON is the custom unmarshaller for CreateFuture.
func (future *DataStoresDeleteFuture) UnmarshalJSON(body []byte) error {
	var azFuture azure.Future
	if err := json.Unmarshal(body, &azFuture); err != nil {
		return err
	}
	future.FutureAPI = &azFuture
	future.Result = future.result
	return nil
}

// result is the default implementation for DataStoresDeleteFuture.Result.
func (future *DataStoresDeleteFuture) result(client DataStoresClient) (ar autorest.Response, err error) {
	var done bool
	done, err = future.DoneWithContext(context.Background(), client)
	if err != nil {
		err = autorest.NewErrorWithError(err, "hybriddata.DataStoresDeleteFuture", "Result", future.Response(), "Polling failure")
		return
	}
	if !done {
		ar.Response = future.Response()
		err = azure.NewAsyncOpIncompleteError("hybriddata.DataStoresDeleteFuture")
		return
	}
	ar.Response = future.Response()
	return
}

// DataStoreType data Store Type.
type DataStoreType struct {
	autorest.Response `json:"-"`
	// DataStoreTypeProperties - DataStoreType properties.
	*DataStoreTypeProperties `json:"properties,omitempty"`
	// Name - READ-ONLY; Name of the object.
	Name *string `json:"name,omitempty"`
	// ID - READ-ONLY; Id of the object.
	ID *string `json:"id,omitempty"`
	// Type - READ-ONLY; Type of the object.
	Type *string `json:"type,omitempty"`
}

// MarshalJSON is the custom marshaler for DataStoreType.
func (dst DataStoreType) MarshalJSON() ([]byte, error) {
	objectMap := make(map[string]interface{})
	if dst.DataStoreTypeProperties != nil {
		objectMap["properties"] = dst.DataStoreTypeProperties
	}
	return json.Marshal(objectMap)
}

// UnmarshalJSON is the custom unmarshaler for DataStoreType struct.
func (dst *DataStoreType) UnmarshalJSON(body []byte) error {
	var m map[string]*json.RawMessage
	err := json.Unmarshal(body, &m)
	if err != nil {
		return err
	}
	for k, v := range m {
		switch k {
		case "properties":
			if v != nil {
				var dataStoreTypeProperties DataStoreTypeProperties
				err = json.Unmarshal(*v, &dataStoreTypeProperties)
				if err != nil {
					return err
				}
				dst.DataStoreTypeProperties = &dataStoreTypeProperties
			}
		case "name":
			if v != nil {
				var name string
				err = json.Unmarshal(*v, &name)
				if err != nil {
					return err
				}
				dst.Name = &name
			}
		case "id":
			if v != nil {
				var ID string
				err = json.Unmarshal(*v, &ID)
				if err != nil {
					return err
				}
				dst.ID = &ID
			}
		case "type":
			if v != nil {
				var typeVar string
				err = json.Unmarshal(*v, &typeVar)
				if err != nil {
					return err
				}
				dst.Type = &typeVar
			}
		}
	}

	return nil
}

// DataStoreTypeList data Store Type Collection.
type DataStoreTypeList struct {
	autorest.Response `json:"-"`
	// Value - List of DataStoreType.
	Value *[]DataStoreType `json:"value,omitempty"`
	// NextLink - Link for the next set of data store types.
	NextLink *string `json:"nextLink,omitempty"`
}

// DataStoreTypeListIterator provides access to a complete listing of DataStoreType values.
type DataStoreTypeListIterator struct {
	i    int
	page DataStoreTypeListPage
}

// NextWithContext advances to the next value.  If there was an error making
// the request the iterator does not advance and the error is returned.
func (iter *DataStoreTypeListIterator) NextWithContext(ctx context.Context) (err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/DataStoreTypeListIterator.NextWithContext")
		defer func() {
			sc := -1
			if iter.Response().Response.Response != nil {
				sc = iter.Response().Response.Response.StatusCode
			}
			tracing.EndSpan(ctx, sc, err)
		}()
	}
	iter.i++
	if iter.i < len(iter.page.Values()) {
		return nil
	}
	err = iter.page.NextWithContext(ctx)
	if err != nil {
		iter.i--
		return err
	}
	iter.i = 0
	return nil
}

// Next advances to the next value.  If there was an error making
// the request the iterator does not advance and the error is returned.
// Deprecated: Use NextWithContext() instead.
func (iter *DataStoreTypeListIterator) Next() error {
	return iter.NextWithContext(context.Background())
}

// NotDone returns true if the enumeration should be started or is not yet complete.
func (iter DataStoreTypeListIterator) NotDone() bool {
	return iter.page.NotDone() && iter.i < len(iter.page.Values())
}

// Response returns the raw server response from the last page request.
func (iter DataStoreTypeListIterator) Response() DataStoreTypeList {
	return iter.page.Response()
}

// Value returns the current value or a zero-initialized value if the
// iterator has advanced beyond the end of the collection.
func (iter DataStoreTypeListIterator) Value() DataStoreType {
	if !iter.page.NotDone() {
		return DataStoreType{}
	}
	return iter.page.Values()[iter.i]
}

// Creates a new instance of the DataStoreTypeListIterator type.
func NewDataStoreTypeListIterator(page DataStoreTypeListPage) DataStoreTypeListIterator {
	return DataStoreTypeListIterator{page: page}
}

// IsEmpty returns true if the ListResult contains no values.
func (dstl DataStoreTypeList) IsEmpty() bool {
	return dstl.Value == nil || len(*dstl.Value) == 0
}

// hasNextLink returns true if the NextLink is not empty.
func (dstl DataStoreTypeList) hasNextLink() bool {
	return dstl.NextLink != nil && len(*dstl.NextLink) != 0
}

// dataStoreTypeListPreparer prepares a request to retrieve the next set of results.
// It returns nil if no more results exist.
func (dstl DataStoreTypeList) dataStoreTypeListPreparer(ctx context.Context) (*http.Request, error) {
	if !dstl.hasNextLink() {
		return nil, nil
	}
	return autorest.Prepare((&http.Request{}).WithContext(ctx),
		autorest.AsJSON(),
		autorest.AsGet(),
		autorest.WithBaseURL(to.String(dstl.NextLink)))
}

// DataStoreTypeListPage contains a page of DataStoreType values.
type DataStoreTypeListPage struct {
	fn   func(context.Context, DataStoreTypeList) (DataStoreTypeList, error)
	dstl DataStoreTypeList
}

// NextWithContext advances to the next page of values.  If there was an error making
// the request the page does not advance and the error is returned.
func (page *DataStoreTypeListPage) NextWithContext(ctx context.Context) (err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/DataStoreTypeListPage.NextWithContext")
		defer func() {
			sc := -1
			if page.Response().Response.Response != nil {
				sc = page.Response().Response.Response.StatusCode
			}
			tracing.EndSpan(ctx, sc, err)
		}()
	}
	for {
		next, err := page.fn(ctx, page.dstl)
		if err != nil {
			return err
		}
		page.dstl = next
		if !next.hasNextLink() || !next.IsEmpty() {
			break
		}
	}
	return nil
}

// Next advances to the next page of values.  If there was an error making
// the request the page does not advance and the error is returned.
// Deprecated: Use NextWithContext() instead.
func (page *DataStoreTypeListPage) Next() error {
	return page.NextWithContext(context.Background())
}

// NotDone returns true if the page enumeration should be started or is not yet complete.
func (page DataStoreTypeListPage) NotDone() bool {
	return !page.dstl.IsEmpty()
}

// Response returns the raw server response from the last page request.
func (page DataStoreTypeListPage) Response() DataStoreTypeList {
	return page.dstl
}

// Values returns the slice of values for the current page or nil if there are no values.
func (page DataStoreTypeListPage) Values() []DataStoreType {
	if page.dstl.IsEmpty() {
		return nil
	}
	return *page.dstl.Value
}

// Creates a new instance of the DataStoreTypeListPage type.
func NewDataStoreTypeListPage(cur DataStoreTypeList, getNextPage func(context.Context, DataStoreTypeList) (DataStoreTypeList, error)) DataStoreTypeListPage {
	return DataStoreTypeListPage{
		fn:   getNextPage,
		dstl: cur,
	}
}

// DataStoreTypeProperties data Store Type properties.
type DataStoreTypeProperties struct {
	// RepositoryType - Arm type for the manager resource to which the data source type is associated. This is optional.
	RepositoryType *string `json:"repositoryType,omitempty"`
	// State - State of the data store type. Possible values include: 'Disabled', 'Enabled', 'Supported'
	State State `json:"state,omitempty"`
	// SupportedDataServicesAsSink - Supported data services where it can be used as a sink.
	SupportedDataServicesAsSink *[]string `json:"supportedDataServicesAsSink,omitempty"`
	// SupportedDataServicesAsSource - Supported data services where it can be used as a source.
	SupportedDataServicesAsSource *[]string `json:"supportedDataServicesAsSource,omitempty"`
}

// DmsBaseObject base class for all objects under DataManager Service
type DmsBaseObject struct {
	// Name - READ-ONLY; Name of the object.
	Name *string `json:"name,omitempty"`
	// ID - READ-ONLY; Id of the object.
	ID *string `json:"id,omitempty"`
	// Type - READ-ONLY; Type of the object.
	Type *string `json:"type,omitempty"`
}

// MarshalJSON is the custom marshaler for DmsBaseObject.
func (dbo DmsBaseObject) MarshalJSON() ([]byte, error) {
	objectMap := make(map[string]interface{})
	return json.Marshal(objectMap)
}

// Error top level error for the job.
type Error struct {
	// Code - Error code that can be used to programmatically identify the error.
	Code *string `json:"code,omitempty"`
	// Message - Describes the error in detail and provides debugging information.
	Message *string `json:"message,omitempty"`
}

// ErrorDetails error Details
type ErrorDetails struct {
	// ErrorMessage - Error message.
	ErrorMessage *string `json:"errorMessage,omitempty"`
	// ErrorCode - Error code.
	ErrorCode *int32 `json:"errorCode,omitempty"`
	// RecommendedAction - Recommended action for the error.
	RecommendedAction *string `json:"recommendedAction,omitempty"`
	// ExceptionMessage - Contains the non localized exception message
	ExceptionMessage *string `json:"exceptionMessage,omitempty"`
}

// Job data service job.
type Job struct {
	autorest.Response `json:"-"`
	// Status - Status of the job. Possible values include: 'None', 'InProgress', 'Succeeded', 'WaitingForAction', 'Failed', 'Cancelled', 'Cancelling', 'PartiallySucceeded'
	Status JobStatus `json:"status,omitempty"`
	// StartTime - Time at which the job was started in UTC ISO 8601 format.
	StartTime *date.Time `json:"startTime,omitempty"`
	// EndTime - Time at which the job ended in UTC ISO 8601 format.
	EndTime *date.Time `json:"endTime,omitempty"`
	// JobProperties - Job properties.
	*JobProperties `json:"properties,omitempty"`
	// Error - Top level error for the job.
	Error *Error `json:"error,omitempty"`
	// Name - READ-ONLY; Name of the object.
	Name *string `json:"name,omitempty"`
	// ID - READ-ONLY; Id of the object.
	ID *string `json:"id,omitempty"`
	// Type - READ-ONLY; Type of the object.
	Type *string `json:"type,omitempty"`
}

// MarshalJSON is the custom marshaler for Job.
func (j Job) MarshalJSON() ([]byte, error) {
	objectMap := make(map[string]interface{})
	if j.Status != "" {
		objectMap["status"] = j.Status
	}
	if j.StartTime != nil {
		objectMap["startTime"] = j.StartTime
	}
	if j.EndTime != nil {
		objectMap["endTime"] = j.EndTime
	}
	if j.JobProperties != nil {
		objectMap["properties"] = j.JobProperties
	}
	if j.Error != nil {
		objectMap["error"] = j.Error
	}
	return json.Marshal(objectMap)
}

// UnmarshalJSON is the custom unmarshaler for Job struct.
func (j *Job) UnmarshalJSON(body []byte) error {
	var m map[string]*json.RawMessage
	err := json.Unmarshal(body, &m)
	if err != nil {
		return err
	}
	for k, v := range m {
		switch k {
		case "status":
			if v != nil {
				var status JobStatus
				err = json.Unmarshal(*v, &status)
				if err != nil {
					return err
				}
				j.Status = status
			}
		case "startTime":
			if v != nil {
				var startTime date.Time
				err = json.Unmarshal(*v, &startTime)
				if err != nil {
					return err
				}
				j.StartTime = &startTime
			}
		case "endTime":
			if v != nil {
				var endTime date.Time
				err = json.Unmarshal(*v, &endTime)
				if err != nil {
					return err
				}
				j.EndTime = &endTime
			}
		case "properties":
			if v != nil {
				var jobProperties JobProperties
				err = json.Unmarshal(*v, &jobProperties)
				if err != nil {
					return err
				}
				j.JobProperties = &jobProperties
			}
		case "error":
			if v != nil {
				var errorVar Error
				err = json.Unmarshal(*v, &errorVar)
				if err != nil {
					return err
				}
				j.Error = &errorVar
			}
		case "name":
			if v != nil {
				var name string
				err = json.Unmarshal(*v, &name)
				if err != nil {
					return err
				}
				j.Name = &name
			}
		case "id":
			if v != nil {
				var ID string
				err = json.Unmarshal(*v, &ID)
				if err != nil {
					return err
				}
				j.ID = &ID
			}
		case "type":
			if v != nil {
				var typeVar string
				err = json.Unmarshal(*v, &typeVar)
				if err != nil {
					return err
				}
				j.Type = &typeVar
			}
		}
	}

	return nil
}

// JobDefinition job Definition.
type JobDefinition struct {
	autorest.Response `json:"-"`
	// JobDefinitionProperties - JobDefinition properties.
	*JobDefinitionProperties `json:"properties,omitempty"`
	// Name - READ-ONLY; Name of the object.
	Name *string `json:"name,omitempty"`
	// ID - READ-ONLY; Id of the object.
	ID *string `json:"id,omitempty"`
	// Type - READ-ONLY; Type of the object.
	Type *string `json:"type,omitempty"`
}

// MarshalJSON is the custom marshaler for JobDefinition.
func (jd JobDefinition) MarshalJSON() ([]byte, error) {
	objectMap := make(map[string]interface{})
	if jd.JobDefinitionProperties != nil {
		objectMap["properties"] = jd.JobDefinitionProperties
	}
	return json.Marshal(objectMap)
}

// UnmarshalJSON is the custom unmarshaler for JobDefinition struct.
func (jd *JobDefinition) UnmarshalJSON(body []byte) error {
	var m map[string]*json.RawMessage
	err := json.Unmarshal(body, &m)
	if err != nil {
		return err
	}
	for k, v := range m {
		switch k {
		case "properties":
			if v != nil {
				var jobDefinitionProperties JobDefinitionProperties
				err = json.Unmarshal(*v, &jobDefinitionProperties)
				if err != nil {
					return err
				}
				jd.JobDefinitionProperties = &jobDefinitionProperties
			}
		case "name":
			if v != nil {
				var name string
				err = json.Unmarshal(*v, &name)
				if err != nil {
					return err
				}
				jd.Name = &name
			}
		case "id":
			if v != nil {
				var ID string
				err = json.Unmarshal(*v, &ID)
				if err != nil {
					return err
				}
				jd.ID = &ID
			}
		case "type":
			if v != nil {
				var typeVar string
				err = json.Unmarshal(*v, &typeVar)
				if err != nil {
					return err
				}
				jd.Type = &typeVar
			}
		}
	}

	return nil
}

// JobDefinitionFilter contains the supported job definition filters.
type JobDefinitionFilter struct {
	// State - The state of the job definition. Possible values include: 'Disabled', 'Enabled', 'Supported'
	State State `json:"state,omitempty"`
	// DataSource - The data source associated with the job definition
	DataSource *string `json:"dataSource,omitempty"`
	// LastModified - The last modified date time of the data source.
	LastModified *date.Time `json:"lastModified,omitempty"`
}

// JobDefinitionList job Definition Collection.
type JobDefinitionList struct {
	autorest.Response `json:"-"`
	// Value - List of job definitions.
	Value *[]JobDefinition `json:"value,omitempty"`
	// NextLink - Link for the next set of job definitions.
	NextLink *string `json:"nextLink,omitempty"`
}

// JobDefinitionListIterator provides access to a complete listing of JobDefinition values.
type JobDefinitionListIterator struct {
	i    int
	page JobDefinitionListPage
}

// NextWithContext advances to the next value.  If there was an error making
// the request the iterator does not advance and the error is returned.
func (iter *JobDefinitionListIterator) NextWithContext(ctx context.Context) (err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/JobDefinitionListIterator.NextWithContext")
		defer func() {
			sc := -1
			if iter.Response().Response.Response != nil {
				sc = iter.Response().Response.Response.StatusCode
			}
			tracing.EndSpan(ctx, sc, err)
		}()
	}
	iter.i++
	if iter.i < len(iter.page.Values()) {
		return nil
	}
	err = iter.page.NextWithContext(ctx)
	if err != nil {
		iter.i--
		return err
	}
	iter.i = 0
	return nil
}

// Next advances to the next value.  If there was an error making
// the request the iterator does not advance and the error is returned.
// Deprecated: Use NextWithContext() instead.
func (iter *JobDefinitionListIterator) Next() error {
	return iter.NextWithContext(context.Background())
}

// NotDone returns true if the enumeration should be started or is not yet complete.
func (iter JobDefinitionListIterator) NotDone() bool {
	return iter.page.NotDone() && iter.i < len(iter.page.Values())
}

// Response returns the raw server response from the last page request.
func (iter JobDefinitionListIterator) Response() JobDefinitionList {
	return iter.page.Response()
}

// Value returns the current value or a zero-initialized value if the
// iterator has advanced beyond the end of the collection.
func (iter JobDefinitionListIterator) Value() JobDefinition {
	if !iter.page.NotDone() {
		return JobDefinition{}
	}
	return iter.page.Values()[iter.i]
}

// Creates a new instance of the JobDefinitionListIterator type.
func NewJobDefinitionListIterator(page JobDefinitionListPage) JobDefinitionListIterator {
	return JobDefinitionListIterator{page: page}
}

// IsEmpty returns true if the ListResult contains no values.
func (jdl JobDefinitionList) IsEmpty() bool {
	return jdl.Value == nil || len(*jdl.Value) == 0
}

// hasNextLink returns true if the NextLink is not empty.
func (jdl JobDefinitionList) hasNextLink() bool {
	return jdl.NextLink != nil && len(*jdl.NextLink) != 0
}

// jobDefinitionListPreparer prepares a request to retrieve the next set of results.
// It returns nil if no more results exist.
func (jdl JobDefinitionList) jobDefinitionListPreparer(ctx context.Context) (*http.Request, error) {
	if !jdl.hasNextLink() {
		return nil, nil
	}
	return autorest.Prepare((&http.Request{}).WithContext(ctx),
		autorest.AsJSON(),
		autorest.AsGet(),
		autorest.WithBaseURL(to.String(jdl.NextLink)))
}

// JobDefinitionListPage contains a page of JobDefinition values.
type JobDefinitionListPage struct {
	fn  func(context.Context, JobDefinitionList) (JobDefinitionList, error)
	jdl JobDefinitionList
}

// NextWithContext advances to the next page of values.  If there was an error making
// the request the page does not advance and the error is returned.
func (page *JobDefinitionListPage) NextWithContext(ctx context.Context) (err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/JobDefinitionListPage.NextWithContext")
		defer func() {
			sc := -1
			if page.Response().Response.Response != nil {
				sc = page.Response().Response.Response.StatusCode
			}
			tracing.EndSpan(ctx, sc, err)
		}()
	}
	for {
		next, err := page.fn(ctx, page.jdl)
		if err != nil {
			return err
		}
		page.jdl = next
		if !next.hasNextLink() || !next.IsEmpty() {
			break
		}
	}
	return nil
}

// Next advances to the next page of values.  If there was an error making
// the request the page does not advance and the error is returned.
// Deprecated: Use NextWithContext() instead.
func (page *JobDefinitionListPage) Next() error {
	return page.NextWithContext(context.Background())
}

// NotDone returns true if the page enumeration should be started or is not yet complete.
func (page JobDefinitionListPage) NotDone() bool {
	return !page.jdl.IsEmpty()
}

// Response returns the raw server response from the last page request.
func (page JobDefinitionListPage) Response() JobDefinitionList {
	return page.jdl
}

// Values returns the slice of values for the current page or nil if there are no values.
func (page JobDefinitionListPage) Values() []JobDefinition {
	if page.jdl.IsEmpty() {
		return nil
	}
	return *page.jdl.Value
}

// Creates a new instance of the JobDefinitionListPage type.
func NewJobDefinitionListPage(cur JobDefinitionList, getNextPage func(context.Context, JobDefinitionList) (JobDefinitionList, error)) JobDefinitionListPage {
	return JobDefinitionListPage{
		fn:  getNextPage,
		jdl: cur,
	}
}

// JobDefinitionProperties job Definition
type JobDefinitionProperties struct {
	// DataSourceID - Data Source Id associated to the job definition.
	DataSourceID *string `json:"dataSourceId,omitempty"`
	// DataSinkID - Data Sink Id associated to the job definition.
	DataSinkID *string `json:"dataSinkId,omitempty"`
	// Schedules - Schedule for running the job definition
	Schedules *[]Schedule `json:"schedules,omitempty"`
	// State - State of the job definition. Possible values include: 'Disabled', 'Enabled', 'Supported'
	State State `json:"state,omitempty"`
	// LastModifiedTime - Last modified time of the job definition.
	LastModifiedTime *date.Time `json:"lastModifiedTime,omitempty"`
	// RunLocation - This is the preferred geo location for the job to run. Possible values include: 'RunLocationNone', 'RunLocationAustraliaeast', 'RunLocationAustraliasoutheast', 'RunLocationBrazilsouth', 'RunLocationCanadacentral', 'RunLocationCanadaeast', 'RunLocationCentralindia', 'RunLocationCentralus', 'RunLocationEastasia', 'RunLocationEastus', 'RunLocationEastus2', 'RunLocationJapaneast', 'RunLocationJapanwest', 'RunLocationKoreacentral', 'RunLocationKoreasouth', 'RunLocationSoutheastasia', 'RunLocationSouthcentralus', 'RunLocationSouthindia', 'RunLocationNorthcentralus', 'RunLocationNortheurope', 'RunLocationUksouth', 'RunLocationUkwest', 'RunLocationWestcentralus', 'RunLocationWesteurope', 'RunLocationWestindia', 'RunLocationWestus', 'RunLocationWestus2'
	RunLocation RunLocation `json:"runLocation,omitempty"`
	// UserConfirmation - Enum to detect if user confirmation is required. If not passed will default to NotRequired. Possible values include: 'NotRequired', 'Required'
	UserConfirmation UserConfirmation `json:"userConfirmation,omitempty"`
	// DataServiceInput - A generic json used differently by each data service type.
	DataServiceInput interface{} `json:"dataServiceInput,omitempty"`
	// CustomerSecrets - List of customer secrets containing a key identifier and key value. The key identifier is a way for the specific data source to understand the key. Value contains customer secret encrypted by the encryptionKeys.
	CustomerSecrets *[]CustomerSecret `json:"customerSecrets,omitempty"`
}

// JobDefinitionsCreateOrUpdateFuture an abstraction for monitoring and retrieving the results of a
// long-running operation.
type JobDefinitionsCreateOrUpdateFuture struct {
	azure.FutureAPI
	// Result returns the result of the asynchronous operation.
	// If the operation has not completed it will return an error.
	Result func(JobDefinitionsClient) (JobDefinition, error)
}

// UnmarshalJSON is the custom unmarshaller for CreateFuture.
func (future *JobDefinitionsCreateOrUpdateFuture) UnmarshalJSON(body []byte) error {
	var azFuture azure.Future
	if err := json.Unmarshal(body, &azFuture); err != nil {
		return err
	}
	future.FutureAPI = &azFuture
	future.Result = future.result
	return nil
}

// result is the default implementation for JobDefinitionsCreateOrUpdateFuture.Result.
func (future *JobDefinitionsCreateOrUpdateFuture) result(client JobDefinitionsClient) (jd JobDefinition, err error) {
	var done bool
	done, err = future.DoneWithContext(context.Background(), client)
	if err != nil {
		err = autorest.NewErrorWithError(err, "hybriddata.JobDefinitionsCreateOrUpdateFuture", "Result", future.Response(), "Polling failure")
		return
	}
	if !done {
		jd.Response.Response = future.Response()
		err = azure.NewAsyncOpIncompleteError("hybriddata.JobDefinitionsCreateOrUpdateFuture")
		return
	}
	sender := autorest.DecorateSender(client, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))
	if jd.Response.Response, err = future.GetResult(sender); err == nil && jd.Response.Response.StatusCode != http.StatusNoContent {
		jd, err = client.CreateOrUpdateResponder(jd.Response.Response)
		if err != nil {
			err = autorest.NewErrorWithError(err, "hybriddata.JobDefinitionsCreateOrUpdateFuture", "Result", jd.Response.Response, "Failure responding to request")
		}
	}
	return
}

// JobDefinitionsDeleteFuture an abstraction for monitoring and retrieving the results of a long-running
// operation.
type JobDefinitionsDeleteFuture struct {
	azure.FutureAPI
	// Result returns the result of the asynchronous operation.
	// If the operation has not completed it will return an error.
	Result func(JobDefinitionsClient) (autorest.Response, error)
}

// UnmarshalJSON is the custom unmarshaller for CreateFuture.
func (future *JobDefinitionsDeleteFuture) UnmarshalJSON(body []byte) error {
	var azFuture azure.Future
	if err := json.Unmarshal(body, &azFuture); err != nil {
		return err
	}
	future.FutureAPI = &azFuture
	future.Result = future.result
	return nil
}

// result is the default implementation for JobDefinitionsDeleteFuture.Result.
func (future *JobDefinitionsDeleteFuture) result(client JobDefinitionsClient) (ar autorest.Response, err error) {
	var done bool
	done, err = future.DoneWithContext(context.Background(), client)
	if err != nil {
		err = autorest.NewErrorWithError(err, "hybriddata.JobDefinitionsDeleteFuture", "Result", future.Response(), "Polling failure")
		return
	}
	if !done {
		ar.Response = future.Response()
		err = azure.NewAsyncOpIncompleteError("hybriddata.JobDefinitionsDeleteFuture")
		return
	}
	ar.Response = future.Response()
	return
}

// JobDefinitionsRunFuture an abstraction for monitoring and retrieving the results of a long-running
// operation.
type JobDefinitionsRunFuture struct {
	azure.FutureAPI
	// Result returns the result of the asynchronous operation.
	// If the operation has not completed it will return an error.
	Result func(JobDefinitionsClient) (autorest.Response, error)
}

// UnmarshalJSON is the custom unmarshaller for CreateFuture.
func (future *JobDefinitionsRunFuture) UnmarshalJSON(body []byte) error {
	var azFuture azure.Future
	if err := json.Unmarshal(body, &azFuture); err != nil {
		return err
	}
	future.FutureAPI = &azFuture
	future.Result = future.result
	return nil
}

// result is the default implementation for JobDefinitionsRunFuture.Result.
func (future *JobDefinitionsRunFuture) result(client JobDefinitionsClient) (ar autorest.Response, err error) {
	var done bool
	done, err = future.DoneWithContext(context.Background(), client)
	if err != nil {
		err = autorest.NewErrorWithError(err, "hybriddata.JobDefinitionsRunFuture", "Result", future.Response(), "Polling failure")
		return
	}
	if !done {
		ar.Response = future.Response()
		err = azure.NewAsyncOpIncompleteError("hybriddata.JobDefinitionsRunFuture")
		return
	}
	ar.Response = future.Response()
	return
}

// JobDetails job details.
type JobDetails struct {
	// JobStages - List of stages that ran in the job
	JobStages *[]JobStages `json:"jobStages,omitempty"`
	// JobDefinition - JobDefinition at the time of the run
	JobDefinition *JobDefinition `json:"jobDefinition,omitempty"`
	// ErrorDetails - Error details for failure. This is optional.
	ErrorDetails *[]ErrorDetails `json:"errorDetails,omitempty"`
	// ItemDetailsLink - Item Details Link to download files or see details
	ItemDetailsLink *string `json:"itemDetailsLink,omitempty"`
}

// JobFilter contains the information about the filters for the job.
type JobFilter struct {
	// Status - The status of the job. Possible values include: 'None', 'InProgress', 'Succeeded', 'WaitingForAction', 'Failed', 'Cancelled', 'Cancelling', 'PartiallySucceeded'
	Status JobStatus `json:"status,omitempty"`
	// StartTime - The start time of the job.
	StartTime *date.Time `json:"startTime,omitempty"`
}

// JobList job Collection.
type JobList struct {
	autorest.Response `json:"-"`
	// Value - List of jobs.
	Value *[]Job `json:"value,omitempty"`
	// NextLink - Link for the next set of jobs.
	NextLink *string `json:"nextLink,omitempty"`
}

// JobListIterator provides access to a complete listing of Job values.
type JobListIterator struct {
	i    int
	page JobListPage
}

// NextWithContext advances to the next value.  If there was an error making
// the request the iterator does not advance and the error is returned.
func (iter *JobListIterator) NextWithContext(ctx context.Context) (err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/JobListIterator.NextWithContext")
		defer func() {
			sc := -1
			if iter.Response().Response.Response != nil {
				sc = iter.Response().Response.Response.StatusCode
			}
			tracing.EndSpan(ctx, sc, err)
		}()
	}
	iter.i++
	if iter.i < len(iter.page.Values()) {
		return nil
	}
	err = iter.page.NextWithContext(ctx)
	if err != nil {
		iter.i--
		return err
	}
	iter.i = 0
	return nil
}

// Next advances to the next value.  If there was an error making
// the request the iterator does not advance and the error is returned.
// Deprecated: Use NextWithContext() instead.
func (iter *JobListIterator) Next() error {
	return iter.NextWithContext(context.Background())
}

// NotDone returns true if the enumeration should be started or is not yet complete.
func (iter JobListIterator) NotDone() bool {
	return iter.page.NotDone() && iter.i < len(iter.page.Values())
}

// Response returns the raw server response from the last page request.
func (iter JobListIterator) Response() JobList {
	return iter.page.Response()
}

// Value returns the current value or a zero-initialized value if the
// iterator has advanced beyond the end of the collection.
func (iter JobListIterator) Value() Job {
	if !iter.page.NotDone() {
		return Job{}
	}
	return iter.page.Values()[iter.i]
}

// Creates a new instance of the JobListIterator type.
func NewJobListIterator(page JobListPage) JobListIterator {
	return JobListIterator{page: page}
}

// IsEmpty returns true if the ListResult contains no values.
func (jl JobList) IsEmpty() bool {
	return jl.Value == nil || len(*jl.Value) == 0
}

// hasNextLink returns true if the NextLink is not empty.
func (jl JobList) hasNextLink() bool {
	return jl.NextLink != nil && len(*jl.NextLink) != 0
}

// jobListPreparer prepares a request to retrieve the next set of results.
// It returns nil if no more results exist.
func (jl JobList) jobListPreparer(ctx context.Context) (*http.Request, error) {
	if !jl.hasNextLink() {
		return nil, nil
	}
	return autorest.Prepare((&http.Request{}).WithContext(ctx),
		autorest.AsJSON(),
		autorest.AsGet(),
		autorest.WithBaseURL(to.String(jl.NextLink)))
}

// JobListPage contains a page of Job values.
type JobListPage struct {
	fn func(context.Context, JobList) (JobList, error)
	jl JobList
}

// NextWithContext advances to the next page of values.  If there was an error making
// the request the page does not advance and the error is returned.
func (page *JobListPage) NextWithContext(ctx context.Context) (err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/JobListPage.NextWithContext")
		defer func() {
			sc := -1
			if page.Response().Response.Response != nil {
				sc = page.Response().Response.Response.StatusCode
			}
			tracing.EndSpan(ctx, sc, err)
		}()
	}
	for {
		next, err := page.fn(ctx, page.jl)
		if err != nil {
			return err
		}
		page.jl = next
		if !next.hasNextLink() || !next.IsEmpty() {
			break
		}
	}
	return nil
}

// Next advances to the next page of values.  If there was an error making
// the request the page does not advance and the error is returned.
// Deprecated: Use NextWithContext() instead.
func (page *JobListPage) Next() error {
	return page.NextWithContext(context.Background())
}

// NotDone returns true if the page enumeration should be started or is not yet complete.
func (page JobListPage) NotDone() bool {
	return !page.jl.IsEmpty()
}

// Response returns the raw server response from the last page request.
func (page JobListPage) Response() JobList {
	return page.jl
}

// Values returns the slice of values for the current page or nil if there are no values.
func (page JobListPage) Values() []Job {
	if page.jl.IsEmpty() {
		return nil
	}
	return *page.jl.Value
}

// Creates a new instance of the JobListPage type.
func NewJobListPage(cur JobList, getNextPage func(context.Context, JobList) (JobList, error)) JobListPage {
	return JobListPage{
		fn: getNextPage,
		jl: cur,
	}
}

// JobProperties job Properties
type JobProperties struct {
	// IsCancellable - Describes whether the job is cancellable. Possible values include: 'NotCancellable', 'Cancellable'
	IsCancellable IsJobCancellable `json:"isCancellable,omitempty"`
	// BytesProcessed - Number of bytes processed by the job as of now.
	BytesProcessed *int64 `json:"bytesProcessed,omitempty"`
	// ItemsProcessed - Number of items processed by the job as of now
	ItemsProcessed *int64 `json:"itemsProcessed,omitempty"`
	// TotalBytesToProcess - Number of bytes to be processed by the job in total.
	TotalBytesToProcess *int64 `json:"totalBytesToProcess,omitempty"`
	// TotalItemsToProcess - Number of items to be processed by the job in total
	TotalItemsToProcess *int64 `json:"totalItemsToProcess,omitempty"`
	// Details - Details of a job run. This field will only be sent for expand details filter.
	Details *JobDetails `json:"details,omitempty"`
	// DataSourceName - Name of the data source on which the job was triggered.
	DataSourceName *string `json:"dataSourceName,omitempty"`
	// DataSinkName - Name of the data sink on which the job was triggered.
	DataSinkName *string `json:"dataSinkName,omitempty"`
}

// JobsCancelFuture an abstraction for monitoring and retrieving the results of a long-running operation.
type JobsCancelFuture struct {
	azure.FutureAPI
	// Result returns the result of the asynchronous operation.
	// If the operation has not completed it will return an error.
	Result func(JobsClient) (autorest.Response, error)
}

// UnmarshalJSON is the custom unmarshaller for CreateFuture.
func (future *JobsCancelFuture) UnmarshalJSON(body []byte) error {
	var azFuture azure.Future
	if err := json.Unmarshal(body, &azFuture); err != nil {
		return err
	}
	future.FutureAPI = &azFuture
	future.Result = future.result
	return nil
}

// result is the default implementation for JobsCancelFuture.Result.
func (future *JobsCancelFuture) result(client JobsClient) (ar autorest.Response, err error) {
	var done bool
	done, err = future.DoneWithContext(context.Background(), client)
	if err != nil {
		err = autorest.NewErrorWithError(err, "hybriddata.JobsCancelFuture", "Result", future.Response(), "Polling failure")
		return
	}
	if !done {
		ar.Response = future.Response()
		err = azure.NewAsyncOpIncompleteError("hybriddata.JobsCancelFuture")
		return
	}
	ar.Response = future.Response()
	return
}

// JobsResumeFuture an abstraction for monitoring and retrieving the results of a long-running operation.
type JobsResumeFuture struct {
	azure.FutureAPI
	// Result returns the result of the asynchronous operation.
	// If the operation has not completed it will return an error.
	Result func(JobsClient) (autorest.Response, error)
}

// UnmarshalJSON is the custom unmarshaller for CreateFuture.
func (future *JobsResumeFuture) UnmarshalJSON(body []byte) error {
	var azFuture azure.Future
	if err := json.Unmarshal(body, &azFuture); err != nil {
		return err
	}
	future.FutureAPI = &azFuture
	future.Result = future.result
	return nil
}

// result is the default implementation for JobsResumeFuture.Result.
func (future *JobsResumeFuture) result(client JobsClient) (ar autorest.Response, err error) {
	var done bool
	done, err = future.DoneWithContext(context.Background(), client)
	if err != nil {
		err = autorest.NewErrorWithError(err, "hybriddata.JobsResumeFuture", "Result", future.Response(), "Polling failure")
		return
	}
	if !done {
		ar.Response = future.Response()
		err = azure.NewAsyncOpIncompleteError("hybriddata.JobsResumeFuture")
		return
	}
	ar.Response = future.Response()
	return
}

// JobStages job stages.
type JobStages struct {
	// StageName - Name of the job stage.
	StageName *string `json:"stageName,omitempty"`
	// StageStatus - Status of the job stage. Possible values include: 'None', 'InProgress', 'Succeeded', 'WaitingForAction', 'Failed', 'Cancelled', 'Cancelling', 'PartiallySucceeded'
	StageStatus JobStatus `json:"stageStatus,omitempty"`
	// JobStageDetails - Job Stage Details
	JobStageDetails interface{} `json:"jobStageDetails,omitempty"`
	// ErrorDetails - Error details for the stage. This is optional
	ErrorDetails *[]ErrorDetails `json:"errorDetails,omitempty"`
}

// Key encryption Key.
type Key struct {
	// KeyModulus - Modulus of the encryption key.
	KeyModulus *string `json:"keyModulus,omitempty"`
	// KeyExponent - Exponent of the encryption key.
	KeyExponent *string `json:"keyExponent,omitempty"`
	// EncryptionChunkSizeInBytes - The maximum byte size that can be encrypted by the key. For a key size larger than the size, break into chunks and encrypt each chunk, append each encrypted chunk with : to mark the end of the chunk.
	EncryptionChunkSizeInBytes *int32 `json:"encryptionChunkSizeInBytes,omitempty"`
}

// PublicKey public key
type PublicKey struct {
	autorest.Response `json:"-"`
	// PublicKeyProperties - Public key property.
	*PublicKeyProperties `json:"properties,omitempty"`
	// Name - READ-ONLY; Name of the object.
	Name *string `json:"name,omitempty"`
	// ID - READ-ONLY; Id of the object.
	ID *string `json:"id,omitempty"`
	// Type - READ-ONLY; Type of the object.
	Type *string `json:"type,omitempty"`
}

// MarshalJSON is the custom marshaler for PublicKey.
func (pk PublicKey) MarshalJSON() ([]byte, error) {
	objectMap := make(map[string]interface{})
	if pk.PublicKeyProperties != nil {
		objectMap["properties"] = pk.PublicKeyProperties
	}
	return json.Marshal(objectMap)
}

// UnmarshalJSON is the custom unmarshaler for PublicKey struct.
func (pk *PublicKey) UnmarshalJSON(body []byte) error {
	var m map[string]*json.RawMessage
	err := json.Unmarshal(body, &m)
	if err != nil {
		return err
	}
	for k, v := range m {
		switch k {
		case "properties":
			if v != nil {
				var publicKeyProperties PublicKeyProperties
				err = json.Unmarshal(*v, &publicKeyProperties)
				if err != nil {
					return err
				}
				pk.PublicKeyProperties = &publicKeyProperties
			}
		case "name":
			if v != nil {
				var name string
				err = json.Unmarshal(*v, &name)
				if err != nil {
					return err
				}
				pk.Name = &name
			}
		case "id":
			if v != nil {
				var ID string
				err = json.Unmarshal(*v, &ID)
				if err != nil {
					return err
				}
				pk.ID = &ID
			}
		case "type":
			if v != nil {
				var typeVar string
				err = json.Unmarshal(*v, &typeVar)
				if err != nil {
					return err
				}
				pk.Type = &typeVar
			}
		}
	}

	return nil
}

// PublicKeyList publicKey Collection
type PublicKeyList struct {
	autorest.Response `json:"-"`
	// Value - List of public keys.
	Value *[]PublicKey `json:"value,omitempty"`
	// NextLink - Link for the next set of public keys.
	NextLink *string `json:"nextLink,omitempty"`
}

// PublicKeyListIterator provides access to a complete listing of PublicKey values.
type PublicKeyListIterator struct {
	i    int
	page PublicKeyListPage
}

// NextWithContext advances to the next value.  If there was an error making
// the request the iterator does not advance and the error is returned.
func (iter *PublicKeyListIterator) NextWithContext(ctx context.Context) (err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/PublicKeyListIterator.NextWithContext")
		defer func() {
			sc := -1
			if iter.Response().Response.Response != nil {
				sc = iter.Response().Response.Response.StatusCode
			}
			tracing.EndSpan(ctx, sc, err)
		}()
	}
	iter.i++
	if iter.i < len(iter.page.Values()) {
		return nil
	}
	err = iter.page.NextWithContext(ctx)
	if err != nil {
		iter.i--
		return err
	}
	iter.i = 0
	return nil
}

// Next advances to the next value.  If there was an error making
// the request the iterator does not advance and the error is returned.
// Deprecated: Use NextWithContext() instead.
func (iter *PublicKeyListIterator) Next() error {
	return iter.NextWithContext(context.Background())
}

// NotDone returns true if the enumeration should be started or is not yet complete.
func (iter PublicKeyListIterator) NotDone() bool {
	return iter.page.NotDone() && iter.i < len(iter.page.Values())
}

// Response returns the raw server response from the last page request.
func (iter PublicKeyListIterator) Response() PublicKeyList {
	return iter.page.Response()
}

// Value returns the current value or a zero-initialized value if the
// iterator has advanced beyond the end of the collection.
func (iter PublicKeyListIterator) Value() PublicKey {
	if !iter.page.NotDone() {
		return PublicKey{}
	}
	return iter.page.Values()[iter.i]
}

// Creates a new instance of the PublicKeyListIterator type.
func NewPublicKeyListIterator(page PublicKeyListPage) PublicKeyListIterator {
	return PublicKeyListIterator{page: page}
}

// IsEmpty returns true if the ListResult contains no values.
func (pkl PublicKeyList) IsEmpty() bool {
	return pkl.Value == nil || len(*pkl.Value) == 0
}

// hasNextLink returns true if the NextLink is not empty.
func (pkl PublicKeyList) hasNextLink() bool {
	return pkl.NextLink != nil && len(*pkl.NextLink) != 0
}

// publicKeyListPreparer prepares a request to retrieve the next set of results.
// It returns nil if no more results exist.
func (pkl PublicKeyList) publicKeyListPreparer(ctx context.Context) (*http.Request, error) {
	if !pkl.hasNextLink() {
		return nil, nil
	}
	return autorest.Prepare((&http.Request{}).WithContext(ctx),
		autorest.AsJSON(),
		autorest.AsGet(),
		autorest.WithBaseURL(to.String(pkl.NextLink)))
}

// PublicKeyListPage contains a page of PublicKey values.
type PublicKeyListPage struct {
	fn  func(context.Context, PublicKeyList) (PublicKeyList, error)
	pkl PublicKeyList
}

// NextWithContext advances to the next page of values.  If there was an error making
// the request the page does not advance and the error is returned.
func (page *PublicKeyListPage) NextWithContext(ctx context.Context) (err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/PublicKeyListPage.NextWithContext")
		defer func() {
			sc := -1
			if page.Response().Response.Response != nil {
				sc = page.Response().Response.Response.StatusCode
			}
			tracing.EndSpan(ctx, sc, err)
		}()
	}
	for {
		next, err := page.fn(ctx, page.pkl)
		if err != nil {
			return err
		}
		page.pkl = next
		if !next.hasNextLink() || !next.IsEmpty() {
			break
		}
	}
	return nil
}

// Next advances to the next page of values.  If there was an error making
// the request the page does not advance and the error is returned.
// Deprecated: Use NextWithContext() instead.
func (page *PublicKeyListPage) Next() error {
	return page.NextWithContext(context.Background())
}

// NotDone returns true if the page enumeration should be started or is not yet complete.
func (page PublicKeyListPage) NotDone() bool {
	return !page.pkl.IsEmpty()
}

// Response returns the raw server response from the last page request.
func (page PublicKeyListPage) Response() PublicKeyList {
	return page.pkl
}

// Values returns the slice of values for the current page or nil if there are no values.
func (page PublicKeyListPage) Values() []PublicKey {
	if page.pkl.IsEmpty() {
		return nil
	}
	return *page.pkl.Value
}

// Creates a new instance of the PublicKeyListPage type.
func NewPublicKeyListPage(cur PublicKeyList, getNextPage func(context.Context, PublicKeyList) (PublicKeyList, error)) PublicKeyListPage {
	return PublicKeyListPage{
		fn:  getNextPage,
		pkl: cur,
	}
}

// PublicKeyProperties publicKey Properties
type PublicKeyProperties struct {
	// DataServiceLevel1Key - Level one public key for encryption
	DataServiceLevel1Key *Key `json:"dataServiceLevel1Key,omitempty"`
	// DataServiceLevel2Key - Level two public key for encryption
	DataServiceLevel2Key *Key `json:"dataServiceLevel2Key,omitempty"`
}

// Resource model of the Resource.
type Resource struct {
	// ID - READ-ONLY; The Resource Id.
	ID *string `json:"id,omitempty"`
	// Name - READ-ONLY; The Resource Name.
	Name *string `json:"name,omitempty"`
	// Type - READ-ONLY; The Resource type.
	Type *string `json:"type,omitempty"`
	// Location - The location of the resource. This will be one of the supported and registered Azure Geo Regions (e.g. West US, East
	// US, Southeast Asia, etc.). The geo region of a resource cannot be changed once it is created, but if an identical geo
	// region is specified on update the request will succeed.
	Location *string `json:"location,omitempty"`
	// Tags - The list of key value pairs that describe the resource. These tags can be used in viewing and grouping this resource
	// (across resource groups).
	Tags map[string]*string `json:"tags"`
	// Sku - The sku type.
	Sku *Sku `json:"sku,omitempty"`
}

// MarshalJSON is the custom marshaler for Resource.
func (r Resource) MarshalJSON() ([]byte, error) {
	objectMap := make(map[string]interface{})
	if r.Location != nil {
		objectMap["location"] = r.Location
	}
	if r.Tags != nil {
		objectMap["tags"] = r.Tags
	}
	if r.Sku != nil {
		objectMap["sku"] = r.Sku
	}
	return json.Marshal(objectMap)
}

// RunParameters run parameters for a job.
type RunParameters struct {
	// UserConfirmation - Enum to detect if user confirmation is required. If not passed will default to NotRequired. Possible values include: 'NotRequired', 'Required'
	UserConfirmation UserConfirmation `json:"userConfirmation,omitempty"`
	// DataServiceInput - A generic json used differently by each data service type.
	DataServiceInput interface{} `json:"dataServiceInput,omitempty"`
	// CustomerSecrets - List of customer secrets containing a key identifier and key value. The key identifier is a way for the specific data source to understand the key. Value contains customer secret encrypted by the encryptionKeys.
	CustomerSecrets *[]CustomerSecret `json:"customerSecrets,omitempty"`
}

// Schedule schedule for the job run.
type Schedule struct {
	// Name - Name of the schedule.
	Name *string `json:"name,omitempty"`
	// PolicyList - A list of repetition intervals in ISO 8601 format.
	PolicyList *[]string `json:"policyList,omitempty"`
}

// Sku the sku type.
type Sku struct {
	// Name - The sku name. Required for data manager creation, optional for update.
	Name *string `json:"name,omitempty"`
	// Tier - The sku tier. This is based on the SKU name.
	Tier *string `json:"tier,omitempty"`
}
