// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT.

package pricing

import (
	"fmt"
	"time"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/awsutil"
	"github.com/aws/aws-sdk-go/aws/request"
	"github.com/aws/aws-sdk-go/private/protocol"
)

const opDescribeServices = "DescribeServices"

// DescribeServicesRequest generates a "aws/request.Request" representing the
// client's request for the DescribeServices operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See DescribeServices for more information on using the DescribeServices
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//	// Example sending a request using the DescribeServicesRequest method.
//	req, resp := client.DescribeServicesRequest(params)
//
//	err := req.Send()
//	if err == nil { // resp is now filled
//	    fmt.Println(resp)
//	}
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/pricing-2017-10-15/DescribeServices
func (c *Pricing) DescribeServicesRequest(input *DescribeServicesInput) (req *request.Request, output *DescribeServicesOutput) {
	op := &request.Operation{
		Name:       opDescribeServices,
		HTTPMethod: "POST",
		HTTPPath:   "/",
		Paginator: &request.Paginator{
			InputTokens:     []string{"NextToken"},
			OutputTokens:    []string{"NextToken"},
			LimitToken:      "MaxResults",
			TruncationToken: "",
		},
	}

	if input == nil {
		input = &DescribeServicesInput{}
	}

	output = &DescribeServicesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// DescribeServices API operation for AWS Price List Service.
//
// Returns the metadata for one service or a list of the metadata for all services.
// Use this without a service code to get the service codes for all services.
// Use it with a service code, such as AmazonEC2, to get information specific
// to that service, such as the attribute names available for that service.
// For example, some of the attribute names available for EC2 are volumeType,
// maxIopsVolume, operation, locationType, and instanceCapacity10xlarge.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for AWS Price List Service's
// API operation DescribeServices for usage and error information.
//
// Returned Error Types:
//
//   - InternalErrorException
//     An error on the server occurred during the processing of your request. Try
//     again later.
//
//   - InvalidParameterException
//     One or more parameters had an invalid value.
//
//   - NotFoundException
//     The requested resource can't be found.
//
//   - InvalidNextTokenException
//     The pagination token is invalid. Try again without a pagination token.
//
//   - ExpiredNextTokenException
//     The pagination token expired. Try again without a pagination token.
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/pricing-2017-10-15/DescribeServices
func (c *Pricing) DescribeServices(input *DescribeServicesInput) (*DescribeServicesOutput, error) {
	req, out := c.DescribeServicesRequest(input)
	return out, req.Send()
}

// DescribeServicesWithContext is the same as DescribeServices with the addition of
// the ability to pass a context and additional request options.
//
// See DescribeServices for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *Pricing) DescribeServicesWithContext(ctx aws.Context, input *DescribeServicesInput, opts ...request.Option) (*DescribeServicesOutput, error) {
	req, out := c.DescribeServicesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

// DescribeServicesPages iterates over the pages of a DescribeServices operation,
// calling the "fn" function with the response data for each page. To stop
// iterating, return false from the fn function.
//
// See DescribeServices method for more information on how to use this operation.
//
// Note: This operation can generate multiple requests to a service.
//
//	// Example iterating over at most 3 pages of a DescribeServices operation.
//	pageNum := 0
//	err := client.DescribeServicesPages(params,
//	    func(page *pricing.DescribeServicesOutput, lastPage bool) bool {
//	        pageNum++
//	        fmt.Println(page)
//	        return pageNum <= 3
//	    })
func (c *Pricing) DescribeServicesPages(input *DescribeServicesInput, fn func(*DescribeServicesOutput, bool) bool) error {
	return c.DescribeServicesPagesWithContext(aws.BackgroundContext(), input, fn)
}

// DescribeServicesPagesWithContext same as DescribeServicesPages except
// it takes a Context and allows setting request options on the pages.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *Pricing) DescribeServicesPagesWithContext(ctx aws.Context, input *DescribeServicesInput, fn func(*DescribeServicesOutput, bool) bool, opts ...request.Option) error {
	p := request.Pagination{
		NewRequest: func() (*request.Request, error) {
			var inCpy *DescribeServicesInput
			if input != nil {
				tmp := *input
				inCpy = &tmp
			}
			req, _ := c.DescribeServicesRequest(inCpy)
			req.SetContext(ctx)
			req.ApplyOptions(opts...)
			return req, nil
		},
	}

	for p.Next() {
		if !fn(p.Page().(*DescribeServicesOutput), !p.HasNextPage()) {
			break
		}
	}

	return p.Err()
}

const opGetAttributeValues = "GetAttributeValues"

// GetAttributeValuesRequest generates a "aws/request.Request" representing the
// client's request for the GetAttributeValues operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See GetAttributeValues for more information on using the GetAttributeValues
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//	// Example sending a request using the GetAttributeValuesRequest method.
//	req, resp := client.GetAttributeValuesRequest(params)
//
//	err := req.Send()
//	if err == nil { // resp is now filled
//	    fmt.Println(resp)
//	}
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/pricing-2017-10-15/GetAttributeValues
func (c *Pricing) GetAttributeValuesRequest(input *GetAttributeValuesInput) (req *request.Request, output *GetAttributeValuesOutput) {
	op := &request.Operation{
		Name:       opGetAttributeValues,
		HTTPMethod: "POST",
		HTTPPath:   "/",
		Paginator: &request.Paginator{
			InputTokens:     []string{"NextToken"},
			OutputTokens:    []string{"NextToken"},
			LimitToken:      "MaxResults",
			TruncationToken: "",
		},
	}

	if input == nil {
		input = &GetAttributeValuesInput{}
	}

	output = &GetAttributeValuesOutput{}
	req = c.newRequest(op, input, output)
	return
}

// GetAttributeValues API operation for AWS Price List Service.
//
// Returns a list of attribute values. Attributes are similar to the details
// in a Price List API offer file. For a list of available attributes, see Offer
// File Definitions (https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/reading-an-offer.html#pps-defs)
// in the Billing and Cost Management User Guide (https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/billing-what-is.html).
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for AWS Price List Service's
// API operation GetAttributeValues for usage and error information.
//
// Returned Error Types:
//
//   - InternalErrorException
//     An error on the server occurred during the processing of your request. Try
//     again later.
//
//   - InvalidParameterException
//     One or more parameters had an invalid value.
//
//   - NotFoundException
//     The requested resource can't be found.
//
//   - InvalidNextTokenException
//     The pagination token is invalid. Try again without a pagination token.
//
//   - ExpiredNextTokenException
//     The pagination token expired. Try again without a pagination token.
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/pricing-2017-10-15/GetAttributeValues
func (c *Pricing) GetAttributeValues(input *GetAttributeValuesInput) (*GetAttributeValuesOutput, error) {
	req, out := c.GetAttributeValuesRequest(input)
	return out, req.Send()
}

// GetAttributeValuesWithContext is the same as GetAttributeValues with the addition of
// the ability to pass a context and additional request options.
//
// See GetAttributeValues for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *Pricing) GetAttributeValuesWithContext(ctx aws.Context, input *GetAttributeValuesInput, opts ...request.Option) (*GetAttributeValuesOutput, error) {
	req, out := c.GetAttributeValuesRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

// GetAttributeValuesPages iterates over the pages of a GetAttributeValues operation,
// calling the "fn" function with the response data for each page. To stop
// iterating, return false from the fn function.
//
// See GetAttributeValues method for more information on how to use this operation.
//
// Note: This operation can generate multiple requests to a service.
//
//	// Example iterating over at most 3 pages of a GetAttributeValues operation.
//	pageNum := 0
//	err := client.GetAttributeValuesPages(params,
//	    func(page *pricing.GetAttributeValuesOutput, lastPage bool) bool {
//	        pageNum++
//	        fmt.Println(page)
//	        return pageNum <= 3
//	    })
func (c *Pricing) GetAttributeValuesPages(input *GetAttributeValuesInput, fn func(*GetAttributeValuesOutput, bool) bool) error {
	return c.GetAttributeValuesPagesWithContext(aws.BackgroundContext(), input, fn)
}

// GetAttributeValuesPagesWithContext same as GetAttributeValuesPages except
// it takes a Context and allows setting request options on the pages.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *Pricing) GetAttributeValuesPagesWithContext(ctx aws.Context, input *GetAttributeValuesInput, fn func(*GetAttributeValuesOutput, bool) bool, opts ...request.Option) error {
	p := request.Pagination{
		NewRequest: func() (*request.Request, error) {
			var inCpy *GetAttributeValuesInput
			if input != nil {
				tmp := *input
				inCpy = &tmp
			}
			req, _ := c.GetAttributeValuesRequest(inCpy)
			req.SetContext(ctx)
			req.ApplyOptions(opts...)
			return req, nil
		},
	}

	for p.Next() {
		if !fn(p.Page().(*GetAttributeValuesOutput), !p.HasNextPage()) {
			break
		}
	}

	return p.Err()
}

const opGetPriceListFileUrl = "GetPriceListFileUrl"

// GetPriceListFileUrlRequest generates a "aws/request.Request" representing the
// client's request for the GetPriceListFileUrl operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See GetPriceListFileUrl for more information on using the GetPriceListFileUrl
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//	// Example sending a request using the GetPriceListFileUrlRequest method.
//	req, resp := client.GetPriceListFileUrlRequest(params)
//
//	err := req.Send()
//	if err == nil { // resp is now filled
//	    fmt.Println(resp)
//	}
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/pricing-2017-10-15/GetPriceListFileUrl
func (c *Pricing) GetPriceListFileUrlRequest(input *GetPriceListFileUrlInput) (req *request.Request, output *GetPriceListFileUrlOutput) {
	op := &request.Operation{
		Name:       opGetPriceListFileUrl,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &GetPriceListFileUrlInput{}
	}

	output = &GetPriceListFileUrlOutput{}
	req = c.newRequest(op, input, output)
	return
}

// GetPriceListFileUrl API operation for AWS Price List Service.
//
//	This feature is in preview release and is subject to change. Your use of
//	Amazon Web Services Price List API is subject to the Beta Service Participation
//	terms of the Amazon Web Services Service Terms (https://aws.amazon.com/service-terms/)
//	(Section 1.10).
//
// This returns the URL that you can retrieve your Price List file from. This
// URL is based on the PriceListArn and FileFormat that you retrieve from the
// ListPriceLists (https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_pricing_ListPriceLists.html)
// response.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for AWS Price List Service's
// API operation GetPriceListFileUrl for usage and error information.
//
// Returned Error Types:
//
//   - InternalErrorException
//     An error on the server occurred during the processing of your request. Try
//     again later.
//
//   - InvalidParameterException
//     One or more parameters had an invalid value.
//
//   - NotFoundException
//     The requested resource can't be found.
//
//   - AccessDeniedException
//     General authentication failure. The request wasn't signed correctly.
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/pricing-2017-10-15/GetPriceListFileUrl
func (c *Pricing) GetPriceListFileUrl(input *GetPriceListFileUrlInput) (*GetPriceListFileUrlOutput, error) {
	req, out := c.GetPriceListFileUrlRequest(input)
	return out, req.Send()
}

// GetPriceListFileUrlWithContext is the same as GetPriceListFileUrl with the addition of
// the ability to pass a context and additional request options.
//
// See GetPriceListFileUrl for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *Pricing) GetPriceListFileUrlWithContext(ctx aws.Context, input *GetPriceListFileUrlInput, opts ...request.Option) (*GetPriceListFileUrlOutput, error) {
	req, out := c.GetPriceListFileUrlRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

const opGetProducts = "GetProducts"

// GetProductsRequest generates a "aws/request.Request" representing the
// client's request for the GetProducts operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See GetProducts for more information on using the GetProducts
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//	// Example sending a request using the GetProductsRequest method.
//	req, resp := client.GetProductsRequest(params)
//
//	err := req.Send()
//	if err == nil { // resp is now filled
//	    fmt.Println(resp)
//	}
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/pricing-2017-10-15/GetProducts
func (c *Pricing) GetProductsRequest(input *GetProductsInput) (req *request.Request, output *GetProductsOutput) {
	op := &request.Operation{
		Name:       opGetProducts,
		HTTPMethod: "POST",
		HTTPPath:   "/",
		Paginator: &request.Paginator{
			InputTokens:     []string{"NextToken"},
			OutputTokens:    []string{"NextToken"},
			LimitToken:      "MaxResults",
			TruncationToken: "",
		},
	}

	if input == nil {
		input = &GetProductsInput{}
	}

	output = &GetProductsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// GetProducts API operation for AWS Price List Service.
//
// Returns a list of all products that match the filter criteria.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for AWS Price List Service's
// API operation GetProducts for usage and error information.
//
// Returned Error Types:
//
//   - InternalErrorException
//     An error on the server occurred during the processing of your request. Try
//     again later.
//
//   - InvalidParameterException
//     One or more parameters had an invalid value.
//
//   - NotFoundException
//     The requested resource can't be found.
//
//   - InvalidNextTokenException
//     The pagination token is invalid. Try again without a pagination token.
//
//   - ExpiredNextTokenException
//     The pagination token expired. Try again without a pagination token.
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/pricing-2017-10-15/GetProducts
func (c *Pricing) GetProducts(input *GetProductsInput) (*GetProductsOutput, error) {
	req, out := c.GetProductsRequest(input)
	return out, req.Send()
}

// GetProductsWithContext is the same as GetProducts with the addition of
// the ability to pass a context and additional request options.
//
// See GetProducts for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *Pricing) GetProductsWithContext(ctx aws.Context, input *GetProductsInput, opts ...request.Option) (*GetProductsOutput, error) {
	req, out := c.GetProductsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

// GetProductsPages iterates over the pages of a GetProducts operation,
// calling the "fn" function with the response data for each page. To stop
// iterating, return false from the fn function.
//
// See GetProducts method for more information on how to use this operation.
//
// Note: This operation can generate multiple requests to a service.
//
//	// Example iterating over at most 3 pages of a GetProducts operation.
//	pageNum := 0
//	err := client.GetProductsPages(params,
//	    func(page *pricing.GetProductsOutput, lastPage bool) bool {
//	        pageNum++
//	        fmt.Println(page)
//	        return pageNum <= 3
//	    })
func (c *Pricing) GetProductsPages(input *GetProductsInput, fn func(*GetProductsOutput, bool) bool) error {
	return c.GetProductsPagesWithContext(aws.BackgroundContext(), input, fn)
}

// GetProductsPagesWithContext same as GetProductsPages except
// it takes a Context and allows setting request options on the pages.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *Pricing) GetProductsPagesWithContext(ctx aws.Context, input *GetProductsInput, fn func(*GetProductsOutput, bool) bool, opts ...request.Option) error {
	p := request.Pagination{
		NewRequest: func() (*request.Request, error) {
			var inCpy *GetProductsInput
			if input != nil {
				tmp := *input
				inCpy = &tmp
			}
			req, _ := c.GetProductsRequest(inCpy)
			req.SetContext(ctx)
			req.ApplyOptions(opts...)
			return req, nil
		},
	}

	for p.Next() {
		if !fn(p.Page().(*GetProductsOutput), !p.HasNextPage()) {
			break
		}
	}

	return p.Err()
}

const opListPriceLists = "ListPriceLists"

// ListPriceListsRequest generates a "aws/request.Request" representing the
// client's request for the ListPriceLists operation. The "output" return
// value will be populated with the request's response once the request completes
// successfully.
//
// Use "Send" method on the returned Request to send the API call to the service.
// the "output" return value is not valid until after Send returns without error.
//
// See ListPriceLists for more information on using the ListPriceLists
// API call, and error handling.
//
// This method is useful when you want to inject custom logic or configuration
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
//
//	// Example sending a request using the ListPriceListsRequest method.
//	req, resp := client.ListPriceListsRequest(params)
//
//	err := req.Send()
//	if err == nil { // resp is now filled
//	    fmt.Println(resp)
//	}
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/pricing-2017-10-15/ListPriceLists
func (c *Pricing) ListPriceListsRequest(input *ListPriceListsInput) (req *request.Request, output *ListPriceListsOutput) {
	op := &request.Operation{
		Name:       opListPriceLists,
		HTTPMethod: "POST",
		HTTPPath:   "/",
		Paginator: &request.Paginator{
			InputTokens:     []string{"NextToken"},
			OutputTokens:    []string{"NextToken"},
			LimitToken:      "MaxResults",
			TruncationToken: "",
		},
	}

	if input == nil {
		input = &ListPriceListsInput{}
	}

	output = &ListPriceListsOutput{}
	req = c.newRequest(op, input, output)
	return
}

// ListPriceLists API operation for AWS Price List Service.
//
//	This feature is in preview release and is subject to change. Your use of
//	Amazon Web Services Price List API is subject to the Beta Service Participation
//	terms of the Amazon Web Services Service Terms (https://aws.amazon.com/service-terms/)
//	(Section 1.10).
//
// This returns a list of Price List references that the requester if authorized
// to view, given a ServiceCode, CurrencyCode, and an EffectiveDate. Use without
// a RegionCode filter to list Price List references from all available Amazon
// Web Services Regions. Use with a RegionCode filter to get the Price List
// reference that's specific to a specific Amazon Web Services Region. You can
// use the PriceListArn from the response to get your preferred Price List files
// through the GetPriceListFileUrl (https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_pricing_GetPriceListFileUrl.html)
// API.
//
// Returns awserr.Error for service API and SDK errors. Use runtime type assertions
// with awserr.Error's Code and Message methods to get detailed information about
// the error.
//
// See the AWS API reference guide for AWS Price List Service's
// API operation ListPriceLists for usage and error information.
//
// Returned Error Types:
//
//   - InternalErrorException
//     An error on the server occurred during the processing of your request. Try
//     again later.
//
//   - InvalidParameterException
//     One or more parameters had an invalid value.
//
//   - NotFoundException
//     The requested resource can't be found.
//
//   - InvalidNextTokenException
//     The pagination token is invalid. Try again without a pagination token.
//
//   - ExpiredNextTokenException
//     The pagination token expired. Try again without a pagination token.
//
//   - AccessDeniedException
//     General authentication failure. The request wasn't signed correctly.
//
// See also, https://docs.aws.amazon.com/goto/WebAPI/pricing-2017-10-15/ListPriceLists
func (c *Pricing) ListPriceLists(input *ListPriceListsInput) (*ListPriceListsOutput, error) {
	req, out := c.ListPriceListsRequest(input)
	return out, req.Send()
}

// ListPriceListsWithContext is the same as ListPriceLists with the addition of
// the ability to pass a context and additional request options.
//
// See ListPriceLists for details on how to use this API operation.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *Pricing) ListPriceListsWithContext(ctx aws.Context, input *ListPriceListsInput, opts ...request.Option) (*ListPriceListsOutput, error) {
	req, out := c.ListPriceListsRequest(input)
	req.SetContext(ctx)
	req.ApplyOptions(opts...)
	return out, req.Send()
}

// ListPriceListsPages iterates over the pages of a ListPriceLists operation,
// calling the "fn" function with the response data for each page. To stop
// iterating, return false from the fn function.
//
// See ListPriceLists method for more information on how to use this operation.
//
// Note: This operation can generate multiple requests to a service.
//
//	// Example iterating over at most 3 pages of a ListPriceLists operation.
//	pageNum := 0
//	err := client.ListPriceListsPages(params,
//	    func(page *pricing.ListPriceListsOutput, lastPage bool) bool {
//	        pageNum++
//	        fmt.Println(page)
//	        return pageNum <= 3
//	    })
func (c *Pricing) ListPriceListsPages(input *ListPriceListsInput, fn func(*ListPriceListsOutput, bool) bool) error {
	return c.ListPriceListsPagesWithContext(aws.BackgroundContext(), input, fn)
}

// ListPriceListsPagesWithContext same as ListPriceListsPages except
// it takes a Context and allows setting request options on the pages.
//
// The context must be non-nil and will be used for request cancellation. If
// the context is nil a panic will occur. In the future the SDK may create
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
// for more information on using Contexts.
func (c *Pricing) ListPriceListsPagesWithContext(ctx aws.Context, input *ListPriceListsInput, fn func(*ListPriceListsOutput, bool) bool, opts ...request.Option) error {
	p := request.Pagination{
		NewRequest: func() (*request.Request, error) {
			var inCpy *ListPriceListsInput
			if input != nil {
				tmp := *input
				inCpy = &tmp
			}
			req, _ := c.ListPriceListsRequest(inCpy)
			req.SetContext(ctx)
			req.ApplyOptions(opts...)
			return req, nil
		},
	}

	for p.Next() {
		if !fn(p.Page().(*ListPriceListsOutput), !p.HasNextPage()) {
			break
		}
	}

	return p.Err()
}

// General authentication failure. The request wasn't signed correctly.
type AccessDeniedException struct {
	_            struct{}                  `type:"structure"`
	RespMetadata protocol.ResponseMetadata `json:"-" xml:"-"`

	Message_ *string `locationName:"Message" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s AccessDeniedException) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s AccessDeniedException) GoString() string {
	return s.String()
}

func newErrorAccessDeniedException(v protocol.ResponseMetadata) error {
	return &AccessDeniedException{
		RespMetadata: v,
	}
}

// Code returns the exception type name.
func (s *AccessDeniedException) Code() string {
	return "AccessDeniedException"
}

// Message returns the exception's message.
func (s *AccessDeniedException) Message() string {
	if s.Message_ != nil {
		return *s.Message_
	}
	return ""
}

// OrigErr always returns nil, satisfies awserr.Error interface.
func (s *AccessDeniedException) OrigErr() error {
	return nil
}

func (s *AccessDeniedException) Error() string {
	return fmt.Sprintf("%s: %s", s.Code(), s.Message())
}

// Status code returns the HTTP status code for the request's response error.
func (s *AccessDeniedException) StatusCode() int {
	return s.RespMetadata.StatusCode
}

// RequestID returns the service's response RequestID for request.
func (s *AccessDeniedException) RequestID() string {
	return s.RespMetadata.RequestID
}

// The values of a given attribute, such as Throughput Optimized HDD or Provisioned
// IOPS for the Amazon EC2 volumeType attribute.
type AttributeValue struct {
	_ struct{} `type:"structure"`

	// The specific value of an attributeName.
	Value *string `type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s AttributeValue) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s AttributeValue) GoString() string {
	return s.String()
}

// SetValue sets the Value field's value.
func (s *AttributeValue) SetValue(v string) *AttributeValue {
	s.Value = &v
	return s
}

type DescribeServicesInput struct {
	_ struct{} `type:"structure"`

	// The format version that you want the response to be in.
	//
	// Valid values are: aws_v1
	FormatVersion *string `type:"string"`

	// The maximum number of results that you want returned in the response.
	MaxResults *int64 `min:"1" type:"integer"`

	// The pagination token that indicates the next set of results that you want
	// to retrieve.
	NextToken *string `type:"string"`

	// The code for the service whose information you want to retrieve, such as
	// AmazonEC2. You can use the ServiceCode to filter the results in a GetProducts
	// call. To retrieve a list of all services, leave this blank.
	ServiceCode *string `type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s DescribeServicesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s DescribeServicesInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeServicesInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeServicesInput"}
	if s.MaxResults != nil && *s.MaxResults < 1 {
		invalidParams.Add(request.NewErrParamMinValue("MaxResults", 1))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetFormatVersion sets the FormatVersion field's value.
func (s *DescribeServicesInput) SetFormatVersion(v string) *DescribeServicesInput {
	s.FormatVersion = &v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *DescribeServicesInput) SetMaxResults(v int64) *DescribeServicesInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeServicesInput) SetNextToken(v string) *DescribeServicesInput {
	s.NextToken = &v
	return s
}

// SetServiceCode sets the ServiceCode field's value.
func (s *DescribeServicesInput) SetServiceCode(v string) *DescribeServicesInput {
	s.ServiceCode = &v
	return s
}

type DescribeServicesOutput struct {
	_ struct{} `type:"structure"`

	// The format version of the response. For example, aws_v1.
	FormatVersion *string `type:"string"`

	// The pagination token for the next set of retrievable results.
	NextToken *string `type:"string"`

	// The service metadata for the service or services in the response.
	Services []*Service `type:"list"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s DescribeServicesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s DescribeServicesOutput) GoString() string {
	return s.String()
}

// SetFormatVersion sets the FormatVersion field's value.
func (s *DescribeServicesOutput) SetFormatVersion(v string) *DescribeServicesOutput {
	s.FormatVersion = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *DescribeServicesOutput) SetNextToken(v string) *DescribeServicesOutput {
	s.NextToken = &v
	return s
}

// SetServices sets the Services field's value.
func (s *DescribeServicesOutput) SetServices(v []*Service) *DescribeServicesOutput {
	s.Services = v
	return s
}

// The pagination token expired. Try again without a pagination token.
type ExpiredNextTokenException struct {
	_            struct{}                  `type:"structure"`
	RespMetadata protocol.ResponseMetadata `json:"-" xml:"-"`

	Message_ *string `locationName:"Message" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ExpiredNextTokenException) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ExpiredNextTokenException) GoString() string {
	return s.String()
}

func newErrorExpiredNextTokenException(v protocol.ResponseMetadata) error {
	return &ExpiredNextTokenException{
		RespMetadata: v,
	}
}

// Code returns the exception type name.
func (s *ExpiredNextTokenException) Code() string {
	return "ExpiredNextTokenException"
}

// Message returns the exception's message.
func (s *ExpiredNextTokenException) Message() string {
	if s.Message_ != nil {
		return *s.Message_
	}
	return ""
}

// OrigErr always returns nil, satisfies awserr.Error interface.
func (s *ExpiredNextTokenException) OrigErr() error {
	return nil
}

func (s *ExpiredNextTokenException) Error() string {
	return fmt.Sprintf("%s: %s", s.Code(), s.Message())
}

// Status code returns the HTTP status code for the request's response error.
func (s *ExpiredNextTokenException) StatusCode() int {
	return s.RespMetadata.StatusCode
}

// RequestID returns the service's response RequestID for request.
func (s *ExpiredNextTokenException) RequestID() string {
	return s.RespMetadata.RequestID
}

// The constraints that you want all returned products to match.
type Filter struct {
	_ struct{} `type:"structure"`

	// The product metadata field that you want to filter on. You can filter by
	// just the service code to see all products for a specific service, filter
	// by just the attribute name to see a specific attribute for multiple services,
	// or use both a service code and an attribute name to retrieve only products
	// that match both fields.
	//
	// Valid values include: ServiceCode, and all attribute names
	//
	// For example, you can filter by the AmazonEC2 service code and the volumeType
	// attribute name to get the prices for only Amazon EC2 volumes.
	//
	// Field is a required field
	Field *string `type:"string" required:"true"`

	// The type of filter that you want to use.
	//
	// Valid values are: TERM_MATCH. TERM_MATCH returns only products that match
	// both the given filter field and the given value.
	//
	// Type is a required field
	Type *string `type:"string" required:"true" enum:"FilterType"`

	// The service code or attribute value that you want to filter by. If you're
	// filtering by service code this is the actual service code, such as AmazonEC2.
	// If you're filtering by attribute name, this is the attribute value that you
	// want the returned products to match, such as a Provisioned IOPS volume.
	//
	// Value is a required field
	Value *string `type:"string" required:"true"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s Filter) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s Filter) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *Filter) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "Filter"}
	if s.Field == nil {
		invalidParams.Add(request.NewErrParamRequired("Field"))
	}
	if s.Type == nil {
		invalidParams.Add(request.NewErrParamRequired("Type"))
	}
	if s.Value == nil {
		invalidParams.Add(request.NewErrParamRequired("Value"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetField sets the Field field's value.
func (s *Filter) SetField(v string) *Filter {
	s.Field = &v
	return s
}

// SetType sets the Type field's value.
func (s *Filter) SetType(v string) *Filter {
	s.Type = &v
	return s
}

// SetValue sets the Value field's value.
func (s *Filter) SetValue(v string) *Filter {
	s.Value = &v
	return s
}

type GetAttributeValuesInput struct {
	_ struct{} `type:"structure"`

	// The name of the attribute that you want to retrieve the values for, such
	// as volumeType.
	//
	// AttributeName is a required field
	AttributeName *string `type:"string" required:"true"`

	// The maximum number of results to return in response.
	MaxResults *int64 `min:"1" type:"integer"`

	// The pagination token that indicates the next set of results that you want
	// to retrieve.
	NextToken *string `type:"string"`

	// The service code for the service whose attributes you want to retrieve. For
	// example, if you want the retrieve an EC2 attribute, use AmazonEC2.
	//
	// ServiceCode is a required field
	ServiceCode *string `type:"string" required:"true"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s GetAttributeValuesInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s GetAttributeValuesInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *GetAttributeValuesInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "GetAttributeValuesInput"}
	if s.AttributeName == nil {
		invalidParams.Add(request.NewErrParamRequired("AttributeName"))
	}
	if s.MaxResults != nil && *s.MaxResults < 1 {
		invalidParams.Add(request.NewErrParamMinValue("MaxResults", 1))
	}
	if s.ServiceCode == nil {
		invalidParams.Add(request.NewErrParamRequired("ServiceCode"))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetAttributeName sets the AttributeName field's value.
func (s *GetAttributeValuesInput) SetAttributeName(v string) *GetAttributeValuesInput {
	s.AttributeName = &v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *GetAttributeValuesInput) SetMaxResults(v int64) *GetAttributeValuesInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *GetAttributeValuesInput) SetNextToken(v string) *GetAttributeValuesInput {
	s.NextToken = &v
	return s
}

// SetServiceCode sets the ServiceCode field's value.
func (s *GetAttributeValuesInput) SetServiceCode(v string) *GetAttributeValuesInput {
	s.ServiceCode = &v
	return s
}

type GetAttributeValuesOutput struct {
	_ struct{} `type:"structure"`

	// The list of values for an attribute. For example, Throughput Optimized HDD
	// and Provisioned IOPS are two available values for the AmazonEC2 volumeType.
	AttributeValues []*AttributeValue `type:"list"`

	// The pagination token that indicates the next set of results to retrieve.
	NextToken *string `type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s GetAttributeValuesOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s GetAttributeValuesOutput) GoString() string {
	return s.String()
}

// SetAttributeValues sets the AttributeValues field's value.
func (s *GetAttributeValuesOutput) SetAttributeValues(v []*AttributeValue) *GetAttributeValuesOutput {
	s.AttributeValues = v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *GetAttributeValuesOutput) SetNextToken(v string) *GetAttributeValuesOutput {
	s.NextToken = &v
	return s
}

type GetPriceListFileUrlInput struct {
	_ struct{} `type:"structure"`

	// The format that you want to retrieve your Price List files in. The FileFormat
	// can be obtained from the ListPriceLists (https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_pricing_ListPriceLists.html)
	// response.
	//
	// FileFormat is a required field
	FileFormat *string `min:"1" type:"string" required:"true"`

	// The unique identifier that maps to where your Price List files are located.
	// PriceListArn can be obtained from the ListPriceLists (https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_pricing_ListPriceLists.html)
	// response.
	//
	// PriceListArn is a required field
	PriceListArn *string `min:"18" type:"string" required:"true"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s GetPriceListFileUrlInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s GetPriceListFileUrlInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *GetPriceListFileUrlInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "GetPriceListFileUrlInput"}
	if s.FileFormat == nil {
		invalidParams.Add(request.NewErrParamRequired("FileFormat"))
	}
	if s.FileFormat != nil && len(*s.FileFormat) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("FileFormat", 1))
	}
	if s.PriceListArn == nil {
		invalidParams.Add(request.NewErrParamRequired("PriceListArn"))
	}
	if s.PriceListArn != nil && len(*s.PriceListArn) < 18 {
		invalidParams.Add(request.NewErrParamMinLen("PriceListArn", 18))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetFileFormat sets the FileFormat field's value.
func (s *GetPriceListFileUrlInput) SetFileFormat(v string) *GetPriceListFileUrlInput {
	s.FileFormat = &v
	return s
}

// SetPriceListArn sets the PriceListArn field's value.
func (s *GetPriceListFileUrlInput) SetPriceListArn(v string) *GetPriceListFileUrlInput {
	s.PriceListArn = &v
	return s
}

type GetPriceListFileUrlOutput struct {
	_ struct{} `type:"structure"`

	// The URL to download your Price List file from.
	Url *string `type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s GetPriceListFileUrlOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s GetPriceListFileUrlOutput) GoString() string {
	return s.String()
}

// SetUrl sets the Url field's value.
func (s *GetPriceListFileUrlOutput) SetUrl(v string) *GetPriceListFileUrlOutput {
	s.Url = &v
	return s
}

type GetProductsInput struct {
	_ struct{} `type:"structure"`

	// The list of filters that limit the returned products. only products that
	// match all filters are returned.
	Filters []*Filter `type:"list"`

	// The format version that you want the response to be in.
	//
	// Valid values are: aws_v1
	FormatVersion *string `type:"string"`

	// The maximum number of results to return in the response.
	MaxResults *int64 `min:"1" type:"integer"`

	// The pagination token that indicates the next set of results that you want
	// to retrieve.
	NextToken *string `type:"string"`

	// The code for the service whose products you want to retrieve.
	//
	// ServiceCode is a required field
	ServiceCode *string `type:"string" required:"true"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s GetProductsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s GetProductsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *GetProductsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "GetProductsInput"}
	if s.MaxResults != nil && *s.MaxResults < 1 {
		invalidParams.Add(request.NewErrParamMinValue("MaxResults", 1))
	}
	if s.ServiceCode == nil {
		invalidParams.Add(request.NewErrParamRequired("ServiceCode"))
	}
	if s.Filters != nil {
		for i, v := range s.Filters {
			if v == nil {
				continue
			}
			if err := v.Validate(); err != nil {
				invalidParams.AddNested(fmt.Sprintf("%s[%v]", "Filters", i), err.(request.ErrInvalidParams))
			}
		}
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetFilters sets the Filters field's value.
func (s *GetProductsInput) SetFilters(v []*Filter) *GetProductsInput {
	s.Filters = v
	return s
}

// SetFormatVersion sets the FormatVersion field's value.
func (s *GetProductsInput) SetFormatVersion(v string) *GetProductsInput {
	s.FormatVersion = &v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *GetProductsInput) SetMaxResults(v int64) *GetProductsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *GetProductsInput) SetNextToken(v string) *GetProductsInput {
	s.NextToken = &v
	return s
}

// SetServiceCode sets the ServiceCode field's value.
func (s *GetProductsInput) SetServiceCode(v string) *GetProductsInput {
	s.ServiceCode = &v
	return s
}

type GetProductsOutput struct {
	_ struct{} `type:"structure"`

	// The format version of the response. For example, aws_v1.
	FormatVersion *string `type:"string"`

	// The pagination token that indicates the next set of results to retrieve.
	NextToken *string `type:"string"`

	// The list of products that match your filters. The list contains both the
	// product metadata and the price information.
	PriceList []aws.JSONValue `type:"list"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s GetProductsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s GetProductsOutput) GoString() string {
	return s.String()
}

// SetFormatVersion sets the FormatVersion field's value.
func (s *GetProductsOutput) SetFormatVersion(v string) *GetProductsOutput {
	s.FormatVersion = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *GetProductsOutput) SetNextToken(v string) *GetProductsOutput {
	s.NextToken = &v
	return s
}

// SetPriceList sets the PriceList field's value.
func (s *GetProductsOutput) SetPriceList(v []aws.JSONValue) *GetProductsOutput {
	s.PriceList = v
	return s
}

// An error on the server occurred during the processing of your request. Try
// again later.
type InternalErrorException struct {
	_            struct{}                  `type:"structure"`
	RespMetadata protocol.ResponseMetadata `json:"-" xml:"-"`

	Message_ *string `locationName:"Message" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s InternalErrorException) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s InternalErrorException) GoString() string {
	return s.String()
}

func newErrorInternalErrorException(v protocol.ResponseMetadata) error {
	return &InternalErrorException{
		RespMetadata: v,
	}
}

// Code returns the exception type name.
func (s *InternalErrorException) Code() string {
	return "InternalErrorException"
}

// Message returns the exception's message.
func (s *InternalErrorException) Message() string {
	if s.Message_ != nil {
		return *s.Message_
	}
	return ""
}

// OrigErr always returns nil, satisfies awserr.Error interface.
func (s *InternalErrorException) OrigErr() error {
	return nil
}

func (s *InternalErrorException) Error() string {
	return fmt.Sprintf("%s: %s", s.Code(), s.Message())
}

// Status code returns the HTTP status code for the request's response error.
func (s *InternalErrorException) StatusCode() int {
	return s.RespMetadata.StatusCode
}

// RequestID returns the service's response RequestID for request.
func (s *InternalErrorException) RequestID() string {
	return s.RespMetadata.RequestID
}

// The pagination token is invalid. Try again without a pagination token.
type InvalidNextTokenException struct {
	_            struct{}                  `type:"structure"`
	RespMetadata protocol.ResponseMetadata `json:"-" xml:"-"`

	Message_ *string `locationName:"Message" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s InvalidNextTokenException) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s InvalidNextTokenException) GoString() string {
	return s.String()
}

func newErrorInvalidNextTokenException(v protocol.ResponseMetadata) error {
	return &InvalidNextTokenException{
		RespMetadata: v,
	}
}

// Code returns the exception type name.
func (s *InvalidNextTokenException) Code() string {
	return "InvalidNextTokenException"
}

// Message returns the exception's message.
func (s *InvalidNextTokenException) Message() string {
	if s.Message_ != nil {
		return *s.Message_
	}
	return ""
}

// OrigErr always returns nil, satisfies awserr.Error interface.
func (s *InvalidNextTokenException) OrigErr() error {
	return nil
}

func (s *InvalidNextTokenException) Error() string {
	return fmt.Sprintf("%s: %s", s.Code(), s.Message())
}

// Status code returns the HTTP status code for the request's response error.
func (s *InvalidNextTokenException) StatusCode() int {
	return s.RespMetadata.StatusCode
}

// RequestID returns the service's response RequestID for request.
func (s *InvalidNextTokenException) RequestID() string {
	return s.RespMetadata.RequestID
}

// One or more parameters had an invalid value.
type InvalidParameterException struct {
	_            struct{}                  `type:"structure"`
	RespMetadata protocol.ResponseMetadata `json:"-" xml:"-"`

	Message_ *string `locationName:"Message" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s InvalidParameterException) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s InvalidParameterException) GoString() string {
	return s.String()
}

func newErrorInvalidParameterException(v protocol.ResponseMetadata) error {
	return &InvalidParameterException{
		RespMetadata: v,
	}
}

// Code returns the exception type name.
func (s *InvalidParameterException) Code() string {
	return "InvalidParameterException"
}

// Message returns the exception's message.
func (s *InvalidParameterException) Message() string {
	if s.Message_ != nil {
		return *s.Message_
	}
	return ""
}

// OrigErr always returns nil, satisfies awserr.Error interface.
func (s *InvalidParameterException) OrigErr() error {
	return nil
}

func (s *InvalidParameterException) Error() string {
	return fmt.Sprintf("%s: %s", s.Code(), s.Message())
}

// Status code returns the HTTP status code for the request's response error.
func (s *InvalidParameterException) StatusCode() int {
	return s.RespMetadata.StatusCode
}

// RequestID returns the service's response RequestID for request.
func (s *InvalidParameterException) RequestID() string {
	return s.RespMetadata.RequestID
}

type ListPriceListsInput struct {
	_ struct{} `type:"structure"`

	// The three alphabetical character ISO-4217 currency code that the Price List
	// files are denominated in.
	//
	// CurrencyCode is a required field
	CurrencyCode *string `type:"string" required:"true"`

	// The date that the Price List file prices are effective from.
	//
	// EffectiveDate is a required field
	EffectiveDate *time.Time `type:"timestamp" required:"true"`

	// The maximum number of results to return in the response.
	MaxResults *int64 `min:"1" type:"integer"`

	// The pagination token that indicates the next set of results that you want
	// to retrieve.
	NextToken *string `type:"string"`

	// This is used to filter the Price List by Amazon Web Services Region. For
	// example, to get the price list only for the US East (N. Virginia) Region,
	// use us-east-1. If nothing is specified, you retrieve price lists for all
	// applicable Regions. The available RegionCode list can be retrieved from GetAttributeValues
	// (https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_pricing_GetAttributeValues.html)
	// API.
	RegionCode *string `min:"1" type:"string"`

	// The service code or the Savings Plan service code for the attributes that
	// you want to retrieve. For example, to get the list of applicable Amazon EC2
	// price lists, use AmazonEC2. For a full list of service codes containing On-Demand
	// and Reserved Instance (RI) pricing, use the DescribeServices (https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_pricing_DescribeServices.html#awscostmanagement-pricing_DescribeServices-request-FormatVersion)
	// API.
	//
	// To retrieve the Compute Savings Plan price lists, use ComputeSavingsPlans.
	// To retrieve Machine Learning Savings Plans price lists, use MachineLearningSavingsPlans.
	//
	// ServiceCode is a required field
	ServiceCode *string `min:"1" type:"string" required:"true"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ListPriceListsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ListPriceListsInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *ListPriceListsInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "ListPriceListsInput"}
	if s.CurrencyCode == nil {
		invalidParams.Add(request.NewErrParamRequired("CurrencyCode"))
	}
	if s.EffectiveDate == nil {
		invalidParams.Add(request.NewErrParamRequired("EffectiveDate"))
	}
	if s.MaxResults != nil && *s.MaxResults < 1 {
		invalidParams.Add(request.NewErrParamMinValue("MaxResults", 1))
	}
	if s.RegionCode != nil && len(*s.RegionCode) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("RegionCode", 1))
	}
	if s.ServiceCode == nil {
		invalidParams.Add(request.NewErrParamRequired("ServiceCode"))
	}
	if s.ServiceCode != nil && len(*s.ServiceCode) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("ServiceCode", 1))
	}

	if invalidParams.Len() > 0 {
		return invalidParams
	}
	return nil
}

// SetCurrencyCode sets the CurrencyCode field's value.
func (s *ListPriceListsInput) SetCurrencyCode(v string) *ListPriceListsInput {
	s.CurrencyCode = &v
	return s
}

// SetEffectiveDate sets the EffectiveDate field's value.
func (s *ListPriceListsInput) SetEffectiveDate(v time.Time) *ListPriceListsInput {
	s.EffectiveDate = &v
	return s
}

// SetMaxResults sets the MaxResults field's value.
func (s *ListPriceListsInput) SetMaxResults(v int64) *ListPriceListsInput {
	s.MaxResults = &v
	return s
}

// SetNextToken sets the NextToken field's value.
func (s *ListPriceListsInput) SetNextToken(v string) *ListPriceListsInput {
	s.NextToken = &v
	return s
}

// SetRegionCode sets the RegionCode field's value.
func (s *ListPriceListsInput) SetRegionCode(v string) *ListPriceListsInput {
	s.RegionCode = &v
	return s
}

// SetServiceCode sets the ServiceCode field's value.
func (s *ListPriceListsInput) SetServiceCode(v string) *ListPriceListsInput {
	s.ServiceCode = &v
	return s
}

type ListPriceListsOutput struct {
	_ struct{} `type:"structure"`

	// The pagination token that indicates the next set of results to retrieve.
	NextToken *string `type:"string"`

	// The type of price list references that match your request.
	PriceLists []*PriceList `type:"list"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ListPriceListsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s ListPriceListsOutput) GoString() string {
	return s.String()
}

// SetNextToken sets the NextToken field's value.
func (s *ListPriceListsOutput) SetNextToken(v string) *ListPriceListsOutput {
	s.NextToken = &v
	return s
}

// SetPriceLists sets the PriceLists field's value.
func (s *ListPriceListsOutput) SetPriceLists(v []*PriceList) *ListPriceListsOutput {
	s.PriceLists = v
	return s
}

// The requested resource can't be found.
type NotFoundException struct {
	_            struct{}                  `type:"structure"`
	RespMetadata protocol.ResponseMetadata `json:"-" xml:"-"`

	Message_ *string `locationName:"Message" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s NotFoundException) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s NotFoundException) GoString() string {
	return s.String()
}

func newErrorNotFoundException(v protocol.ResponseMetadata) error {
	return &NotFoundException{
		RespMetadata: v,
	}
}

// Code returns the exception type name.
func (s *NotFoundException) Code() string {
	return "NotFoundException"
}

// Message returns the exception's message.
func (s *NotFoundException) Message() string {
	if s.Message_ != nil {
		return *s.Message_
	}
	return ""
}

// OrigErr always returns nil, satisfies awserr.Error interface.
func (s *NotFoundException) OrigErr() error {
	return nil
}

func (s *NotFoundException) Error() string {
	return fmt.Sprintf("%s: %s", s.Code(), s.Message())
}

// Status code returns the HTTP status code for the request's response error.
func (s *NotFoundException) StatusCode() int {
	return s.RespMetadata.StatusCode
}

// RequestID returns the service's response RequestID for request.
func (s *NotFoundException) RequestID() string {
	return s.RespMetadata.RequestID
}

//	This feature is in preview release and is subject to change. Your use of
//	Amazon Web Services Price List API is subject to the Beta Service Participation
//	terms of the Amazon Web Services Service Terms (https://aws.amazon.com/service-terms/)
//	(Section 1.10).
//
// This is the type of price list references that match your request.
type PriceList struct {
	_ struct{} `type:"structure"`

	// The three alphabetical character ISO-4217 currency code the Price List files
	// are denominated in.
	CurrencyCode *string `type:"string"`

	// The format you want to retrieve your Price List files. The FileFormat can
	// be obtained from the ListPriceList (https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_pricing_ListPriceLists.html)
	// response.
	FileFormats []*string `type:"list"`

	// The unique identifier that maps to where your Price List files are located.
	// PriceListArn can be obtained from the ListPriceList (https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_pricing_ListPriceLists.html)
	// response.
	PriceListArn *string `min:"18" type:"string"`

	// This is used to filter the Price List by Amazon Web Services Region. For
	// example, to get the price list only for the US East (N. Virginia) Region,
	// use us-east-1. If nothing is specified, you retrieve price lists for all
	// applicable Regions. The available RegionCode list can be retrieved from GetAttributeValues
	// (https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_pricing_GetAttributeValues.html)
	// API.
	RegionCode *string `min:"1" type:"string"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s PriceList) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s PriceList) GoString() string {
	return s.String()
}

// SetCurrencyCode sets the CurrencyCode field's value.
func (s *PriceList) SetCurrencyCode(v string) *PriceList {
	s.CurrencyCode = &v
	return s
}

// SetFileFormats sets the FileFormats field's value.
func (s *PriceList) SetFileFormats(v []*string) *PriceList {
	s.FileFormats = v
	return s
}

// SetPriceListArn sets the PriceListArn field's value.
func (s *PriceList) SetPriceListArn(v string) *PriceList {
	s.PriceListArn = &v
	return s
}

// SetRegionCode sets the RegionCode field's value.
func (s *PriceList) SetRegionCode(v string) *PriceList {
	s.RegionCode = &v
	return s
}

// The metadata for a service, such as the service code and available attribute
// names.
type Service struct {
	_ struct{} `type:"structure"`

	// The attributes that are available for this service.
	AttributeNames []*string `type:"list"`

	// The code for the Amazon Web Services service.
	//
	// ServiceCode is a required field
	ServiceCode *string `type:"string" required:"true"`
}

// String returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s Service) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation.
//
// API parameter values that are decorated as "sensitive" in the API will not
// be included in the string output. The member name will be present, but the
// value will be replaced with "sensitive".
func (s Service) GoString() string {
	return s.String()
}

// SetAttributeNames sets the AttributeNames field's value.
func (s *Service) SetAttributeNames(v []*string) *Service {
	s.AttributeNames = v
	return s
}

// SetServiceCode sets the ServiceCode field's value.
func (s *Service) SetServiceCode(v string) *Service {
	s.ServiceCode = &v
	return s
}

const (
	// FilterTypeTermMatch is a FilterType enum value
	FilterTypeTermMatch = "TERM_MATCH"
)

// FilterType_Values returns all elements of the FilterType enum
func FilterType_Values() []string {
	return []string{
		FilterTypeTermMatch,
	}
}
