package account

// 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/preview/datalake/analytics/mgmt/2015-10-01-preview/account"

// AddDataLakeStoreParameters additional Data Lake Store parameters.
type AddDataLakeStoreParameters struct {
	// Properties - the properties for the Data Lake Store account being added.
	Properties *DataLakeStoreAccountInfoProperties `json:"properties,omitempty"`
}

// AddStorageAccountParameters additional Azure Storage account parameters.
type AddStorageAccountParameters struct {
	// Properties - the properties for the Azure Storage account being added.
	Properties *StorageAccountProperties `json:"properties,omitempty"`
}

// AzureAsyncOperationResult the response body contains the status of the specified asynchronous operation,
// indicating whether it has succeeded, is inprogress, or has failed. Note that this status is distinct
// from the HTTP status code returned for the Get Operation Status operation itself. If the asynchronous
// operation succeeded, the response body includes the HTTP status code for the successful request. If the
// asynchronous operation failed, the response body includes the HTTP status code for the failed request
// and error information regarding the failure.
type AzureAsyncOperationResult struct {
	// Status - READ-ONLY; the status of the AzureAsyncOperation. Possible values include: 'OperationStatusInProgress', 'OperationStatusSucceeded', 'OperationStatusFailed'
	Status OperationStatus `json:"status,omitempty"`
	// Error - READ-ONLY
	Error *Error `json:"error,omitempty"`
}

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

// BlobContainer azure Storage blob container information.
type BlobContainer struct {
	autorest.Response `json:"-"`
	// Name - READ-ONLY; the name of the blob container.
	Name *string `json:"name,omitempty"`
	// ID - READ-ONLY; the unique identifier of the blob container.
	ID *string `json:"id,omitempty"`
	// Type - READ-ONLY; the type of the blob container.
	Type *string `json:"type,omitempty"`
	// Properties - READ-ONLY; the properties of the blob container.
	Properties *BlobContainerProperties `json:"properties,omitempty"`
}

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

// BlobContainerProperties azure Storage blob container properties information.
type BlobContainerProperties struct {
	// LastModifiedTime - READ-ONLY; the last modified time of the blob container.
	LastModifiedTime *date.Time `json:"lastModifiedTime,omitempty"`
}

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

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

// UnmarshalJSON is the custom unmarshaller for CreateFuture.
func (future *CreateFuture) 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 CreateFuture.Result.
func (future *CreateFuture) result(client Client) (dlaa DataLakeAnalyticsAccount, err error) {
	var done bool
	done, err = future.DoneWithContext(context.Background(), client)
	if err != nil {
		err = autorest.NewErrorWithError(err, "account.CreateFuture", "Result", future.Response(), "Polling failure")
		return
	}
	if !done {
		dlaa.Response.Response = future.Response()
		err = azure.NewAsyncOpIncompleteError("account.CreateFuture")
		return
	}
	sender := autorest.DecorateSender(client, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))
	if dlaa.Response.Response, err = future.GetResult(sender); err == nil && dlaa.Response.Response.StatusCode != http.StatusNoContent {
		dlaa, err = client.CreateResponder(dlaa.Response.Response)
		if err != nil {
			err = autorest.NewErrorWithError(err, "account.CreateFuture", "Result", dlaa.Response.Response, "Failure responding to request")
		}
	}
	return
}

// DataLakeAnalyticsAccount a Data Lake Analytics account object, containing all information associated
// with the named Data Lake Analytics account.
type DataLakeAnalyticsAccount struct {
	autorest.Response `json:"-"`
	// Location - the account regional location.
	Location *string `json:"location,omitempty"`
	// Name - the account name.
	Name *string `json:"name,omitempty"`
	// Type - READ-ONLY; the namespace and type of the account.
	Type *string `json:"type,omitempty"`
	// ID - READ-ONLY; the account subscription ID.
	ID *string `json:"id,omitempty"`
	// Tags - the value of custom properties.
	Tags map[string]*string `json:"tags"`
	// Properties - the properties defined by Data Lake Analytics all properties are specific to each resource provider.
	Properties *DataLakeAnalyticsAccountProperties `json:"properties,omitempty"`
}

// MarshalJSON is the custom marshaler for DataLakeAnalyticsAccount.
func (dlaa DataLakeAnalyticsAccount) MarshalJSON() ([]byte, error) {
	objectMap := make(map[string]interface{})
	if dlaa.Location != nil {
		objectMap["location"] = dlaa.Location
	}
	if dlaa.Name != nil {
		objectMap["name"] = dlaa.Name
	}
	if dlaa.Tags != nil {
		objectMap["tags"] = dlaa.Tags
	}
	if dlaa.Properties != nil {
		objectMap["properties"] = dlaa.Properties
	}
	return json.Marshal(objectMap)
}

// DataLakeAnalyticsAccountListDataLakeStoreResult data Lake Account list information.
type DataLakeAnalyticsAccountListDataLakeStoreResult struct {
	autorest.Response `json:"-"`
	// Value - READ-ONLY; the results of the list operation
	Value *[]DataLakeStoreAccountInfo `json:"value,omitempty"`
	// Count - READ-ONLY; total number of results.
	Count *int32 `json:"count,omitempty"`
	// NextLink - READ-ONLY; the link (url) to the next page of results.
	NextLink *string `json:"nextLink,omitempty"`
}

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

// DataLakeAnalyticsAccountListDataLakeStoreResultIterator provides access to a complete listing of
// DataLakeStoreAccountInfo values.
type DataLakeAnalyticsAccountListDataLakeStoreResultIterator struct {
	i    int
	page DataLakeAnalyticsAccountListDataLakeStoreResultPage
}

// 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 *DataLakeAnalyticsAccountListDataLakeStoreResultIterator) NextWithContext(ctx context.Context) (err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/DataLakeAnalyticsAccountListDataLakeStoreResultIterator.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 *DataLakeAnalyticsAccountListDataLakeStoreResultIterator) Next() error {
	return iter.NextWithContext(context.Background())
}

// NotDone returns true if the enumeration should be started or is not yet complete.
func (iter DataLakeAnalyticsAccountListDataLakeStoreResultIterator) 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 DataLakeAnalyticsAccountListDataLakeStoreResultIterator) Response() DataLakeAnalyticsAccountListDataLakeStoreResult {
	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 DataLakeAnalyticsAccountListDataLakeStoreResultIterator) Value() DataLakeStoreAccountInfo {
	if !iter.page.NotDone() {
		return DataLakeStoreAccountInfo{}
	}
	return iter.page.Values()[iter.i]
}

// Creates a new instance of the DataLakeAnalyticsAccountListDataLakeStoreResultIterator type.
func NewDataLakeAnalyticsAccountListDataLakeStoreResultIterator(page DataLakeAnalyticsAccountListDataLakeStoreResultPage) DataLakeAnalyticsAccountListDataLakeStoreResultIterator {
	return DataLakeAnalyticsAccountListDataLakeStoreResultIterator{page: page}
}

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

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

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

// DataLakeAnalyticsAccountListDataLakeStoreResultPage contains a page of DataLakeStoreAccountInfo values.
type DataLakeAnalyticsAccountListDataLakeStoreResultPage struct {
	fn        func(context.Context, DataLakeAnalyticsAccountListDataLakeStoreResult) (DataLakeAnalyticsAccountListDataLakeStoreResult, error)
	dlaaldlsr DataLakeAnalyticsAccountListDataLakeStoreResult
}

// 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 *DataLakeAnalyticsAccountListDataLakeStoreResultPage) NextWithContext(ctx context.Context) (err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/DataLakeAnalyticsAccountListDataLakeStoreResultPage.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.dlaaldlsr)
		if err != nil {
			return err
		}
		page.dlaaldlsr = 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 *DataLakeAnalyticsAccountListDataLakeStoreResultPage) Next() error {
	return page.NextWithContext(context.Background())
}

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

// Response returns the raw server response from the last page request.
func (page DataLakeAnalyticsAccountListDataLakeStoreResultPage) Response() DataLakeAnalyticsAccountListDataLakeStoreResult {
	return page.dlaaldlsr
}

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

// Creates a new instance of the DataLakeAnalyticsAccountListDataLakeStoreResultPage type.
func NewDataLakeAnalyticsAccountListDataLakeStoreResultPage(cur DataLakeAnalyticsAccountListDataLakeStoreResult, getNextPage func(context.Context, DataLakeAnalyticsAccountListDataLakeStoreResult) (DataLakeAnalyticsAccountListDataLakeStoreResult, error)) DataLakeAnalyticsAccountListDataLakeStoreResultPage {
	return DataLakeAnalyticsAccountListDataLakeStoreResultPage{
		fn:        getNextPage,
		dlaaldlsr: cur,
	}
}

// DataLakeAnalyticsAccountListResult dataLakeAnalytics Account list information.
type DataLakeAnalyticsAccountListResult struct {
	autorest.Response `json:"-"`
	// Value - READ-ONLY; the results of the list operation
	Value *[]DataLakeAnalyticsAccount `json:"value,omitempty"`
	// NextLink - READ-ONLY; the link (url) to the next page of results.
	NextLink *string `json:"nextLink,omitempty"`
}

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

// DataLakeAnalyticsAccountListResultIterator provides access to a complete listing of
// DataLakeAnalyticsAccount values.
type DataLakeAnalyticsAccountListResultIterator struct {
	i    int
	page DataLakeAnalyticsAccountListResultPage
}

// 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 *DataLakeAnalyticsAccountListResultIterator) NextWithContext(ctx context.Context) (err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/DataLakeAnalyticsAccountListResultIterator.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 *DataLakeAnalyticsAccountListResultIterator) Next() error {
	return iter.NextWithContext(context.Background())
}

// NotDone returns true if the enumeration should be started or is not yet complete.
func (iter DataLakeAnalyticsAccountListResultIterator) 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 DataLakeAnalyticsAccountListResultIterator) Response() DataLakeAnalyticsAccountListResult {
	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 DataLakeAnalyticsAccountListResultIterator) Value() DataLakeAnalyticsAccount {
	if !iter.page.NotDone() {
		return DataLakeAnalyticsAccount{}
	}
	return iter.page.Values()[iter.i]
}

// Creates a new instance of the DataLakeAnalyticsAccountListResultIterator type.
func NewDataLakeAnalyticsAccountListResultIterator(page DataLakeAnalyticsAccountListResultPage) DataLakeAnalyticsAccountListResultIterator {
	return DataLakeAnalyticsAccountListResultIterator{page: page}
}

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

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

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

// DataLakeAnalyticsAccountListResultPage contains a page of DataLakeAnalyticsAccount values.
type DataLakeAnalyticsAccountListResultPage struct {
	fn     func(context.Context, DataLakeAnalyticsAccountListResult) (DataLakeAnalyticsAccountListResult, error)
	dlaalr DataLakeAnalyticsAccountListResult
}

// 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 *DataLakeAnalyticsAccountListResultPage) NextWithContext(ctx context.Context) (err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/DataLakeAnalyticsAccountListResultPage.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.dlaalr)
		if err != nil {
			return err
		}
		page.dlaalr = 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 *DataLakeAnalyticsAccountListResultPage) Next() error {
	return page.NextWithContext(context.Background())
}

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

// Response returns the raw server response from the last page request.
func (page DataLakeAnalyticsAccountListResultPage) Response() DataLakeAnalyticsAccountListResult {
	return page.dlaalr
}

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

// Creates a new instance of the DataLakeAnalyticsAccountListResultPage type.
func NewDataLakeAnalyticsAccountListResultPage(cur DataLakeAnalyticsAccountListResult, getNextPage func(context.Context, DataLakeAnalyticsAccountListResult) (DataLakeAnalyticsAccountListResult, error)) DataLakeAnalyticsAccountListResultPage {
	return DataLakeAnalyticsAccountListResultPage{
		fn:     getNextPage,
		dlaalr: cur,
	}
}

// DataLakeAnalyticsAccountListStorageAccountsResult azure Storage Account list information.
type DataLakeAnalyticsAccountListStorageAccountsResult struct {
	autorest.Response `json:"-"`
	// Value - READ-ONLY; the results of the list operation
	Value *[]StorageAccountInfo `json:"value,omitempty"`
	// Count - READ-ONLY; total number of results.
	Count *int32 `json:"count,omitempty"`
	// NextLink - READ-ONLY; the link (url) to the next page of results.
	NextLink *string `json:"nextLink,omitempty"`
}

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

// DataLakeAnalyticsAccountListStorageAccountsResultIterator provides access to a complete listing of
// StorageAccountInfo values.
type DataLakeAnalyticsAccountListStorageAccountsResultIterator struct {
	i    int
	page DataLakeAnalyticsAccountListStorageAccountsResultPage
}

// 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 *DataLakeAnalyticsAccountListStorageAccountsResultIterator) NextWithContext(ctx context.Context) (err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/DataLakeAnalyticsAccountListStorageAccountsResultIterator.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 *DataLakeAnalyticsAccountListStorageAccountsResultIterator) Next() error {
	return iter.NextWithContext(context.Background())
}

// NotDone returns true if the enumeration should be started or is not yet complete.
func (iter DataLakeAnalyticsAccountListStorageAccountsResultIterator) 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 DataLakeAnalyticsAccountListStorageAccountsResultIterator) Response() DataLakeAnalyticsAccountListStorageAccountsResult {
	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 DataLakeAnalyticsAccountListStorageAccountsResultIterator) Value() StorageAccountInfo {
	if !iter.page.NotDone() {
		return StorageAccountInfo{}
	}
	return iter.page.Values()[iter.i]
}

// Creates a new instance of the DataLakeAnalyticsAccountListStorageAccountsResultIterator type.
func NewDataLakeAnalyticsAccountListStorageAccountsResultIterator(page DataLakeAnalyticsAccountListStorageAccountsResultPage) DataLakeAnalyticsAccountListStorageAccountsResultIterator {
	return DataLakeAnalyticsAccountListStorageAccountsResultIterator{page: page}
}

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

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

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

// DataLakeAnalyticsAccountListStorageAccountsResultPage contains a page of StorageAccountInfo values.
type DataLakeAnalyticsAccountListStorageAccountsResultPage struct {
	fn       func(context.Context, DataLakeAnalyticsAccountListStorageAccountsResult) (DataLakeAnalyticsAccountListStorageAccountsResult, error)
	dlaalsar DataLakeAnalyticsAccountListStorageAccountsResult
}

// 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 *DataLakeAnalyticsAccountListStorageAccountsResultPage) NextWithContext(ctx context.Context) (err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/DataLakeAnalyticsAccountListStorageAccountsResultPage.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.dlaalsar)
		if err != nil {
			return err
		}
		page.dlaalsar = 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 *DataLakeAnalyticsAccountListStorageAccountsResultPage) Next() error {
	return page.NextWithContext(context.Background())
}

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

// Response returns the raw server response from the last page request.
func (page DataLakeAnalyticsAccountListStorageAccountsResultPage) Response() DataLakeAnalyticsAccountListStorageAccountsResult {
	return page.dlaalsar
}

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

// Creates a new instance of the DataLakeAnalyticsAccountListStorageAccountsResultPage type.
func NewDataLakeAnalyticsAccountListStorageAccountsResultPage(cur DataLakeAnalyticsAccountListStorageAccountsResult, getNextPage func(context.Context, DataLakeAnalyticsAccountListStorageAccountsResult) (DataLakeAnalyticsAccountListStorageAccountsResult, error)) DataLakeAnalyticsAccountListStorageAccountsResultPage {
	return DataLakeAnalyticsAccountListStorageAccountsResultPage{
		fn:       getNextPage,
		dlaalsar: cur,
	}
}

// DataLakeAnalyticsAccountProperties the account specific properties that are associated with an
// underlying Data Lake Analytics account.
type DataLakeAnalyticsAccountProperties struct {
	// ProvisioningState - READ-ONLY; the provisioning status of the Data Lake Analytics account. Possible values include: 'Failed', 'Creating', 'Running', 'Succeeded', 'Patching', 'Suspending', 'Resuming', 'Deleting', 'Deleted'
	ProvisioningState DataLakeAnalyticsAccountStatus `json:"provisioningState,omitempty"`
	// State - READ-ONLY; the state of the Data Lake Analytics account. Possible values include: 'Active', 'Suspended'
	State DataLakeAnalyticsAccountState `json:"state,omitempty"`
	// DefaultDataLakeStoreAccount - the default data lake storage account associated with this Data Lake Analytics account.
	DefaultDataLakeStoreAccount *string `json:"defaultDataLakeStoreAccount,omitempty"`
	// MaxDegreeOfParallelism - the maximum supported degree of parallelism for this account.
	MaxDegreeOfParallelism *int32 `json:"maxDegreeOfParallelism,omitempty"`
	// MaxJobCount - the maximum supported jobs running under the account at the same time.
	MaxJobCount *int32 `json:"maxJobCount,omitempty"`
	// DataLakeStoreAccounts - the list of Data Lake storage accounts associated with this account.
	DataLakeStoreAccounts *[]DataLakeStoreAccountInfo `json:"dataLakeStoreAccounts,omitempty"`
	// StorageAccounts - the list of Azure Blob storage accounts associated with this account.
	StorageAccounts *[]StorageAccountInfo `json:"storageAccounts,omitempty"`
	// CreationTime - READ-ONLY; the account creation time.
	CreationTime *date.Time `json:"creationTime,omitempty"`
	// LastModifiedTime - READ-ONLY; the account last modified time.
	LastModifiedTime *date.Time `json:"lastModifiedTime,omitempty"`
	// Endpoint - READ-ONLY; the full CName endpoint for this account.
	Endpoint *string `json:"endpoint,omitempty"`
}

// MarshalJSON is the custom marshaler for DataLakeAnalyticsAccountProperties.
func (dlaap DataLakeAnalyticsAccountProperties) MarshalJSON() ([]byte, error) {
	objectMap := make(map[string]interface{})
	if dlaap.DefaultDataLakeStoreAccount != nil {
		objectMap["defaultDataLakeStoreAccount"] = dlaap.DefaultDataLakeStoreAccount
	}
	if dlaap.MaxDegreeOfParallelism != nil {
		objectMap["maxDegreeOfParallelism"] = dlaap.MaxDegreeOfParallelism
	}
	if dlaap.MaxJobCount != nil {
		objectMap["maxJobCount"] = dlaap.MaxJobCount
	}
	if dlaap.DataLakeStoreAccounts != nil {
		objectMap["dataLakeStoreAccounts"] = dlaap.DataLakeStoreAccounts
	}
	if dlaap.StorageAccounts != nil {
		objectMap["storageAccounts"] = dlaap.StorageAccounts
	}
	return json.Marshal(objectMap)
}

// DataLakeStoreAccountInfo data Lake Store account information.
type DataLakeStoreAccountInfo struct {
	autorest.Response `json:"-"`
	// Name - the account name of the Data Lake Store account.
	Name *string `json:"name,omitempty"`
	// Properties - the properties associated with this Data Lake Store account.
	Properties *DataLakeStoreAccountInfoProperties `json:"properties,omitempty"`
}

// DataLakeStoreAccountInfoProperties data Lake Store account properties information.
type DataLakeStoreAccountInfoProperties struct {
	// Suffix - the optional suffix for the Data Lake Store account.
	Suffix *string `json:"suffix,omitempty"`
}

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

// UnmarshalJSON is the custom unmarshaller for CreateFuture.
func (future *DeleteFuture) 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 DeleteFuture.Result.
func (future *DeleteFuture) result(client Client) (ar autorest.Response, err error) {
	var done bool
	done, err = future.DoneWithContext(context.Background(), client)
	if err != nil {
		err = autorest.NewErrorWithError(err, "account.DeleteFuture", "Result", future.Response(), "Polling failure")
		return
	}
	if !done {
		ar.Response = future.Response()
		err = azure.NewAsyncOpIncompleteError("account.DeleteFuture")
		return
	}
	ar.Response = future.Response()
	return
}

// Error generic resource error information.
type Error struct {
	// Code - READ-ONLY; the HTTP status code or error code associated with this error
	Code *string `json:"code,omitempty"`
	// Message - READ-ONLY; the error message to display.
	Message *string `json:"message,omitempty"`
	// Target - READ-ONLY; the target of the error.
	Target *string `json:"target,omitempty"`
	// Details - READ-ONLY; the list of error details
	Details *[]ErrorDetails `json:"details,omitempty"`
	// InnerError - READ-ONLY; the inner exceptions or errors, if any
	InnerError *InnerError `json:"innerError,omitempty"`
}

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

// ErrorDetails generic resource error details information.
type ErrorDetails struct {
	// Code - READ-ONLY; the HTTP status code or error code associated with this error
	Code *string `json:"code,omitempty"`
	// Message - READ-ONLY; the error message localized based on Accept-Language
	Message *string `json:"message,omitempty"`
	// Target - READ-ONLY; the target of the particular error (for example, the name of the property in error).
	Target *string `json:"target,omitempty"`
}

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

// InnerError generic resource inner error information.
type InnerError struct {
	// Trace - READ-ONLY; the stack trace for the error
	Trace *string `json:"trace,omitempty"`
	// Context - READ-ONLY; the context for the error message
	Context *string `json:"context,omitempty"`
}

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

// ListBlobContainersResult the list of blob containers associated with the storage account attached to the
// Data Lake Analytics account.
type ListBlobContainersResult struct {
	autorest.Response `json:"-"`
	// Value - READ-ONLY; the results of the list operation
	Value *[]BlobContainer `json:"value,omitempty"`
	// NextLink - READ-ONLY; the link (url) to the next page of results.
	NextLink *string `json:"nextLink,omitempty"`
}

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

// ListBlobContainersResultIterator provides access to a complete listing of BlobContainer values.
type ListBlobContainersResultIterator struct {
	i    int
	page ListBlobContainersResultPage
}

// 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 *ListBlobContainersResultIterator) NextWithContext(ctx context.Context) (err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/ListBlobContainersResultIterator.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 *ListBlobContainersResultIterator) Next() error {
	return iter.NextWithContext(context.Background())
}

// NotDone returns true if the enumeration should be started or is not yet complete.
func (iter ListBlobContainersResultIterator) 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 ListBlobContainersResultIterator) Response() ListBlobContainersResult {
	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 ListBlobContainersResultIterator) Value() BlobContainer {
	if !iter.page.NotDone() {
		return BlobContainer{}
	}
	return iter.page.Values()[iter.i]
}

// Creates a new instance of the ListBlobContainersResultIterator type.
func NewListBlobContainersResultIterator(page ListBlobContainersResultPage) ListBlobContainersResultIterator {
	return ListBlobContainersResultIterator{page: page}
}

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

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

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

// ListBlobContainersResultPage contains a page of BlobContainer values.
type ListBlobContainersResultPage struct {
	fn   func(context.Context, ListBlobContainersResult) (ListBlobContainersResult, error)
	lbcr ListBlobContainersResult
}

// 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 *ListBlobContainersResultPage) NextWithContext(ctx context.Context) (err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/ListBlobContainersResultPage.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.lbcr)
		if err != nil {
			return err
		}
		page.lbcr = 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 *ListBlobContainersResultPage) Next() error {
	return page.NextWithContext(context.Background())
}

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

// Response returns the raw server response from the last page request.
func (page ListBlobContainersResultPage) Response() ListBlobContainersResult {
	return page.lbcr
}

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

// Creates a new instance of the ListBlobContainersResultPage type.
func NewListBlobContainersResultPage(cur ListBlobContainersResult, getNextPage func(context.Context, ListBlobContainersResult) (ListBlobContainersResult, error)) ListBlobContainersResultPage {
	return ListBlobContainersResultPage{
		fn:   getNextPage,
		lbcr: cur,
	}
}

// ListSasTokensResult the SAS response that contains the storage account, container and associated SAS
// token for connection use.
type ListSasTokensResult struct {
	autorest.Response `json:"-"`
	// Value - READ-ONLY
	Value *[]SasTokenInfo `json:"value,omitempty"`
	// NextLink - READ-ONLY; the link (url) to the next page of results.
	NextLink *string `json:"nextLink,omitempty"`
}

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

// ListSasTokensResultIterator provides access to a complete listing of SasTokenInfo values.
type ListSasTokensResultIterator struct {
	i    int
	page ListSasTokensResultPage
}

// 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 *ListSasTokensResultIterator) NextWithContext(ctx context.Context) (err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/ListSasTokensResultIterator.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 *ListSasTokensResultIterator) Next() error {
	return iter.NextWithContext(context.Background())
}

// NotDone returns true if the enumeration should be started or is not yet complete.
func (iter ListSasTokensResultIterator) 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 ListSasTokensResultIterator) Response() ListSasTokensResult {
	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 ListSasTokensResultIterator) Value() SasTokenInfo {
	if !iter.page.NotDone() {
		return SasTokenInfo{}
	}
	return iter.page.Values()[iter.i]
}

// Creates a new instance of the ListSasTokensResultIterator type.
func NewListSasTokensResultIterator(page ListSasTokensResultPage) ListSasTokensResultIterator {
	return ListSasTokensResultIterator{page: page}
}

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

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

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

// ListSasTokensResultPage contains a page of SasTokenInfo values.
type ListSasTokensResultPage struct {
	fn   func(context.Context, ListSasTokensResult) (ListSasTokensResult, error)
	lstr ListSasTokensResult
}

// 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 *ListSasTokensResultPage) NextWithContext(ctx context.Context) (err error) {
	if tracing.IsEnabled() {
		ctx = tracing.StartSpan(ctx, fqdn+"/ListSasTokensResultPage.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.lstr)
		if err != nil {
			return err
		}
		page.lstr = 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 *ListSasTokensResultPage) Next() error {
	return page.NextWithContext(context.Background())
}

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

// Response returns the raw server response from the last page request.
func (page ListSasTokensResultPage) Response() ListSasTokensResult {
	return page.lstr
}

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

// Creates a new instance of the ListSasTokensResultPage type.
func NewListSasTokensResultPage(cur ListSasTokensResult, getNextPage func(context.Context, ListSasTokensResult) (ListSasTokensResult, error)) ListSasTokensResultPage {
	return ListSasTokensResultPage{
		fn:   getNextPage,
		lstr: cur,
	}
}

// SasTokenInfo SAS token information.
type SasTokenInfo struct {
	// AccessToken - READ-ONLY; the access token for the associated Azure Storage Container.
	AccessToken *string `json:"accessToken,omitempty"`
}

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

// StorageAccountInfo azure Storage account information.
type StorageAccountInfo struct {
	autorest.Response `json:"-"`
	// Name - the account name associated with the Azure storage account.
	Name *string `json:"name,omitempty"`
	// Properties - the properties associated with this storage account.
	Properties *StorageAccountProperties `json:"properties,omitempty"`
}

// StorageAccountProperties azure Storage account properties information.
type StorageAccountProperties struct {
	// AccessKey - the access key associated with this Azure Storage account that will be used to connect to it.
	AccessKey *string `json:"accessKey,omitempty"`
	// Suffix - the optional suffix for the Data Lake account.
	Suffix *string `json:"suffix,omitempty"`
}

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

// UnmarshalJSON is the custom unmarshaller for CreateFuture.
func (future *UpdateFuture) 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 UpdateFuture.Result.
func (future *UpdateFuture) result(client Client) (dlaa DataLakeAnalyticsAccount, err error) {
	var done bool
	done, err = future.DoneWithContext(context.Background(), client)
	if err != nil {
		err = autorest.NewErrorWithError(err, "account.UpdateFuture", "Result", future.Response(), "Polling failure")
		return
	}
	if !done {
		dlaa.Response.Response = future.Response()
		err = azure.NewAsyncOpIncompleteError("account.UpdateFuture")
		return
	}
	sender := autorest.DecorateSender(client, autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...))
	if dlaa.Response.Response, err = future.GetResult(sender); err == nil && dlaa.Response.Response.StatusCode != http.StatusNoContent {
		dlaa, err = client.UpdateResponder(dlaa.Response.Response)
		if err != nil {
			err = autorest.NewErrorWithError(err, "account.UpdateFuture", "Result", dlaa.Response.Response, "Failure responding to request")
		}
	}
	return
}
