package customizations

import (
	
	
	
	awsmiddleware 
	
	
	
)

type s3ObjectLambdaEndpoint struct {
	// whether the operation should use the s3-object-lambda endpoint
	UseEndpoint bool

	// use transfer acceleration
	UseAccelerate bool

	EndpointResolver        EndpointResolver
	EndpointResolverOptions EndpointResolverOptions
}

func ( *s3ObjectLambdaEndpoint) () string {
	return "S3:ObjectLambdaEndpoint"
}

func ( *s3ObjectLambdaEndpoint) (
	 context.Context,  middleware.SerializeInput,  middleware.SerializeHandler,
) (
	 middleware.SerializeOutput,  middleware.Metadata,  error,
) {
	if !.UseEndpoint {
		return .HandleSerialize(, )
	}

	,  := .Request.(*http.Request)
	if ! {
		return , , fmt.Errorf("unknown transport type: %T", .Request)
	}

	if .EndpointResolverOptions.UseDualStackEndpoint == aws.DualStackEndpointStateEnabled {
		return , , fmt.Errorf("client configured for dualstack but not supported for operation")
	}

	if .UseAccelerate {
		return , , fmt.Errorf("client configured for accelerate but not supported for operation")
	}

	 := awsmiddleware.GetRegion()

	 := .EndpointResolverOptions

	,  := .EndpointResolver.ResolveEndpoint(, )
	if  != nil {
		return , , 
	}

	// Set the ServiceID and SigningName
	 = awsmiddleware.SetServiceID(, s3ObjectLambda)

	if len(.SigningName) > 0 && .Source == aws.EndpointSourceCustom {
		 = awsmiddleware.SetSigningName(, .SigningName)
	} else {
		 = awsmiddleware.SetSigningName(, s3ObjectLambda)
	}

	.URL,  = url.Parse(.URL)
	if  != nil {
		return , , 
	}

	if len(.SigningRegion) > 0 {
		 = awsmiddleware.SetSigningRegion(, .SigningRegion)
	} else {
		 = awsmiddleware.SetSigningRegion(, )
	}

	if .Source == aws.EndpointSourceServiceMetadata || !.HostnameImmutable {
		updateS3HostForS3ObjectLambda()
	}

	return .HandleSerialize(, )
}