// THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT.

// Package budgets provides a client for AWS Budgets.
package budgets

import (
	"fmt"
	"time"

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

const opCreateBudget = "CreateBudget"

// CreateBudgetRequest generates a "aws/request.Request" representing the
// client's request for the CreateBudget operation. The "output" return
// value can be used to capture response data after the request's "Send" method
// is called.
//
// See CreateBudget for usage and error information.
//
// Creating a request object using this method should be used when you want to inject
// custom logic into the request's lifecycle using a custom handler, or if you want to
// access properties on the request object before or after sending the request. If
// you just want the service response, call the CreateBudget method directly
// instead.
//
// Note: You must call the "Send" method on the returned request object in order
// to execute the request.
//
//    // Example sending a request using the CreateBudgetRequest method.
//    req, resp := client.CreateBudgetRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
func (c *Budgets) CreateBudgetRequest(input *CreateBudgetInput) (req *request.Request, output *CreateBudgetOutput) {
	op := &request.Operation{
		Name:       opCreateBudget,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateBudgetInput{}
	}

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

// CreateBudget API operation for AWS Budgets.
//
// Create a new budget
//
// 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 Budgets's
// API operation CreateBudget for usage and error information.
//
// Returned Error Codes:
//   * InvalidParameterException
//   This exception is thrown if any request is given an invalid parameter. E.g.,
//   if a required Date field is null.
//
//   * InternalErrorException
//   This exception is thrown on an unknown internal failure.
//
//   * CreationLimitExceededException
//   The exception is thrown when customer tries to create a record (e.g. budget),
//   but the number this record already exceeds the limitation.
//
//   * DuplicateRecordException
//   The exception is thrown when customer tries to create a record (e.g. budget)
//   that already exists.
//
func (c *Budgets) CreateBudget(input *CreateBudgetInput) (*CreateBudgetOutput, error) {
	req, out := c.CreateBudgetRequest(input)
	err := req.Send()
	return out, err
}

const opCreateNotification = "CreateNotification"

// CreateNotificationRequest generates a "aws/request.Request" representing the
// client's request for the CreateNotification operation. The "output" return
// value can be used to capture response data after the request's "Send" method
// is called.
//
// See CreateNotification for usage and error information.
//
// Creating a request object using this method should be used when you want to inject
// custom logic into the request's lifecycle using a custom handler, or if you want to
// access properties on the request object before or after sending the request. If
// you just want the service response, call the CreateNotification method directly
// instead.
//
// Note: You must call the "Send" method on the returned request object in order
// to execute the request.
//
//    // Example sending a request using the CreateNotificationRequest method.
//    req, resp := client.CreateNotificationRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
func (c *Budgets) CreateNotificationRequest(input *CreateNotificationInput) (req *request.Request, output *CreateNotificationOutput) {
	op := &request.Operation{
		Name:       opCreateNotification,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateNotificationInput{}
	}

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

// CreateNotification API operation for AWS Budgets.
//
// Create a new Notification with subscribers for a budget
//
// 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 Budgets's
// API operation CreateNotification for usage and error information.
//
// Returned Error Codes:
//   * InternalErrorException
//   This exception is thrown on an unknown internal failure.
//
//   * InvalidParameterException
//   This exception is thrown if any request is given an invalid parameter. E.g.,
//   if a required Date field is null.
//
//   * NotFoundException
//   This exception is thrown if a requested entity is not found. E.g., if a budget
//   id doesn't exist for an account ID.
//
//   * CreationLimitExceededException
//   The exception is thrown when customer tries to create a record (e.g. budget),
//   but the number this record already exceeds the limitation.
//
//   * DuplicateRecordException
//   The exception is thrown when customer tries to create a record (e.g. budget)
//   that already exists.
//
func (c *Budgets) CreateNotification(input *CreateNotificationInput) (*CreateNotificationOutput, error) {
	req, out := c.CreateNotificationRequest(input)
	err := req.Send()
	return out, err
}

const opCreateSubscriber = "CreateSubscriber"

// CreateSubscriberRequest generates a "aws/request.Request" representing the
// client's request for the CreateSubscriber operation. The "output" return
// value can be used to capture response data after the request's "Send" method
// is called.
//
// See CreateSubscriber for usage and error information.
//
// Creating a request object using this method should be used when you want to inject
// custom logic into the request's lifecycle using a custom handler, or if you want to
// access properties on the request object before or after sending the request. If
// you just want the service response, call the CreateSubscriber method directly
// instead.
//
// Note: You must call the "Send" method on the returned request object in order
// to execute the request.
//
//    // Example sending a request using the CreateSubscriberRequest method.
//    req, resp := client.CreateSubscriberRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
func (c *Budgets) CreateSubscriberRequest(input *CreateSubscriberInput) (req *request.Request, output *CreateSubscriberOutput) {
	op := &request.Operation{
		Name:       opCreateSubscriber,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &CreateSubscriberInput{}
	}

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

// CreateSubscriber API operation for AWS Budgets.
//
// Create a new Subscriber for a notification
//
// 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 Budgets's
// API operation CreateSubscriber for usage and error information.
//
// Returned Error Codes:
//   * InternalErrorException
//   This exception is thrown on an unknown internal failure.
//
//   * InvalidParameterException
//   This exception is thrown if any request is given an invalid parameter. E.g.,
//   if a required Date field is null.
//
//   * CreationLimitExceededException
//   The exception is thrown when customer tries to create a record (e.g. budget),
//   but the number this record already exceeds the limitation.
//
//   * DuplicateRecordException
//   The exception is thrown when customer tries to create a record (e.g. budget)
//   that already exists.
//
func (c *Budgets) CreateSubscriber(input *CreateSubscriberInput) (*CreateSubscriberOutput, error) {
	req, out := c.CreateSubscriberRequest(input)
	err := req.Send()
	return out, err
}

const opDeleteBudget = "DeleteBudget"

// DeleteBudgetRequest generates a "aws/request.Request" representing the
// client's request for the DeleteBudget operation. The "output" return
// value can be used to capture response data after the request's "Send" method
// is called.
//
// See DeleteBudget for usage and error information.
//
// Creating a request object using this method should be used when you want to inject
// custom logic into the request's lifecycle using a custom handler, or if you want to
// access properties on the request object before or after sending the request. If
// you just want the service response, call the DeleteBudget method directly
// instead.
//
// Note: You must call the "Send" method on the returned request object in order
// to execute the request.
//
//    // Example sending a request using the DeleteBudgetRequest method.
//    req, resp := client.DeleteBudgetRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
func (c *Budgets) DeleteBudgetRequest(input *DeleteBudgetInput) (req *request.Request, output *DeleteBudgetOutput) {
	op := &request.Operation{
		Name:       opDeleteBudget,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteBudgetInput{}
	}

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

// DeleteBudget API operation for AWS Budgets.
//
// Delete a budget and related notifications
//
// 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 Budgets's
// API operation DeleteBudget for usage and error information.
//
// Returned Error Codes:
//   * InternalErrorException
//   This exception is thrown on an unknown internal failure.
//
//   * InvalidParameterException
//   This exception is thrown if any request is given an invalid parameter. E.g.,
//   if a required Date field is null.
//
//   * NotFoundException
//   This exception is thrown if a requested entity is not found. E.g., if a budget
//   id doesn't exist for an account ID.
//
func (c *Budgets) DeleteBudget(input *DeleteBudgetInput) (*DeleteBudgetOutput, error) {
	req, out := c.DeleteBudgetRequest(input)
	err := req.Send()
	return out, err
}

const opDeleteNotification = "DeleteNotification"

// DeleteNotificationRequest generates a "aws/request.Request" representing the
// client's request for the DeleteNotification operation. The "output" return
// value can be used to capture response data after the request's "Send" method
// is called.
//
// See DeleteNotification for usage and error information.
//
// Creating a request object using this method should be used when you want to inject
// custom logic into the request's lifecycle using a custom handler, or if you want to
// access properties on the request object before or after sending the request. If
// you just want the service response, call the DeleteNotification method directly
// instead.
//
// Note: You must call the "Send" method on the returned request object in order
// to execute the request.
//
//    // Example sending a request using the DeleteNotificationRequest method.
//    req, resp := client.DeleteNotificationRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
func (c *Budgets) DeleteNotificationRequest(input *DeleteNotificationInput) (req *request.Request, output *DeleteNotificationOutput) {
	op := &request.Operation{
		Name:       opDeleteNotification,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteNotificationInput{}
	}

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

// DeleteNotification API operation for AWS Budgets.
//
// Delete a notification and related subscribers
//
// 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 Budgets's
// API operation DeleteNotification for usage and error information.
//
// Returned Error Codes:
//   * InvalidParameterException
//   This exception is thrown if any request is given an invalid parameter. E.g.,
//   if a required Date field is null.
//
//   * InternalErrorException
//   This exception is thrown on an unknown internal failure.
//
//   * NotFoundException
//   This exception is thrown if a requested entity is not found. E.g., if a budget
//   id doesn't exist for an account ID.
//
func (c *Budgets) DeleteNotification(input *DeleteNotificationInput) (*DeleteNotificationOutput, error) {
	req, out := c.DeleteNotificationRequest(input)
	err := req.Send()
	return out, err
}

const opDeleteSubscriber = "DeleteSubscriber"

// DeleteSubscriberRequest generates a "aws/request.Request" representing the
// client's request for the DeleteSubscriber operation. The "output" return
// value can be used to capture response data after the request's "Send" method
// is called.
//
// See DeleteSubscriber for usage and error information.
//
// Creating a request object using this method should be used when you want to inject
// custom logic into the request's lifecycle using a custom handler, or if you want to
// access properties on the request object before or after sending the request. If
// you just want the service response, call the DeleteSubscriber method directly
// instead.
//
// Note: You must call the "Send" method on the returned request object in order
// to execute the request.
//
//    // Example sending a request using the DeleteSubscriberRequest method.
//    req, resp := client.DeleteSubscriberRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
func (c *Budgets) DeleteSubscriberRequest(input *DeleteSubscriberInput) (req *request.Request, output *DeleteSubscriberOutput) {
	op := &request.Operation{
		Name:       opDeleteSubscriber,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteSubscriberInput{}
	}

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

// DeleteSubscriber API operation for AWS Budgets.
//
// Delete a Subscriber for a notification
//
// 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 Budgets's
// API operation DeleteSubscriber for usage and error information.
//
// Returned Error Codes:
//   * InternalErrorException
//   This exception is thrown on an unknown internal failure.
//
//   * InvalidParameterException
//   This exception is thrown if any request is given an invalid parameter. E.g.,
//   if a required Date field is null.
//
//   * NotFoundException
//   This exception is thrown if a requested entity is not found. E.g., if a budget
//   id doesn't exist for an account ID.
//
func (c *Budgets) DeleteSubscriber(input *DeleteSubscriberInput) (*DeleteSubscriberOutput, error) {
	req, out := c.DeleteSubscriberRequest(input)
	err := req.Send()
	return out, err
}

const opDescribeBudget = "DescribeBudget"

// DescribeBudgetRequest generates a "aws/request.Request" representing the
// client's request for the DescribeBudget operation. The "output" return
// value can be used to capture response data after the request's "Send" method
// is called.
//
// See DescribeBudget for usage and error information.
//
// Creating a request object using this method should be used when you want to inject
// custom logic into the request's lifecycle using a custom handler, or if you want to
// access properties on the request object before or after sending the request. If
// you just want the service response, call the DescribeBudget method directly
// instead.
//
// Note: You must call the "Send" method on the returned request object in order
// to execute the request.
//
//    // Example sending a request using the DescribeBudgetRequest method.
//    req, resp := client.DescribeBudgetRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
func (c *Budgets) DescribeBudgetRequest(input *DescribeBudgetInput) (req *request.Request, output *DescribeBudgetOutput) {
	op := &request.Operation{
		Name:       opDescribeBudget,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeBudgetInput{}
	}

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

// DescribeBudget API operation for AWS Budgets.
//
// Get a single budget
//
// 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 Budgets's
// API operation DescribeBudget for usage and error information.
//
// Returned Error Codes:
//   * InternalErrorException
//   This exception is thrown on an unknown internal failure.
//
//   * InvalidParameterException
//   This exception is thrown if any request is given an invalid parameter. E.g.,
//   if a required Date field is null.
//
//   * NotFoundException
//   This exception is thrown if a requested entity is not found. E.g., if a budget
//   id doesn't exist for an account ID.
//
func (c *Budgets) DescribeBudget(input *DescribeBudgetInput) (*DescribeBudgetOutput, error) {
	req, out := c.DescribeBudgetRequest(input)
	err := req.Send()
	return out, err
}

const opDescribeBudgets = "DescribeBudgets"

// DescribeBudgetsRequest generates a "aws/request.Request" representing the
// client's request for the DescribeBudgets operation. The "output" return
// value can be used to capture response data after the request's "Send" method
// is called.
//
// See DescribeBudgets for usage and error information.
//
// Creating a request object using this method should be used when you want to inject
// custom logic into the request's lifecycle using a custom handler, or if you want to
// access properties on the request object before or after sending the request. If
// you just want the service response, call the DescribeBudgets method directly
// instead.
//
// Note: You must call the "Send" method on the returned request object in order
// to execute the request.
//
//    // Example sending a request using the DescribeBudgetsRequest method.
//    req, resp := client.DescribeBudgetsRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
func (c *Budgets) DescribeBudgetsRequest(input *DescribeBudgetsInput) (req *request.Request, output *DescribeBudgetsOutput) {
	op := &request.Operation{
		Name:       opDescribeBudgets,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeBudgetsInput{}
	}

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

// DescribeBudgets API operation for AWS Budgets.
//
// Get all budgets for an account
//
// 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 Budgets's
// API operation DescribeBudgets for usage and error information.
//
// Returned Error Codes:
//   * InternalErrorException
//   This exception is thrown on an unknown internal failure.
//
//   * InvalidParameterException
//   This exception is thrown if any request is given an invalid parameter. E.g.,
//   if a required Date field is null.
//
//   * NotFoundException
//   This exception is thrown if a requested entity is not found. E.g., if a budget
//   id doesn't exist for an account ID.
//
//   * InvalidNextTokenException
//   This exception is thrown if paging token signature didn't match the token,
//   or the paging token isn't for this request
//
//   * ExpiredNextTokenException
//   This exception is thrown if the paging token is expired - past its TTL
//
func (c *Budgets) DescribeBudgets(input *DescribeBudgetsInput) (*DescribeBudgetsOutput, error) {
	req, out := c.DescribeBudgetsRequest(input)
	err := req.Send()
	return out, err
}

const opDescribeNotificationsForBudget = "DescribeNotificationsForBudget"

// DescribeNotificationsForBudgetRequest generates a "aws/request.Request" representing the
// client's request for the DescribeNotificationsForBudget operation. The "output" return
// value can be used to capture response data after the request's "Send" method
// is called.
//
// See DescribeNotificationsForBudget for usage and error information.
//
// Creating a request object using this method should be used when you want to inject
// custom logic into the request's lifecycle using a custom handler, or if you want to
// access properties on the request object before or after sending the request. If
// you just want the service response, call the DescribeNotificationsForBudget method directly
// instead.
//
// Note: You must call the "Send" method on the returned request object in order
// to execute the request.
//
//    // Example sending a request using the DescribeNotificationsForBudgetRequest method.
//    req, resp := client.DescribeNotificationsForBudgetRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
func (c *Budgets) DescribeNotificationsForBudgetRequest(input *DescribeNotificationsForBudgetInput) (req *request.Request, output *DescribeNotificationsForBudgetOutput) {
	op := &request.Operation{
		Name:       opDescribeNotificationsForBudget,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeNotificationsForBudgetInput{}
	}

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

// DescribeNotificationsForBudget API operation for AWS Budgets.
//
// Get notifications of a budget
//
// 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 Budgets's
// API operation DescribeNotificationsForBudget for usage and error information.
//
// Returned Error Codes:
//   * InternalErrorException
//   This exception is thrown on an unknown internal failure.
//
//   * InvalidParameterException
//   This exception is thrown if any request is given an invalid parameter. E.g.,
//   if a required Date field is null.
//
//   * NotFoundException
//   This exception is thrown if a requested entity is not found. E.g., if a budget
//   id doesn't exist for an account ID.
//
//   * InvalidNextTokenException
//   This exception is thrown if paging token signature didn't match the token,
//   or the paging token isn't for this request
//
//   * ExpiredNextTokenException
//   This exception is thrown if the paging token is expired - past its TTL
//
func (c *Budgets) DescribeNotificationsForBudget(input *DescribeNotificationsForBudgetInput) (*DescribeNotificationsForBudgetOutput, error) {
	req, out := c.DescribeNotificationsForBudgetRequest(input)
	err := req.Send()
	return out, err
}

const opDescribeSubscribersForNotification = "DescribeSubscribersForNotification"

// DescribeSubscribersForNotificationRequest generates a "aws/request.Request" representing the
// client's request for the DescribeSubscribersForNotification operation. The "output" return
// value can be used to capture response data after the request's "Send" method
// is called.
//
// See DescribeSubscribersForNotification for usage and error information.
//
// Creating a request object using this method should be used when you want to inject
// custom logic into the request's lifecycle using a custom handler, or if you want to
// access properties on the request object before or after sending the request. If
// you just want the service response, call the DescribeSubscribersForNotification method directly
// instead.
//
// Note: You must call the "Send" method on the returned request object in order
// to execute the request.
//
//    // Example sending a request using the DescribeSubscribersForNotificationRequest method.
//    req, resp := client.DescribeSubscribersForNotificationRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
func (c *Budgets) DescribeSubscribersForNotificationRequest(input *DescribeSubscribersForNotificationInput) (req *request.Request, output *DescribeSubscribersForNotificationOutput) {
	op := &request.Operation{
		Name:       opDescribeSubscribersForNotification,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeSubscribersForNotificationInput{}
	}

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

// DescribeSubscribersForNotification API operation for AWS Budgets.
//
// Get subscribers of a notification
//
// 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 Budgets's
// API operation DescribeSubscribersForNotification for usage and error information.
//
// Returned Error Codes:
//   * InternalErrorException
//   This exception is thrown on an unknown internal failure.
//
//   * NotFoundException
//   This exception is thrown if a requested entity is not found. E.g., if a budget
//   id doesn't exist for an account ID.
//
//   * InvalidParameterException
//   This exception is thrown if any request is given an invalid parameter. E.g.,
//   if a required Date field is null.
//
//   * InvalidNextTokenException
//   This exception is thrown if paging token signature didn't match the token,
//   or the paging token isn't for this request
//
//   * ExpiredNextTokenException
//   This exception is thrown if the paging token is expired - past its TTL
//
func (c *Budgets) DescribeSubscribersForNotification(input *DescribeSubscribersForNotificationInput) (*DescribeSubscribersForNotificationOutput, error) {
	req, out := c.DescribeSubscribersForNotificationRequest(input)
	err := req.Send()
	return out, err
}

const opUpdateBudget = "UpdateBudget"

// UpdateBudgetRequest generates a "aws/request.Request" representing the
// client's request for the UpdateBudget operation. The "output" return
// value can be used to capture response data after the request's "Send" method
// is called.
//
// See UpdateBudget for usage and error information.
//
// Creating a request object using this method should be used when you want to inject
// custom logic into the request's lifecycle using a custom handler, or if you want to
// access properties on the request object before or after sending the request. If
// you just want the service response, call the UpdateBudget method directly
// instead.
//
// Note: You must call the "Send" method on the returned request object in order
// to execute the request.
//
//    // Example sending a request using the UpdateBudgetRequest method.
//    req, resp := client.UpdateBudgetRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
func (c *Budgets) UpdateBudgetRequest(input *UpdateBudgetInput) (req *request.Request, output *UpdateBudgetOutput) {
	op := &request.Operation{
		Name:       opUpdateBudget,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &UpdateBudgetInput{}
	}

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

// UpdateBudget API operation for AWS Budgets.
//
// Update the information of a budget already created
//
// 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 Budgets's
// API operation UpdateBudget for usage and error information.
//
// Returned Error Codes:
//   * InternalErrorException
//   This exception is thrown on an unknown internal failure.
//
//   * InvalidParameterException
//   This exception is thrown if any request is given an invalid parameter. E.g.,
//   if a required Date field is null.
//
//   * NotFoundException
//   This exception is thrown if a requested entity is not found. E.g., if a budget
//   id doesn't exist for an account ID.
//
func (c *Budgets) UpdateBudget(input *UpdateBudgetInput) (*UpdateBudgetOutput, error) {
	req, out := c.UpdateBudgetRequest(input)
	err := req.Send()
	return out, err
}

const opUpdateNotification = "UpdateNotification"

// UpdateNotificationRequest generates a "aws/request.Request" representing the
// client's request for the UpdateNotification operation. The "output" return
// value can be used to capture response data after the request's "Send" method
// is called.
//
// See UpdateNotification for usage and error information.
//
// Creating a request object using this method should be used when you want to inject
// custom logic into the request's lifecycle using a custom handler, or if you want to
// access properties on the request object before or after sending the request. If
// you just want the service response, call the UpdateNotification method directly
// instead.
//
// Note: You must call the "Send" method on the returned request object in order
// to execute the request.
//
//    // Example sending a request using the UpdateNotificationRequest method.
//    req, resp := client.UpdateNotificationRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
func (c *Budgets) UpdateNotificationRequest(input *UpdateNotificationInput) (req *request.Request, output *UpdateNotificationOutput) {
	op := &request.Operation{
		Name:       opUpdateNotification,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &UpdateNotificationInput{}
	}

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

// UpdateNotification API operation for AWS Budgets.
//
// Update the information about a notification already created
//
// 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 Budgets's
// API operation UpdateNotification for usage and error information.
//
// Returned Error Codes:
//   * InternalErrorException
//   This exception is thrown on an unknown internal failure.
//
//   * InvalidParameterException
//   This exception is thrown if any request is given an invalid parameter. E.g.,
//   if a required Date field is null.
//
//   * NotFoundException
//   This exception is thrown if a requested entity is not found. E.g., if a budget
//   id doesn't exist for an account ID.
//
func (c *Budgets) UpdateNotification(input *UpdateNotificationInput) (*UpdateNotificationOutput, error) {
	req, out := c.UpdateNotificationRequest(input)
	err := req.Send()
	return out, err
}

const opUpdateSubscriber = "UpdateSubscriber"

// UpdateSubscriberRequest generates a "aws/request.Request" representing the
// client's request for the UpdateSubscriber operation. The "output" return
// value can be used to capture response data after the request's "Send" method
// is called.
//
// See UpdateSubscriber for usage and error information.
//
// Creating a request object using this method should be used when you want to inject
// custom logic into the request's lifecycle using a custom handler, or if you want to
// access properties on the request object before or after sending the request. If
// you just want the service response, call the UpdateSubscriber method directly
// instead.
//
// Note: You must call the "Send" method on the returned request object in order
// to execute the request.
//
//    // Example sending a request using the UpdateSubscriberRequest method.
//    req, resp := client.UpdateSubscriberRequest(params)
//
//    err := req.Send()
//    if err == nil { // resp is now filled
//        fmt.Println(resp)
//    }
//
func (c *Budgets) UpdateSubscriberRequest(input *UpdateSubscriberInput) (req *request.Request, output *UpdateSubscriberOutput) {
	op := &request.Operation{
		Name:       opUpdateSubscriber,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &UpdateSubscriberInput{}
	}

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

// UpdateSubscriber API operation for AWS Budgets.
//
// Update a subscriber
//
// 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 Budgets's
// API operation UpdateSubscriber for usage and error information.
//
// Returned Error Codes:
//   * InternalErrorException
//   This exception is thrown on an unknown internal failure.
//
//   * InvalidParameterException
//   This exception is thrown if any request is given an invalid parameter. E.g.,
//   if a required Date field is null.
//
//   * NotFoundException
//   This exception is thrown if a requested entity is not found. E.g., if a budget
//   id doesn't exist for an account ID.
//
func (c *Budgets) UpdateSubscriber(input *UpdateSubscriberInput) (*UpdateSubscriberOutput, error) {
	req, out := c.UpdateSubscriberRequest(input)
	err := req.Send()
	return out, err
}

// AWS Budget model
type Budget struct {
	_ struct{} `type:"structure"`

	// A structure represent either a cost spend or usage spend. Contains an amount
	// and a unit.
	//
	// BudgetLimit is a required field
	BudgetLimit *Spend `type:"structure" required:"true"`

	// A string represents the budget name. No ":" character is allowed.
	//
	// BudgetName is a required field
	BudgetName *string `type:"string" required:"true"`

	// The type of a budget. Can be COST or USAGE.
	//
	// BudgetType is a required field
	BudgetType *string `type:"string" required:"true" enum:"BudgetType"`

	// A structure holds the actual and forecasted spend for a budget.
	CalculatedSpend *CalculatedSpend `type:"structure"`

	// A map represents the cost filters applied to the budget.
	CostFilters map[string][]*string `type:"map"`

	// This includes the options for getting the cost of a budget.
	//
	// CostTypes is a required field
	CostTypes *CostTypes `type:"structure" required:"true"`

	// A time period indicated the start date and end date of a budget.
	//
	// TimePeriod is a required field
	TimePeriod *TimePeriod `type:"structure" required:"true"`

	// The time unit of the budget. e.g. weekly, monthly, etc.
	//
	// TimeUnit is a required field
	TimeUnit *string `type:"string" required:"true" enum:"TimeUnit"`
}

// String returns the string representation
func (s Budget) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s Budget) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *Budget) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "Budget"}
	if s.BudgetLimit == nil {
		invalidParams.Add(request.NewErrParamRequired("BudgetLimit"))
	}
	if s.BudgetName == nil {
		invalidParams.Add(request.NewErrParamRequired("BudgetName"))
	}
	if s.BudgetType == nil {
		invalidParams.Add(request.NewErrParamRequired("BudgetType"))
	}
	if s.CostTypes == nil {
		invalidParams.Add(request.NewErrParamRequired("CostTypes"))
	}
	if s.TimePeriod == nil {
		invalidParams.Add(request.NewErrParamRequired("TimePeriod"))
	}
	if s.TimeUnit == nil {
		invalidParams.Add(request.NewErrParamRequired("TimeUnit"))
	}
	if s.BudgetLimit != nil {
		if err := s.BudgetLimit.Validate(); err != nil {
			invalidParams.AddNested("BudgetLimit", err.(request.ErrInvalidParams))
		}
	}
	if s.CalculatedSpend != nil {
		if err := s.CalculatedSpend.Validate(); err != nil {
			invalidParams.AddNested("CalculatedSpend", err.(request.ErrInvalidParams))
		}
	}
	if s.CostTypes != nil {
		if err := s.CostTypes.Validate(); err != nil {
			invalidParams.AddNested("CostTypes", err.(request.ErrInvalidParams))
		}
	}
	if s.TimePeriod != nil {
		if err := s.TimePeriod.Validate(); err != nil {
			invalidParams.AddNested("TimePeriod", err.(request.ErrInvalidParams))
		}
	}

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

// A structure holds the actual and forecasted spend for a budget.
type CalculatedSpend struct {
	_ struct{} `type:"structure"`

	// A structure represent either a cost spend or usage spend. Contains an amount
	// and a unit.
	//
	// ActualSpend is a required field
	ActualSpend *Spend `type:"structure" required:"true"`

	// A structure represent either a cost spend or usage spend. Contains an amount
	// and a unit.
	ForecastedSpend *Spend `type:"structure"`
}

// String returns the string representation
func (s CalculatedSpend) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CalculatedSpend) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CalculatedSpend) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CalculatedSpend"}
	if s.ActualSpend == nil {
		invalidParams.Add(request.NewErrParamRequired("ActualSpend"))
	}
	if s.ActualSpend != nil {
		if err := s.ActualSpend.Validate(); err != nil {
			invalidParams.AddNested("ActualSpend", err.(request.ErrInvalidParams))
		}
	}
	if s.ForecastedSpend != nil {
		if err := s.ForecastedSpend.Validate(); err != nil {
			invalidParams.AddNested("ForecastedSpend", err.(request.ErrInvalidParams))
		}
	}

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

// This includes the options for getting the cost of a budget.
type CostTypes struct {
	_ struct{} `type:"structure"`

	// A generic boolean value.
	//
	// IncludeSubscription is a required field
	IncludeSubscription *bool `type:"boolean" required:"true"`

	// A generic boolean value.
	//
	// IncludeTax is a required field
	IncludeTax *bool `type:"boolean" required:"true"`

	// A generic boolean value.
	//
	// UseBlended is a required field
	UseBlended *bool `type:"boolean" required:"true"`
}

// String returns the string representation
func (s CostTypes) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CostTypes) GoString() string {
	return s.String()
}

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

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

// Request of CreateBudget
type CreateBudgetInput struct {
	_ struct{} `type:"structure"`

	// Account Id of the customer. It should be a 12 digit number.
	//
	// AccountId is a required field
	AccountId *string `min:"12" type:"string" required:"true"`

	// AWS Budget model
	//
	// Budget is a required field
	Budget *Budget `type:"structure" required:"true"`

	// A list of Notifications, each with a list of subscribers.
	NotificationsWithSubscribers []*NotificationWithSubscribers `type:"list"`
}

// String returns the string representation
func (s CreateBudgetInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateBudgetInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateBudgetInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateBudgetInput"}
	if s.AccountId == nil {
		invalidParams.Add(request.NewErrParamRequired("AccountId"))
	}
	if s.AccountId != nil && len(*s.AccountId) < 12 {
		invalidParams.Add(request.NewErrParamMinLen("AccountId", 12))
	}
	if s.Budget == nil {
		invalidParams.Add(request.NewErrParamRequired("Budget"))
	}
	if s.Budget != nil {
		if err := s.Budget.Validate(); err != nil {
			invalidParams.AddNested("Budget", err.(request.ErrInvalidParams))
		}
	}
	if s.NotificationsWithSubscribers != nil {
		for i, v := range s.NotificationsWithSubscribers {
			if v == nil {
				continue
			}
			if err := v.Validate(); err != nil {
				invalidParams.AddNested(fmt.Sprintf("%s[%v]", "NotificationsWithSubscribers", i), err.(request.ErrInvalidParams))
			}
		}
	}

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

// Response of CreateBudget
type CreateBudgetOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s CreateBudgetOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateBudgetOutput) GoString() string {
	return s.String()
}

// Request of CreateNotification
type CreateNotificationInput struct {
	_ struct{} `type:"structure"`

	// Account Id of the customer. It should be a 12 digit number.
	//
	// AccountId is a required field
	AccountId *string `min:"12" type:"string" required:"true"`

	// A string represents the budget name. No ":" character is allowed.
	//
	// BudgetName is a required field
	BudgetName *string `type:"string" required:"true"`

	// Notification model. Each budget may contain multiple notifications with different
	// settings.
	//
	// Notification is a required field
	Notification *Notification `type:"structure" required:"true"`

	// A list of subscribers.
	//
	// Subscribers is a required field
	Subscribers []*Subscriber `min:"1" type:"list" required:"true"`
}

// String returns the string representation
func (s CreateNotificationInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateNotificationInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateNotificationInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateNotificationInput"}
	if s.AccountId == nil {
		invalidParams.Add(request.NewErrParamRequired("AccountId"))
	}
	if s.AccountId != nil && len(*s.AccountId) < 12 {
		invalidParams.Add(request.NewErrParamMinLen("AccountId", 12))
	}
	if s.BudgetName == nil {
		invalidParams.Add(request.NewErrParamRequired("BudgetName"))
	}
	if s.Notification == nil {
		invalidParams.Add(request.NewErrParamRequired("Notification"))
	}
	if s.Subscribers == nil {
		invalidParams.Add(request.NewErrParamRequired("Subscribers"))
	}
	if s.Subscribers != nil && len(s.Subscribers) < 1 {
		invalidParams.Add(request.NewErrParamMinLen("Subscribers", 1))
	}
	if s.Notification != nil {
		if err := s.Notification.Validate(); err != nil {
			invalidParams.AddNested("Notification", err.(request.ErrInvalidParams))
		}
	}
	if s.Subscribers != nil {
		for i, v := range s.Subscribers {
			if v == nil {
				continue
			}
			if err := v.Validate(); err != nil {
				invalidParams.AddNested(fmt.Sprintf("%s[%v]", "Subscribers", i), err.(request.ErrInvalidParams))
			}
		}
	}

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

// Response of CreateNotification
type CreateNotificationOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s CreateNotificationOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateNotificationOutput) GoString() string {
	return s.String()
}

// Request of CreateSubscriber
type CreateSubscriberInput struct {
	_ struct{} `type:"structure"`

	// Account Id of the customer. It should be a 12 digit number.
	//
	// AccountId is a required field
	AccountId *string `min:"12" type:"string" required:"true"`

	// A string represents the budget name. No ":" character is allowed.
	//
	// BudgetName is a required field
	BudgetName *string `type:"string" required:"true"`

	// Notification model. Each budget may contain multiple notifications with different
	// settings.
	//
	// Notification is a required field
	Notification *Notification `type:"structure" required:"true"`

	// Subscriber model. Each notification may contain multiple subscribers with
	// different addresses.
	//
	// Subscriber is a required field
	Subscriber *Subscriber `type:"structure" required:"true"`
}

// String returns the string representation
func (s CreateSubscriberInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateSubscriberInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *CreateSubscriberInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "CreateSubscriberInput"}
	if s.AccountId == nil {
		invalidParams.Add(request.NewErrParamRequired("AccountId"))
	}
	if s.AccountId != nil && len(*s.AccountId) < 12 {
		invalidParams.Add(request.NewErrParamMinLen("AccountId", 12))
	}
	if s.BudgetName == nil {
		invalidParams.Add(request.NewErrParamRequired("BudgetName"))
	}
	if s.Notification == nil {
		invalidParams.Add(request.NewErrParamRequired("Notification"))
	}
	if s.Subscriber == nil {
		invalidParams.Add(request.NewErrParamRequired("Subscriber"))
	}
	if s.Notification != nil {
		if err := s.Notification.Validate(); err != nil {
			invalidParams.AddNested("Notification", err.(request.ErrInvalidParams))
		}
	}
	if s.Subscriber != nil {
		if err := s.Subscriber.Validate(); err != nil {
			invalidParams.AddNested("Subscriber", err.(request.ErrInvalidParams))
		}
	}

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

// Response of CreateSubscriber
type CreateSubscriberOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s CreateSubscriberOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s CreateSubscriberOutput) GoString() string {
	return s.String()
}

// Request of DeleteBudget
type DeleteBudgetInput struct {
	_ struct{} `type:"structure"`

	// Account Id of the customer. It should be a 12 digit number.
	//
	// AccountId is a required field
	AccountId *string `min:"12" type:"string" required:"true"`

	// A string represents the budget name. No ":" character is allowed.
	//
	// BudgetName is a required field
	BudgetName *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DeleteBudgetInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteBudgetInput) GoString() string {
	return s.String()
}

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

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

// Response of DeleteBudget
type DeleteBudgetOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DeleteBudgetOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteBudgetOutput) GoString() string {
	return s.String()
}

// Request of DeleteNotification
type DeleteNotificationInput struct {
	_ struct{} `type:"structure"`

	// Account Id of the customer. It should be a 12 digit number.
	//
	// AccountId is a required field
	AccountId *string `min:"12" type:"string" required:"true"`

	// A string represents the budget name. No ":" character is allowed.
	//
	// BudgetName is a required field
	BudgetName *string `type:"string" required:"true"`

	// Notification model. Each budget may contain multiple notifications with different
	// settings.
	//
	// Notification is a required field
	Notification *Notification `type:"structure" required:"true"`
}

// String returns the string representation
func (s DeleteNotificationInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteNotificationInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteNotificationInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteNotificationInput"}
	if s.AccountId == nil {
		invalidParams.Add(request.NewErrParamRequired("AccountId"))
	}
	if s.AccountId != nil && len(*s.AccountId) < 12 {
		invalidParams.Add(request.NewErrParamMinLen("AccountId", 12))
	}
	if s.BudgetName == nil {
		invalidParams.Add(request.NewErrParamRequired("BudgetName"))
	}
	if s.Notification == nil {
		invalidParams.Add(request.NewErrParamRequired("Notification"))
	}
	if s.Notification != nil {
		if err := s.Notification.Validate(); err != nil {
			invalidParams.AddNested("Notification", err.(request.ErrInvalidParams))
		}
	}

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

// Response of DeleteNotification
type DeleteNotificationOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DeleteNotificationOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteNotificationOutput) GoString() string {
	return s.String()
}

// Request of DeleteSubscriber
type DeleteSubscriberInput struct {
	_ struct{} `type:"structure"`

	// Account Id of the customer. It should be a 12 digit number.
	//
	// AccountId is a required field
	AccountId *string `min:"12" type:"string" required:"true"`

	// A string represents the budget name. No ":" character is allowed.
	//
	// BudgetName is a required field
	BudgetName *string `type:"string" required:"true"`

	// Notification model. Each budget may contain multiple notifications with different
	// settings.
	//
	// Notification is a required field
	Notification *Notification `type:"structure" required:"true"`

	// Subscriber model. Each notification may contain multiple subscribers with
	// different addresses.
	//
	// Subscriber is a required field
	Subscriber *Subscriber `type:"structure" required:"true"`
}

// String returns the string representation
func (s DeleteSubscriberInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteSubscriberInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DeleteSubscriberInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DeleteSubscriberInput"}
	if s.AccountId == nil {
		invalidParams.Add(request.NewErrParamRequired("AccountId"))
	}
	if s.AccountId != nil && len(*s.AccountId) < 12 {
		invalidParams.Add(request.NewErrParamMinLen("AccountId", 12))
	}
	if s.BudgetName == nil {
		invalidParams.Add(request.NewErrParamRequired("BudgetName"))
	}
	if s.Notification == nil {
		invalidParams.Add(request.NewErrParamRequired("Notification"))
	}
	if s.Subscriber == nil {
		invalidParams.Add(request.NewErrParamRequired("Subscriber"))
	}
	if s.Notification != nil {
		if err := s.Notification.Validate(); err != nil {
			invalidParams.AddNested("Notification", err.(request.ErrInvalidParams))
		}
	}
	if s.Subscriber != nil {
		if err := s.Subscriber.Validate(); err != nil {
			invalidParams.AddNested("Subscriber", err.(request.ErrInvalidParams))
		}
	}

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

// Response of DeleteSubscriber
type DeleteSubscriberOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DeleteSubscriberOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteSubscriberOutput) GoString() string {
	return s.String()
}

// Request of DescribeBudget
type DescribeBudgetInput struct {
	_ struct{} `type:"structure"`

	// Account Id of the customer. It should be a 12 digit number.
	//
	// AccountId is a required field
	AccountId *string `min:"12" type:"string" required:"true"`

	// A string represents the budget name. No ":" character is allowed.
	//
	// BudgetName is a required field
	BudgetName *string `type:"string" required:"true"`
}

// String returns the string representation
func (s DescribeBudgetInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeBudgetInput) GoString() string {
	return s.String()
}

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

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

// Response of DescribeBudget
type DescribeBudgetOutput struct {
	_ struct{} `type:"structure"`

	// AWS Budget model
	Budget *Budget `type:"structure"`
}

// String returns the string representation
func (s DescribeBudgetOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeBudgetOutput) GoString() string {
	return s.String()
}

// Request of DescribeBudgets
type DescribeBudgetsInput struct {
	_ struct{} `type:"structure"`

	// Account Id of the customer. It should be a 12 digit number.
	//
	// AccountId is a required field
	AccountId *string `min:"12" type:"string" required:"true"`

	// An integer to represent how many entries should a pagianted response contains.
	// Maxium is set to 100.
	MaxResults *int64 `min:"1" type:"integer"`

	// A generic String.
	NextToken *string `type:"string"`
}

// String returns the string representation
func (s DescribeBudgetsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeBudgetsInput) GoString() string {
	return s.String()
}

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

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

// Response of DescribeBudgets
type DescribeBudgetsOutput struct {
	_ struct{} `type:"structure"`

	// A list of budgets
	Budgets []*Budget `type:"list"`

	// A generic String.
	NextToken *string `type:"string"`
}

// String returns the string representation
func (s DescribeBudgetsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeBudgetsOutput) GoString() string {
	return s.String()
}

// Request of DescribeNotificationsForBudget
type DescribeNotificationsForBudgetInput struct {
	_ struct{} `type:"structure"`

	// Account Id of the customer. It should be a 12 digit number.
	//
	// AccountId is a required field
	AccountId *string `min:"12" type:"string" required:"true"`

	// A string represents the budget name. No ":" character is allowed.
	//
	// BudgetName is a required field
	BudgetName *string `type:"string" required:"true"`

	// An integer to represent how many entries should a pagianted response contains.
	// Maxium is set to 100.
	MaxResults *int64 `min:"1" type:"integer"`

	// A generic String.
	NextToken *string `type:"string"`
}

// String returns the string representation
func (s DescribeNotificationsForBudgetInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeNotificationsForBudgetInput) GoString() string {
	return s.String()
}

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

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

// Response of GetNotificationsForBudget
type DescribeNotificationsForBudgetOutput struct {
	_ struct{} `type:"structure"`

	// A generic String.
	NextToken *string `type:"string"`

	// A list of notifications.
	Notifications []*Notification `type:"list"`
}

// String returns the string representation
func (s DescribeNotificationsForBudgetOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeNotificationsForBudgetOutput) GoString() string {
	return s.String()
}

// Request of DescribeSubscribersForNotification
type DescribeSubscribersForNotificationInput struct {
	_ struct{} `type:"structure"`

	// Account Id of the customer. It should be a 12 digit number.
	//
	// AccountId is a required field
	AccountId *string `min:"12" type:"string" required:"true"`

	// A string represents the budget name. No ":" character is allowed.
	//
	// BudgetName is a required field
	BudgetName *string `type:"string" required:"true"`

	// An integer to represent how many entries should a pagianted response contains.
	// Maxium is set to 100.
	MaxResults *int64 `min:"1" type:"integer"`

	// A generic String.
	NextToken *string `type:"string"`

	// Notification model. Each budget may contain multiple notifications with different
	// settings.
	//
	// Notification is a required field
	Notification *Notification `type:"structure" required:"true"`
}

// String returns the string representation
func (s DescribeSubscribersForNotificationInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeSubscribersForNotificationInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *DescribeSubscribersForNotificationInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "DescribeSubscribersForNotificationInput"}
	if s.AccountId == nil {
		invalidParams.Add(request.NewErrParamRequired("AccountId"))
	}
	if s.AccountId != nil && len(*s.AccountId) < 12 {
		invalidParams.Add(request.NewErrParamMinLen("AccountId", 12))
	}
	if s.BudgetName == nil {
		invalidParams.Add(request.NewErrParamRequired("BudgetName"))
	}
	if s.MaxResults != nil && *s.MaxResults < 1 {
		invalidParams.Add(request.NewErrParamMinValue("MaxResults", 1))
	}
	if s.Notification == nil {
		invalidParams.Add(request.NewErrParamRequired("Notification"))
	}
	if s.Notification != nil {
		if err := s.Notification.Validate(); err != nil {
			invalidParams.AddNested("Notification", err.(request.ErrInvalidParams))
		}
	}

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

// Response of DescribeSubscribersForNotification
type DescribeSubscribersForNotificationOutput struct {
	_ struct{} `type:"structure"`

	// A generic String.
	NextToken *string `type:"string"`

	// A list of subscribers.
	Subscribers []*Subscriber `min:"1" type:"list"`
}

// String returns the string representation
func (s DescribeSubscribersForNotificationOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeSubscribersForNotificationOutput) GoString() string {
	return s.String()
}

// Notification model. Each budget may contain multiple notifications with different
// settings.
type Notification struct {
	_ struct{} `type:"structure"`

	// The comparison operator of a notification. Currently we support less than,
	// equal to and greater than.
	//
	// ComparisonOperator is a required field
	ComparisonOperator *string `type:"string" required:"true" enum:"ComparisonOperator"`

	// The type of a notification. It should be ACTUAL or FORECASTED.
	//
	// NotificationType is a required field
	NotificationType *string `type:"string" required:"true" enum:"NotificationType"`

	// The threshold of the a notification. It should be a number between 0 and
	// 100.
	//
	// Threshold is a required field
	Threshold *float64 `min:"0.1" type:"double" required:"true"`
}

// String returns the string representation
func (s Notification) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s Notification) GoString() string {
	return s.String()
}

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

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

// A structure to relate notification and a list of subscribers who belong to
// the notification.
type NotificationWithSubscribers struct {
	_ struct{} `type:"structure"`

	// Notification model. Each budget may contain multiple notifications with different
	// settings.
	//
	// Notification is a required field
	Notification *Notification `type:"structure" required:"true"`

	// A list of subscribers.
	//
	// Subscribers is a required field
	Subscribers []*Subscriber `min:"1" type:"list" required:"true"`
}

// String returns the string representation
func (s NotificationWithSubscribers) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s NotificationWithSubscribers) GoString() string {
	return s.String()
}

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

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

// A structure represent either a cost spend or usage spend. Contains an amount
// and a unit.
type Spend struct {
	_ struct{} `type:"structure"`

	// A string to represent NumericValue.
	//
	// Amount is a required field
	Amount *string `type:"string" required:"true"`

	// A generic String.
	//
	// Unit is a required field
	Unit *string `type:"string" required:"true"`
}

// String returns the string representation
func (s Spend) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s Spend) GoString() string {
	return s.String()
}

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

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

// Subscriber model. Each notification may contain multiple subscribers with
// different addresses.
type Subscriber struct {
	_ struct{} `type:"structure"`

	// A generic String.
	//
	// Address is a required field
	Address *string `type:"string" required:"true"`

	// The subscription type of the subscriber. It can be SMS or EMAIL.
	//
	// SubscriptionType is a required field
	SubscriptionType *string `type:"string" required:"true" enum:"SubscriptionType"`
}

// String returns the string representation
func (s Subscriber) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s Subscriber) GoString() string {
	return s.String()
}

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

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

// A time period indicated the start date and end date of a budget.
type TimePeriod struct {
	_ struct{} `type:"structure"`

	// A generic timestamp. In Java it is transformed to a Date object.
	//
	// End is a required field
	End *time.Time `type:"timestamp" timestampFormat:"unix" required:"true"`

	// A generic timestamp. In Java it is transformed to a Date object.
	//
	// Start is a required field
	Start *time.Time `type:"timestamp" timestampFormat:"unix" required:"true"`
}

// String returns the string representation
func (s TimePeriod) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s TimePeriod) GoString() string {
	return s.String()
}

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

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

// Request of UpdateBudget
type UpdateBudgetInput struct {
	_ struct{} `type:"structure"`

	// Account Id of the customer. It should be a 12 digit number.
	//
	// AccountId is a required field
	AccountId *string `min:"12" type:"string" required:"true"`

	// AWS Budget model
	//
	// NewBudget is a required field
	NewBudget *Budget `type:"structure" required:"true"`
}

// String returns the string representation
func (s UpdateBudgetInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s UpdateBudgetInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *UpdateBudgetInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "UpdateBudgetInput"}
	if s.AccountId == nil {
		invalidParams.Add(request.NewErrParamRequired("AccountId"))
	}
	if s.AccountId != nil && len(*s.AccountId) < 12 {
		invalidParams.Add(request.NewErrParamMinLen("AccountId", 12))
	}
	if s.NewBudget == nil {
		invalidParams.Add(request.NewErrParamRequired("NewBudget"))
	}
	if s.NewBudget != nil {
		if err := s.NewBudget.Validate(); err != nil {
			invalidParams.AddNested("NewBudget", err.(request.ErrInvalidParams))
		}
	}

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

// Response of UpdateBudget
type UpdateBudgetOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s UpdateBudgetOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s UpdateBudgetOutput) GoString() string {
	return s.String()
}

// Request of UpdateNotification
type UpdateNotificationInput struct {
	_ struct{} `type:"structure"`

	// Account Id of the customer. It should be a 12 digit number.
	//
	// AccountId is a required field
	AccountId *string `min:"12" type:"string" required:"true"`

	// A string represents the budget name. No ":" character is allowed.
	//
	// BudgetName is a required field
	BudgetName *string `type:"string" required:"true"`

	// Notification model. Each budget may contain multiple notifications with different
	// settings.
	//
	// NewNotification is a required field
	NewNotification *Notification `type:"structure" required:"true"`

	// Notification model. Each budget may contain multiple notifications with different
	// settings.
	//
	// OldNotification is a required field
	OldNotification *Notification `type:"structure" required:"true"`
}

// String returns the string representation
func (s UpdateNotificationInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s UpdateNotificationInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *UpdateNotificationInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "UpdateNotificationInput"}
	if s.AccountId == nil {
		invalidParams.Add(request.NewErrParamRequired("AccountId"))
	}
	if s.AccountId != nil && len(*s.AccountId) < 12 {
		invalidParams.Add(request.NewErrParamMinLen("AccountId", 12))
	}
	if s.BudgetName == nil {
		invalidParams.Add(request.NewErrParamRequired("BudgetName"))
	}
	if s.NewNotification == nil {
		invalidParams.Add(request.NewErrParamRequired("NewNotification"))
	}
	if s.OldNotification == nil {
		invalidParams.Add(request.NewErrParamRequired("OldNotification"))
	}
	if s.NewNotification != nil {
		if err := s.NewNotification.Validate(); err != nil {
			invalidParams.AddNested("NewNotification", err.(request.ErrInvalidParams))
		}
	}
	if s.OldNotification != nil {
		if err := s.OldNotification.Validate(); err != nil {
			invalidParams.AddNested("OldNotification", err.(request.ErrInvalidParams))
		}
	}

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

// Response of UpdateNotification
type UpdateNotificationOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s UpdateNotificationOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s UpdateNotificationOutput) GoString() string {
	return s.String()
}

// Request of UpdateSubscriber
type UpdateSubscriberInput struct {
	_ struct{} `type:"structure"`

	// Account Id of the customer. It should be a 12 digit number.
	//
	// AccountId is a required field
	AccountId *string `min:"12" type:"string" required:"true"`

	// A string represents the budget name. No ":" character is allowed.
	//
	// BudgetName is a required field
	BudgetName *string `type:"string" required:"true"`

	// Subscriber model. Each notification may contain multiple subscribers with
	// different addresses.
	//
	// NewSubscriber is a required field
	NewSubscriber *Subscriber `type:"structure" required:"true"`

	// Notification model. Each budget may contain multiple notifications with different
	// settings.
	//
	// Notification is a required field
	Notification *Notification `type:"structure" required:"true"`

	// Subscriber model. Each notification may contain multiple subscribers with
	// different addresses.
	//
	// OldSubscriber is a required field
	OldSubscriber *Subscriber `type:"structure" required:"true"`
}

// String returns the string representation
func (s UpdateSubscriberInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s UpdateSubscriberInput) GoString() string {
	return s.String()
}

// Validate inspects the fields of the type to determine if they are valid.
func (s *UpdateSubscriberInput) Validate() error {
	invalidParams := request.ErrInvalidParams{Context: "UpdateSubscriberInput"}
	if s.AccountId == nil {
		invalidParams.Add(request.NewErrParamRequired("AccountId"))
	}
	if s.AccountId != nil && len(*s.AccountId) < 12 {
		invalidParams.Add(request.NewErrParamMinLen("AccountId", 12))
	}
	if s.BudgetName == nil {
		invalidParams.Add(request.NewErrParamRequired("BudgetName"))
	}
	if s.NewSubscriber == nil {
		invalidParams.Add(request.NewErrParamRequired("NewSubscriber"))
	}
	if s.Notification == nil {
		invalidParams.Add(request.NewErrParamRequired("Notification"))
	}
	if s.OldSubscriber == nil {
		invalidParams.Add(request.NewErrParamRequired("OldSubscriber"))
	}
	if s.NewSubscriber != nil {
		if err := s.NewSubscriber.Validate(); err != nil {
			invalidParams.AddNested("NewSubscriber", err.(request.ErrInvalidParams))
		}
	}
	if s.Notification != nil {
		if err := s.Notification.Validate(); err != nil {
			invalidParams.AddNested("Notification", err.(request.ErrInvalidParams))
		}
	}
	if s.OldSubscriber != nil {
		if err := s.OldSubscriber.Validate(); err != nil {
			invalidParams.AddNested("OldSubscriber", err.(request.ErrInvalidParams))
		}
	}

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

// Response of UpdateSubscriber
type UpdateSubscriberOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s UpdateSubscriberOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s UpdateSubscriberOutput) GoString() string {
	return s.String()
}

// The type of a budget. Can be COST or USAGE.
const (
	// BudgetTypeUsage is a BudgetType enum value
	BudgetTypeUsage = "USAGE"

	// BudgetTypeCost is a BudgetType enum value
	BudgetTypeCost = "COST"
)

// The comparison operator of a notification. Currently we support less than,
// equal to and greater than.
const (
	// ComparisonOperatorGreaterThan is a ComparisonOperator enum value
	ComparisonOperatorGreaterThan = "GREATER_THAN"

	// ComparisonOperatorLessThan is a ComparisonOperator enum value
	ComparisonOperatorLessThan = "LESS_THAN"

	// ComparisonOperatorEqualTo is a ComparisonOperator enum value
	ComparisonOperatorEqualTo = "EQUAL_TO"
)

// The type of a notification. It should be ACTUAL or FORECASTED.
const (
	// NotificationTypeActual is a NotificationType enum value
	NotificationTypeActual = "ACTUAL"

	// NotificationTypeForecasted is a NotificationType enum value
	NotificationTypeForecasted = "FORECASTED"
)

// The subscription type of the subscriber. It can be SMS or EMAIL.
const (
	// SubscriptionTypeSns is a SubscriptionType enum value
	SubscriptionTypeSns = "SNS"

	// SubscriptionTypeEmail is a SubscriptionType enum value
	SubscriptionTypeEmail = "EMAIL"
)

// The time unit of the budget. e.g. weekly, monthly, etc.
const (
	// TimeUnitMonthly is a TimeUnit enum value
	TimeUnitMonthly = "MONTHLY"

	// TimeUnitQuarterly is a TimeUnit enum value
	TimeUnitQuarterly = "QUARTERLY"

	// TimeUnitAnnually is a TimeUnit enum value
	TimeUnitAnnually = "ANNUALLY"
)
