// Code generated by smithy-go-codegen DO NOT EDIT.

package mediastoredata

import (
	"context"
	awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware"
	"github.com/aws/aws-sdk-go-v2/aws/signer/v4"
	"github.com/aws/smithy-go/middleware"
	smithyhttp "github.com/aws/smithy-go/transport/http"
	"io"
	"time"
)

// Downloads the object at the specified path. If the object’s upload availability
// is set to streaming, AWS Elemental MediaStore downloads the object even if it’s
// still uploading the object.
func (c *Client) GetObject(ctx context.Context, params *GetObjectInput, optFns ...func(*Options)) (*GetObjectOutput, error) {
	if params == nil {
		params = &GetObjectInput{}
	}

	result, metadata, err := c.invokeOperation(ctx, "GetObject", params, optFns, c.addOperationGetObjectMiddlewares)
	if err != nil {
		return nil, err
	}

	out := result.(*GetObjectOutput)
	out.ResultMetadata = metadata
	return out, nil
}

type GetObjectInput struct {

	// The path (including the file name) where the object is stored in the container.
	// Format: // For example, to upload the file mlaw.avi to the folder path
	// premium\canada in the container movies, enter the path premium/canada/mlaw.avi.
	// Do not include the container name in this path. If the path includes any folders
	// that don't exist yet, the service creates them. For example, suppose you have an
	// existing premium/usa subfolder. If you specify premium/canada, the service
	// creates a canada subfolder in the premium folder. You then have two subfolders,
	// usa and canada, in the premium folder. There is no correlation between the path
	// to the source and the path (folders) in the container in AWS Elemental
	// MediaStore. For more information about folders and how they exist in a
	// container, see the AWS Elemental MediaStore User Guide
	// (http://docs.aws.amazon.com/mediastore/latest/ug/). The file name is the name
	// that is assigned to the file that you upload. The file can have the same name
	// inside and outside of AWS Elemental MediaStore, or it can have the same name.
	// The file name can include or omit an extension.
	//
	// This member is required.
	Path *string

	// The range bytes of an object to retrieve. For more information about the Range
	// header, see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35
	// (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35). AWS Elemental
	// MediaStore ignores this header for partially uploaded objects that have
	// streaming upload availability.
	Range *string

	noSmithyDocumentSerde
}

type GetObjectOutput struct {

	// The HTML status code of the request. Status codes ranging from 200 to 299
	// indicate success. All other status codes indicate the type of error that
	// occurred.
	//
	// This member is required.
	StatusCode int32

	// The bytes of the object.
	Body io.ReadCloser

	// An optional CacheControl header that allows the caller to control the object's
	// cache behavior. Headers can be passed in as specified in the HTTP spec at
	// https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9
	// (https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9). Headers with
	// a custom user-defined value are also accepted.
	CacheControl *string

	// The length of the object in bytes.
	ContentLength *int64

	// The range of bytes to retrieve.
	ContentRange *string

	// The content type of the object.
	ContentType *string

	// The ETag that represents a unique instance of the object.
	ETag *string

	// The date and time that the object was last modified.
	LastModified *time.Time

	// Metadata pertaining to the operation's result.
	ResultMetadata middleware.Metadata

	noSmithyDocumentSerde
}

func (c *Client) addOperationGetObjectMiddlewares(stack *middleware.Stack, options Options) (err error) {
	err = stack.Serialize.Add(&awsRestjson1_serializeOpGetObject{}, middleware.After)
	if err != nil {
		return err
	}
	err = stack.Deserialize.Add(&awsRestjson1_deserializeOpGetObject{}, middleware.After)
	if err != nil {
		return err
	}
	if err = addSetLoggerMiddleware(stack, options); err != nil {
		return err
	}
	if err = awsmiddleware.AddClientRequestIDMiddleware(stack); err != nil {
		return err
	}
	if err = smithyhttp.AddComputeContentLengthMiddleware(stack); err != nil {
		return err
	}
	if err = addResolveEndpointMiddleware(stack, options); err != nil {
		return err
	}
	if err = v4.AddComputePayloadSHA256Middleware(stack); err != nil {
		return err
	}
	if err = addRetryMiddlewares(stack, options); err != nil {
		return err
	}
	if err = addHTTPSignerV4Middleware(stack, options); err != nil {
		return err
	}
	if err = awsmiddleware.AddRawResponseToMetadata(stack); err != nil {
		return err
	}
	if err = awsmiddleware.AddRecordResponseTiming(stack); err != nil {
		return err
	}
	if err = addClientUserAgent(stack); err != nil {
		return err
	}
	if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {
		return err
	}
	if err = addOpGetObjectValidationMiddleware(stack); err != nil {
		return err
	}
	if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetObject(options.Region), middleware.Before); err != nil {
		return err
	}
	if err = addRequestIDRetrieverMiddleware(stack); err != nil {
		return err
	}
	if err = addResponseErrorMiddleware(stack); err != nil {
		return err
	}
	if err = addRequestResponseLogging(stack, options); err != nil {
		return err
	}
	return nil
}

func newServiceMetadataMiddleware_opGetObject(region string) *awsmiddleware.RegisterServiceMetadata {
	return &awsmiddleware.RegisterServiceMetadata{
		Region:        region,
		ServiceID:     ServiceID,
		SigningName:   "mediastore",
		OperationName: "GetObject",
	}
}
