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

package ecr

import (
	"context"
	"github.com/aws/aws-sdk-go-v2/service/ecr/schemas"
	"github.com/aws/aws-sdk-go-v2/service/ecr/types"
	smithy "github.com/aws/smithy-go"
	"github.com/aws/smithy-go/middleware"
)

// Deletes a list of specified images within a repository. Images are specified
// with either an imageTag or imageDigest .
//
// You can remove a tag from an image by specifying the image's tag in your
// request. When you remove the last tag from an image, the image is deleted from
// your repository.
//
// You can completely delete an image (and all of its tags) by specifying the
// image's digest in your request.
func (c *Client) BatchDeleteImage(ctx context.Context, params *BatchDeleteImageInput, optFns ...func(*Options)) (*BatchDeleteImageOutput, error) {
	if params == nil {
		params = &BatchDeleteImageInput{}
	}

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

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

// Deletes specified images within a specified repository. Images are specified
// with either the imageTag or imageDigest .
type BatchDeleteImageInput struct {

	// A list of image ID references that correspond to images to delete. The format
	// of the imageIds reference is imageTag=tag or imageDigest=digest .
	//
	// This member is required.
	ImageIds []types.ImageIdentifier

	// The repository that contains the image to delete.
	//
	// This member is required.
	RepositoryName *string

	// The Amazon Web Services account ID associated with the registry that contains
	// the image to delete. If you do not specify a registry, the default registry is
	// assumed.
	RegistryId *string

	noSmithyDocumentSerde
}

func (v *BatchDeleteImageInput) Serialize(s smithy.ShapeSerializer) {
	s.WriteStruct(schemas.BatchDeleteImageRequest)
	v.SerializeMembers(s)
	s.CloseStruct()
}

func (v *BatchDeleteImageInput) SerializeMembers(s smithy.ShapeSerializer) {
	serializeImageIdentifierList(s, schemas.BatchDeleteImageRequest_imageIds, v.ImageIds)
	if v.RegistryId != nil {
		s.WriteString(schemas.BatchDeleteImageRequest_registryId, *v.RegistryId)
	}
	if v.RepositoryName != nil {
		s.WriteString(schemas.BatchDeleteImageRequest_repositoryName, *v.RepositoryName)
	}
}

type BatchDeleteImageOutput struct {

	// Any failures associated with the call.
	Failures []types.ImageFailure

	// The image IDs of the deleted images.
	ImageIds []types.ImageIdentifier

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

	noSmithyDocumentSerde
}

func (v *BatchDeleteImageOutput) Serialize(s smithy.ShapeSerializer) {
	s.WriteStruct(schemas.BatchDeleteImageResponse)
	v.SerializeMembers(s)
	s.CloseStruct()
}

func (v *BatchDeleteImageOutput) SerializeMembers(s smithy.ShapeSerializer) {
	serializeImageFailureList(s, schemas.BatchDeleteImageResponse_failures, v.Failures)
	serializeImageIdentifierList(s, schemas.BatchDeleteImageResponse_imageIds, v.ImageIds)
}
func (v *BatchDeleteImageOutput) Deserialize(d smithy.ShapeDeserializer) error {
	return smithy.ReadStruct(d, schemas.BatchDeleteImageResponse, func(s *smithy.Schema) error {
		switch s {
		case schemas.BatchDeleteImageResponse_failures:
			return deserializeImageFailureList(d, schemas.BatchDeleteImageResponse_failures, &v.Failures)
		case schemas.BatchDeleteImageResponse_imageIds:
			return deserializeImageIdentifierList(d, schemas.BatchDeleteImageResponse_imageIds, &v.ImageIds)
		}
		return nil
	})
}
func (c *Client) addOperationBatchDeleteImageMiddlewares(stack *middleware.Stack, options Options) (err error) {
	if err := stack.Serialize.Add(&serializeRequestMiddleware{options: &options, operationSchema: smithy.NewOperationSchema(schemas.BatchDeleteImage, schemas.BatchDeleteImageRequest, schemas.BatchDeleteImageResponse)}, middleware.After); err != nil {
		return err
	}
	if err := stack.Deserialize.Add(&deserializeResponseMiddleware{options: &options, operationSchema: smithy.NewOperationSchema(schemas.BatchDeleteImage, schemas.BatchDeleteImageRequest, schemas.BatchDeleteImageResponse), output: &BatchDeleteImageOutput{}}, middleware.After); err != nil {
		return err
	}

	if err = addResolveEndpointMiddleware(stack, options); err != nil {
		return err
	}
	if err = addComputePayloadSHA256(stack); err != nil {
		return err
	}
	if err = addRecordResponseTiming(stack, options); err != nil {
		return err
	}
	if err = addCredentialSource(stack, options); err != nil {
		return err
	}
	if err = addOpBatchDeleteImageValidationMiddleware(stack); 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
	}
	if err = addDisableHTTPSMiddleware(stack, options); err != nil {
		return err
	}
	if err = addInterceptors(stack, options); err != nil {
		return err
	}
	return nil
}
