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

package secretsmanager

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/aws-sdk-go-v2/service/secretsmanager/types"
	"github.com/aws/smithy-go/middleware"
	smithyhttp "github.com/aws/smithy-go/transport/http"
)

// Attaches tags to a secret. Tags consist of a key name and a value. Tags are part
// of the secret's metadata. They are not associated with specific versions of the
// secret. This operation appends tags to the existing list of tags. The following
// restrictions apply to tags:
//
// * Maximum number of tags per secret: 50
//
// * Maximum
// key length: 127 Unicode characters in UTF-8
//
// * Maximum value length: 255 Unicode
// characters in UTF-8
//
// * Tag keys and values are case sensitive.
//
// * Do not use the
// aws: prefix in your tag names or values because Amazon Web Services reserves it
// for Amazon Web Services use. You can't edit or delete tag names or values with
// this prefix. Tags with this prefix do not count against your tags per secret
// limit.
//
// * If you use your tagging schema across multiple services and resources,
// other services might have restrictions on allowed characters. Generally allowed
// characters: letters, spaces, and numbers representable in UTF-8, plus the
// following special characters: + - = . _ : / @.
//
// If you use tags as part of your
// security strategy, then adding or removing a tag can change permissions. If
// successfully completing this operation would result in you losing your
// permissions for this secret, then the operation is blocked and returns an Access
// Denied error. Secrets Manager generates a CloudTrail log entry when you call
// this action. Do not include sensitive information in request parameters because
// it might be logged. For more information, see Logging Secrets Manager events
// with CloudTrail
// (https://docs.aws.amazon.com/secretsmanager/latest/userguide/retrieve-ct-entries.html).
// Required permissions: secretsmanager:TagResource. For more information, see  IAM
// policy actions for Secrets Manager
// (https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_iam-permissions.html#reference_iam-permissions_actions)
// and Authentication and access control in Secrets Manager
// (https://docs.aws.amazon.com/secretsmanager/latest/userguide/auth-and-access.html).
func (c *Client) TagResource(ctx context.Context, params *TagResourceInput, optFns ...func(*Options)) (*TagResourceOutput, error) {
	if params == nil {
		params = &TagResourceInput{}
	}

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

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

type TagResourceInput struct {

	// The identifier for the secret to attach tags to. You can specify either the
	// Amazon Resource Name (ARN) or the friendly name of the secret. For an ARN, we
	// recommend that you specify a complete ARN rather than a partial ARN. See Finding
	// a secret from a partial ARN
	// (https://docs.aws.amazon.com/secretsmanager/latest/userguide/troubleshoot.html#ARN_secretnamehyphen).
	//
	// This member is required.
	SecretId *string

	// The tags to attach to the secret as a JSON text string argument. Each element in
	// the list consists of a Key and a Value. For storing multiple values, we
	// recommend that you use a JSON text string argument and specify key/value pairs.
	// For more information, see Specifying parameter values for the Amazon Web
	// Services CLI
	// (https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-parameters.html) in
	// the Amazon Web Services CLI User Guide.
	//
	// This member is required.
	Tags []types.Tag

	noSmithyDocumentSerde
}

type TagResourceOutput struct {
	// Metadata pertaining to the operation's result.
	ResultMetadata middleware.Metadata

	noSmithyDocumentSerde
}

func (c *Client) addOperationTagResourceMiddlewares(stack *middleware.Stack, options Options) (err error) {
	err = stack.Serialize.Add(&awsAwsjson11_serializeOpTagResource{}, middleware.After)
	if err != nil {
		return err
	}
	err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpTagResource{}, 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 = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {
		return err
	}
	if err = addOpTagResourceValidationMiddleware(stack); err != nil {
		return err
	}
	if err = stack.Initialize.Add(newServiceMetadataMiddleware_opTagResource(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_opTagResource(region string) *awsmiddleware.RegisterServiceMetadata {
	return &awsmiddleware.RegisterServiceMetadata{
		Region:        region,
		ServiceID:     ServiceID,
		SigningName:   "secretsmanager",
		OperationName: "TagResource",
	}
}
