text: // Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT.
  
  package mobileanalytics
  
  import (
  	"fmt"
  
  	"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"
  	"github.com/aws/aws-sdk-go/private/protocol/restjson"
  )
  
  const opPutEvents = "PutEvents"
  
  // PutEventsRequest generates a "aws/request.Request" representing the
  // client's request for the PutEvents 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 PutEvents for more information on using the PutEvents
  // 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 PutEventsRequest method.
  //    req, resp := client.PutEventsRequest(params)
  //
  //    err := req.Send()
  //    if err == nil { // resp is now filled
  //        fmt.Println(resp)
  //    }
  func (c *MobileAnalytics) PutEventsRequest(input *PutEventsInput) (req *request.Request, output *PutEventsOutput) {
  	op := &request.Operation{
  		Name:       opPutEvents,
  		HTTPMethod: "POST",
  		HTTPPath:   "/2014-06-05/events",
  	}
  
  	if input == nil {
  		input = &PutEventsInput{}
  	}
  
  	output = &PutEventsOutput{}
  	req = c.newRequest(op, input, output)
  	req.Handlers.Unmarshal.Swap(restjson.UnmarshalHandler.Name, protocol.UnmarshalDiscardBodyHandler)
  	return
  }
  
  // PutEvents API operation for Amazon Mobile Analytics.
  //
  // The PutEvents operation records one or more events. You can have up to 1,500
  // unique custom events per app, any combination of up to 40 attributes and
  // metrics per custom event, and any number of attribute or metric values.
  //
  // 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 Amazon Mobile Analytics's
  // API operation PutEvents for usage and error information.
  //
  // Returned Error Types:
  //   * BadRequestException
  //   An exception object returned when a request fails.
  //
  func (c *MobileAnalytics) PutEvents(input *PutEventsInput) (*PutEventsOutput, error) {
  	req, out := c.PutEventsRequest(input)
  	return out, req.Send()
  }
  
  // PutEventsWithContext is the same as PutEvents with the addition of
  // the ability to pass a context and additional request options.
  //
  // See PutEvents 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 *MobileAnalytics) PutEventsWithContext(ctx aws.Context, input *PutEventsInput, opts ...request.Option) (*PutEventsOutput, error) {
  	req, out := c.PutEventsRequest(input)
  	req.SetContext(ctx)
  	req.ApplyOptions(opts...)
  	return out, req.Send()
  }
  
  // An exception object returned when a request fails.
  type BadRequestException struct {
  	_            struct{}                  `type:"structure"`
  	RespMetadata protocol.ResponseMetadata `json:"-" xml:"-"`
  
  	// A text description associated with the BadRequestException object.
  	Message_ *string `locationName:"message" type:"string"`
  }
  
  // String returns the string representation
  func (s BadRequestException) String() string {
  	return awsutil.Prettify(s)
  }
  
  // GoString returns the string representation
  func (s BadRequestException) GoString() string {
  	return s.String()
  }
  
  func newErrorBadRequestException(v protocol.ResponseMetadata) error {
  	return &BadRequestException{
  		RespMetadata: v,
  	}
  }
  
  // Code returns the exception type name.
  func (s *BadRequestException) Code() string {
  	return "BadRequestException"
  }
  
  // Message returns the exception's message.
  func (s *BadRequestException) Message() string {
  	if s.Message_ != nil {
  		return *s.Message_
  	}
  	return ""
  }
  
  // OrigErr always returns nil, satisfies awserr.Error interface.
  func (s *BadRequestException) OrigErr() error {
  	return nil
  }
  
  func (s *BadRequestException) 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 *BadRequestException) StatusCode() int {
  	return s.RespMetadata.StatusCode
  }
  
  // RequestID returns the service's response RequestID for request.
  func (s *BadRequestException) RequestID() string {
  	return s.RespMetadata.RequestID
  }
  
  // A JSON object representing a batch of unique event occurrences in your app.
  type Event struct {
  	_ struct{} `type:"structure"`
  
  	// A collection of key-value pairs that give additional context to the event.
  	// The key-value pairs are specified by the developer.
  	//
  	// This collection can be empty or the attribute object can be omitted.
  	Attributes map[string]*string `locationName:"attributes" type:"map"`
  
  	// A name signifying an event that occurred in your app. This is used for grouping
  	// and aggregating like events together for reporting purposes.
  	//
  	// EventType is a required field
  	EventType *string `locationName:"eventType" min:"1" type:"string" required:"true"`
  
  	// A collection of key-value pairs that gives additional, measurable context
  	// to the event. The key-value pairs are specified by the developer.
  	//
  	// This collection can be empty or the attribute object can be omitted.
  	Metrics map[string]*float64 `locationName:"metrics" type:"map"`
  
  	// The session the event occured within.
  	Session *Session `locationName:"session" type:"structure"`
  
  	// The time the event occurred in ISO 8601 standard date time format. For example,
  	// 2014-06-30T19:07:47.885Z
  	//
  	// Timestamp is a required field
  	Timestamp *string `locationName:"timestamp" type:"string" required:"true"`
  
  	// The version of the event.
  	Version *string `locationName:"version" min:"1" type:"string"`
  }
  
  // String returns the string representation
  func (s Event) String() string {
  	return awsutil.Prettify(s)
  }
  
  // GoString returns the string representation
  func (s Event) GoString() string {
  	return s.String()
  }
  
  // Validate inspects the fields of the type to determine if they are valid.
  func (s *Event) Validate() error {
  	invalidParams := request.ErrInvalidParams{Context: "Event"}
  	if s.EventType == nil {
  		invalidParams.Add(request.NewErrParamRequired("EventType"))
  	}
  	if s.EventType != nil && len(*s.EventType) < 1 {
  		invalidParams.Add(request.NewErrParamMinLen("EventType", 1))
  	}
  	if s.Timestamp == nil {
  		invalidParams.Add(request.NewErrParamRequired("Timestamp"))
  	}
  	if s.Version != nil && len(*s.Version) < 1 {
  		invalidParams.Add(request.NewErrParamMinLen("Version", 1))
  	}
  	if s.Session != nil {
  		if err := s.Session.Validate(); err != nil {
  			invalidParams.AddNested("Session", err.(request.ErrInvalidParams))
  		}
  	}
  
  	if invalidParams.Len() > 0 {
  		return invalidParams
  	}
  	return nil
  }
  
  // SetAttributes sets the Attributes field's value.
  func (s *Event) SetAttributes(v map[string]*string) *Event {
  	s.Attributes = v
  	return s
  }
  
  // SetEventType sets the EventType field's value.
  func (s *Event) SetEventType(v string) *Event {
  	s.EventType = &v
  	return s
  }
  
  // SetMetrics sets the Metrics field's value.
  func (s *Event) SetMetrics(v map[string]*float64) *Event {
  	s.Metrics = v
  	return s
  }
  
  // SetSession sets the Session field's value.
  func (s *Event) SetSession(v *Session) *Event {
  	s.Session = v
  	return s
  }
  
  // SetTimestamp sets the Timestamp field's value.
  func (s *Event) SetTimestamp(v string) *Event {
  	s.Timestamp = &v
  	return s
  }
  
  // SetVersion sets the Version field's value.
  func (s *Event) SetVersion(v string) *Event {
  	s.Version = &v
  	return s
  }
  
  // A container for the data needed for a PutEvent operation
  type PutEventsInput struct {
  	_ struct{} `type:"structure"`
  
  	// The client context including the client ID, app title, app version and package
  	// name.
  	//
  	// ClientContext is a required field
  	ClientContext *string `location:"header" locationName:"x-amz-Client-Context" type:"string" required:"true"`
  
  	// The encoding used for the client context.
  	ClientContextEncoding *string `location:"header" locationName:"x-amz-Client-Context-Encoding" type:"string"`
  
  	// An array of Event JSON objects
  	//
  	// Events is a required field
  	Events []*Event `locationName:"events" type:"list" required:"true"`
  }
  
  // String returns the string representation
  func (s PutEventsInput) String() string {
  	return awsutil.Prettify(s)
  }
  
  // GoString returns the string representation
  func (s PutEventsInput) GoString() string {
  	return s.String()
  }
  
  // Validate inspects the fields of the type to determine if they are valid.
  func (s *PutEventsInput) Validate() error {
  	invalidParams := request.ErrInvalidParams{Context: "PutEventsInput"}
  	if s.ClientContext == nil {
  		invalidParams.Add(request.NewErrParamRequired("ClientContext"))
  	}
  	if s.Events == nil {
  		invalidParams.Add(request.NewErrParamRequired("Events"))
  	}
  	if s.Events != nil {
  		for i, v := range s.Events {
  			if v == nil {
  				continue
  			}
  			if err := v.Validate(); err != nil {
  				invalidParams.AddNested(fmt.Sprintf("%s[%v]", "Events", i), err.(request.ErrInvalidParams))
  			}
  		}
  	}
  
  	if invalidParams.Len() > 0 {
  		return invalidParams
  	}
  	return nil
  }
  
  // SetClientContext sets the ClientContext field's value.
  func (s *PutEventsInput) SetClientContext(v string) *PutEventsInput {
  	s.ClientContext = &v
  	return s
  }
  
  // SetClientContextEncoding sets the ClientContextEncoding field's value.
  func (s *PutEventsInput) SetClientContextEncoding(v string) *PutEventsInput {
  	s.ClientContextEncoding = &v
  	return s
  }
  
  // SetEvents sets the Events field's value.
  func (s *PutEventsInput) SetEvents(v []*Event) *PutEventsInput {
  	s.Events = v
  	return s
  }
  
  type PutEventsOutput struct {
  	_ struct{} `type:"structure"`
  }
  
  // String returns the string representation
  func (s PutEventsOutput) String() string {
  	return awsutil.Prettify(s)
  }
  
  // GoString returns the string representation
  func (s PutEventsOutput) GoString() string {
  	return s.String()
  }
  
  // Describes the session. Session information is required on ALL events.
  type Session struct {
  	_ struct{} `type:"structure"`
  
  	// The duration of the session.
  	Duration *int64 `locationName:"duration" type:"long"`
  
  	// A unique identifier for the session
  	Id *string `locationName:"id" min:"1" type:"string"`
  
  	// The time the event started in ISO 8601 standard date time format. For example,
  	// 2014-06-30T19:07:47.885Z
  	StartTimestamp *string `locationName:"startTimestamp" type:"string"`
  
  	// The time the event terminated in ISO 8601 standard date time format. For
  	// example, 2014-06-30T19:07:47.885Z
  	StopTimestamp *string `locationName:"stopTimestamp" type:"string"`
  }
  
  // String returns the string representation
  func (s Session) String() string {
  	return awsutil.Prettify(s)
  }
  
  // GoString returns the string representation
  func (s Session) GoString() string {
  	return s.String()
  }
  
  // Validate inspects the fields of the type to determine if they are valid.
  func (s *Session) Validate() error {
  	invalidParams := request.ErrInvalidParams{Context: "Session"}
  	if s.Id != nil && len(*s.Id) < 1 {
  		invalidParams.Add(request.NewErrParamMinLen("Id", 1))
  	}
  
  	if invalidParams.Len() > 0 {
  		return invalidParams
  	}
  	return nil
  }
  
  // SetDuration sets the Duration field's value.
  func (s *Session) SetDuration(v int64) *Session {
  	s.Duration = &v
  	return s
  }
  
  // SetId sets the Id field's value.
  func (s *Session) SetId(v string) *Session {
  	s.Id = &v
  	return s
  }
  
  // SetStartTimestamp sets the StartTimestamp field's value.
  func (s *Session) SetStartTimestamp(v string) *Session {
  	s.StartTimestamp = &v
  	return s
  }
  
  // SetStopTimestamp sets the StopTimestamp field's value.
  func (s *Session) SetStopTimestamp(v string) *Session {
  	s.StopTimestamp = &v
  	return s
  }
  