package cfg

import (
	"context"
	"reflect"

	"github.com/pkg/errors"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

type RemediationConfiguration struct {
	pulumi.CustomResourceState

	Arn pulumi.StringOutput `pulumi:"arn"`

	Automatic pulumi.BoolPtrOutput `pulumi:"automatic"`

	ConfigRuleName pulumi.StringOutput `pulumi:"configRuleName"`

	ExecutionControls RemediationConfigurationExecutionControlsPtrOutput `pulumi:"executionControls"`

	MaximumAutomaticAttempts pulumi.IntPtrOutput `pulumi:"maximumAutomaticAttempts"`

	Parameters RemediationConfigurationParameterArrayOutput `pulumi:"parameters"`

	ResourceType pulumi.StringPtrOutput `pulumi:"resourceType"`

	RetryAttemptSeconds pulumi.IntPtrOutput `pulumi:"retryAttemptSeconds"`

	TargetId pulumi.StringOutput `pulumi:"targetId"`

	TargetType pulumi.StringOutput `pulumi:"targetType"`

	TargetVersion pulumi.StringPtrOutput `pulumi:"targetVersion"`
}

func NewRemediationConfiguration(ctx *pulumi.Context,
	name string, args *RemediationConfigurationArgs, opts ...pulumi.ResourceOption) (*RemediationConfiguration, error) {
	if args == nil {
		return nil, errors.New("missing one or more required arguments")
	}

	if args.ConfigRuleName == nil {
		return nil, errors.New("invalid value for required argument 'ConfigRuleName'")
	}
	if args.TargetId == nil {
		return nil, errors.New("invalid value for required argument 'TargetId'")
	}
	if args.TargetType == nil {
		return nil, errors.New("invalid value for required argument 'TargetType'")
	}
	var resource RemediationConfiguration
	err := ctx.RegisterResource("aws:cfg/remediationConfiguration:RemediationConfiguration", name, args, &resource, opts...)
	if err != nil {
		return nil, err
	}
	return &resource, nil
}

func GetRemediationConfiguration(ctx *pulumi.Context,
	name string, id pulumi.IDInput, state *RemediationConfigurationState, opts ...pulumi.ResourceOption) (*RemediationConfiguration, error) {
	var resource RemediationConfiguration
	err := ctx.ReadResource("aws:cfg/remediationConfiguration:RemediationConfiguration", name, id, state, &resource, opts...)
	if err != nil {
		return nil, err
	}
	return &resource, nil
}

type remediationConfigurationState struct {

	Arn *string `pulumi:"arn"`

	Automatic *bool `pulumi:"automatic"`

	ConfigRuleName *string `pulumi:"configRuleName"`

	ExecutionControls *RemediationConfigurationExecutionControls `pulumi:"executionControls"`

	MaximumAutomaticAttempts *int `pulumi:"maximumAutomaticAttempts"`

	Parameters []RemediationConfigurationParameter `pulumi:"parameters"`

	ResourceType *string `pulumi:"resourceType"`

	RetryAttemptSeconds *int `pulumi:"retryAttemptSeconds"`

	TargetId *string `pulumi:"targetId"`

	TargetType *string `pulumi:"targetType"`

	TargetVersion *string `pulumi:"targetVersion"`
}

type RemediationConfigurationState struct {

	Arn pulumi.StringPtrInput

	Automatic pulumi.BoolPtrInput

	ConfigRuleName pulumi.StringPtrInput

	ExecutionControls RemediationConfigurationExecutionControlsPtrInput

	MaximumAutomaticAttempts pulumi.IntPtrInput

	Parameters RemediationConfigurationParameterArrayInput

	ResourceType pulumi.StringPtrInput

	RetryAttemptSeconds pulumi.IntPtrInput

	TargetId pulumi.StringPtrInput

	TargetType pulumi.StringPtrInput

	TargetVersion pulumi.StringPtrInput
}

func (RemediationConfigurationState) ElementType() reflect.Type {
	return reflect.TypeOf((*remediationConfigurationState)(nil)).Elem()
}

type remediationConfigurationArgs struct {

	Automatic *bool `pulumi:"automatic"`

	ConfigRuleName string `pulumi:"configRuleName"`

	ExecutionControls *RemediationConfigurationExecutionControls `pulumi:"executionControls"`

	MaximumAutomaticAttempts *int `pulumi:"maximumAutomaticAttempts"`

	Parameters []RemediationConfigurationParameter `pulumi:"parameters"`

	ResourceType *string `pulumi:"resourceType"`

	RetryAttemptSeconds *int `pulumi:"retryAttemptSeconds"`

	TargetId string `pulumi:"targetId"`

	TargetType string `pulumi:"targetType"`

	TargetVersion *string `pulumi:"targetVersion"`
}

type RemediationConfigurationArgs struct {

	Automatic pulumi.BoolPtrInput

	ConfigRuleName pulumi.StringInput

	ExecutionControls RemediationConfigurationExecutionControlsPtrInput

	MaximumAutomaticAttempts pulumi.IntPtrInput

	Parameters RemediationConfigurationParameterArrayInput

	ResourceType pulumi.StringPtrInput

	RetryAttemptSeconds pulumi.IntPtrInput

	TargetId pulumi.StringInput

	TargetType pulumi.StringInput

	TargetVersion pulumi.StringPtrInput
}

func (RemediationConfigurationArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*remediationConfigurationArgs)(nil)).Elem()
}

type RemediationConfigurationInput interface {
	pulumi.Input

	ToRemediationConfigurationOutput() RemediationConfigurationOutput
	ToRemediationConfigurationOutputWithContext(ctx context.Context) RemediationConfigurationOutput
}

func (*RemediationConfiguration) ElementType() reflect.Type {
	return reflect.TypeOf((**RemediationConfiguration)(nil)).Elem()
}

func (i *RemediationConfiguration) ToRemediationConfigurationOutput() RemediationConfigurationOutput {
	return i.ToRemediationConfigurationOutputWithContext(context.Background())
}

func (i *RemediationConfiguration) ToRemediationConfigurationOutputWithContext(ctx context.Context) RemediationConfigurationOutput {
	return pulumi.ToOutputWithContext(ctx, i).(RemediationConfigurationOutput)
}

type RemediationConfigurationArrayInput interface {
	pulumi.Input

	ToRemediationConfigurationArrayOutput() RemediationConfigurationArrayOutput
	ToRemediationConfigurationArrayOutputWithContext(context.Context) RemediationConfigurationArrayOutput
}

type RemediationConfigurationArray []RemediationConfigurationInput

func (RemediationConfigurationArray) ElementType() reflect.Type {
	return reflect.TypeOf((*[]*RemediationConfiguration)(nil)).Elem()
}

func (i RemediationConfigurationArray) ToRemediationConfigurationArrayOutput() RemediationConfigurationArrayOutput {
	return i.ToRemediationConfigurationArrayOutputWithContext(context.Background())
}

func (i RemediationConfigurationArray) ToRemediationConfigurationArrayOutputWithContext(ctx context.Context) RemediationConfigurationArrayOutput {
	return pulumi.ToOutputWithContext(ctx, i).(RemediationConfigurationArrayOutput)
}

type RemediationConfigurationMapInput interface {
	pulumi.Input

	ToRemediationConfigurationMapOutput() RemediationConfigurationMapOutput
	ToRemediationConfigurationMapOutputWithContext(context.Context) RemediationConfigurationMapOutput
}

type RemediationConfigurationMap map[string]RemediationConfigurationInput

func (RemediationConfigurationMap) ElementType() reflect.Type {
	return reflect.TypeOf((*map[string]*RemediationConfiguration)(nil)).Elem()
}

func (i RemediationConfigurationMap) ToRemediationConfigurationMapOutput() RemediationConfigurationMapOutput {
	return i.ToRemediationConfigurationMapOutputWithContext(context.Background())
}

func (i RemediationConfigurationMap) ToRemediationConfigurationMapOutputWithContext(ctx context.Context) RemediationConfigurationMapOutput {
	return pulumi.ToOutputWithContext(ctx, i).(RemediationConfigurationMapOutput)
}

type RemediationConfigurationOutput struct{ *pulumi.OutputState }

func (RemediationConfigurationOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**RemediationConfiguration)(nil)).Elem()
}

func (o RemediationConfigurationOutput) ToRemediationConfigurationOutput() RemediationConfigurationOutput {
	return o
}

func (o RemediationConfigurationOutput) ToRemediationConfigurationOutputWithContext(ctx context.Context) RemediationConfigurationOutput {
	return o
}

type RemediationConfigurationArrayOutput struct{ *pulumi.OutputState }

func (RemediationConfigurationArrayOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*[]*RemediationConfiguration)(nil)).Elem()
}

func (o RemediationConfigurationArrayOutput) ToRemediationConfigurationArrayOutput() RemediationConfigurationArrayOutput {
	return o
}

func (o RemediationConfigurationArrayOutput) ToRemediationConfigurationArrayOutputWithContext(ctx context.Context) RemediationConfigurationArrayOutput {
	return o
}

func (o RemediationConfigurationArrayOutput) Index(i pulumi.IntInput) RemediationConfigurationOutput {
	return pulumi.All(o, i).ApplyT(func(vs []interface{}) *RemediationConfiguration {
		return vs[0].([]*RemediationConfiguration)[vs[1].(int)]
	}).(RemediationConfigurationOutput)
}

type RemediationConfigurationMapOutput struct{ *pulumi.OutputState }

func (RemediationConfigurationMapOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*map[string]*RemediationConfiguration)(nil)).Elem()
}

func (o RemediationConfigurationMapOutput) ToRemediationConfigurationMapOutput() RemediationConfigurationMapOutput {
	return o
}

func (o RemediationConfigurationMapOutput) ToRemediationConfigurationMapOutputWithContext(ctx context.Context) RemediationConfigurationMapOutput {
	return o
}

func (o RemediationConfigurationMapOutput) MapIndex(k pulumi.StringInput) RemediationConfigurationOutput {
	return pulumi.All(o, k).ApplyT(func(vs []interface{}) *RemediationConfiguration {
		return vs[0].(map[string]*RemediationConfiguration)[vs[1].(string)]
	}).(RemediationConfigurationOutput)
}

func init() {
	pulumi.RegisterInputType(reflect.TypeOf((*RemediationConfigurationInput)(nil)).Elem(), &RemediationConfiguration{})
	pulumi.RegisterInputType(reflect.TypeOf((*RemediationConfigurationArrayInput)(nil)).Elem(), RemediationConfigurationArray{})
	pulumi.RegisterInputType(reflect.TypeOf((*RemediationConfigurationMapInput)(nil)).Elem(), RemediationConfigurationMap{})
	pulumi.RegisterOutputType(RemediationConfigurationOutput{})
	pulumi.RegisterOutputType(RemediationConfigurationArrayOutput{})
	pulumi.RegisterOutputType(RemediationConfigurationMapOutput{})
}
// *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. ***
// *** Do not edit by hand unless you're certain you know what you are doing! ***

package cfg

import (
	"context"
	"reflect"

	"github.com/pkg/errors"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

// Provides an AWS Config Remediation Configuration.
//
// > **Note:** Config Remediation Configuration requires an existing Config Rule to be present.
//
// ## Example Usage
//
// AWS managed rules can be used by setting the source owner to `AWS` and the source identifier to the name of the managed rule. More information about AWS managed rules can be found in the [AWS Config Developer Guide](https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config_use-managed-rules.html).
//
// ```go
// package main
//
// import (
// 	"github.com/pulumi/pulumi-aws/sdk/v4/go/aws/cfg"
// 	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
// )
//
// func main() {
// 	pulumi.Run(func(ctx *pulumi.Context) error {
// 		thisRule, err := cfg.NewRule(ctx, "thisRule", &cfg.RuleArgs{
// 			Source: &cfg.RuleSourceArgs{
// 				Owner:            pulumi.String("AWS"),
// 				SourceIdentifier: pulumi.String("S3_BUCKET_VERSIONING_ENABLED"),
// 			},
// 		})
// 		if err != nil {
// 			return err
// 		}
// 		_, err = cfg.NewRemediationConfiguration(ctx, "thisRemediationConfiguration", &cfg.RemediationConfigurationArgs{
// 			ConfigRuleName: thisRule.Name,
// 			ResourceType:   pulumi.String("AWS::S3::Bucket"),
// 			TargetType:     pulumi.String("SSM_DOCUMENT"),
// 			TargetId:       pulumi.String("AWS-EnableS3BucketEncryption"),
// 			TargetVersion:  pulumi.String("1"),
// 			Parameters: cfg.RemediationConfigurationParameterArray{
// 				&cfg.RemediationConfigurationParameterArgs{
// 					Name:        pulumi.String("AutomationAssumeRole"),
// 					StaticValue: pulumi.String("arn:aws:iam::875924563244:role/security_config"),
// 				},
// 				&cfg.RemediationConfigurationParameterArgs{
// 					Name:          pulumi.String("BucketName"),
// 					ResourceValue: pulumi.String("RESOURCE_ID"),
// 				},
// 				&cfg.RemediationConfigurationParameterArgs{
// 					Name:        pulumi.String("SSEAlgorithm"),
// 					StaticValue: pulumi.String("AES256"),
// 				},
// 			},
// 			Automatic:                pulumi.Bool(true),
// 			MaximumAutomaticAttempts: pulumi.Int(10),
// 			RetryAttemptSeconds:      pulumi.Int(600),
// 			ExecutionControls: &cfg.RemediationConfigurationExecutionControlsArgs{
// 				SsmControls: &cfg.RemediationConfigurationExecutionControlsSsmControlsArgs{
// 					ConcurrentExecutionRatePercentage: pulumi.Int(25),
// 					ErrorPercentage:                   pulumi.Int(20),
// 				},
// 			},
// 		})
// 		if err != nil {
// 			return err
// 		}
// 		return nil
// 	})
// }
// ```
//
// ## Import
//
// Remediation Configurations can be imported using the name config_rule_name, e.g.,
//
// ```sh
//  $ pulumi import aws:cfg/remediationConfiguration:RemediationConfiguration this example
// ```
type RemediationConfiguration struct {
	pulumi.CustomResourceState

	// ARN of the Config Remediation Configuration.
	Arn pulumi.StringOutput `pulumi:"arn"`
	// Remediation is triggered automatically if `true`.
	Automatic pulumi.BoolPtrOutput `pulumi:"automatic"`
	// Name of the AWS Config rule.
	ConfigRuleName pulumi.StringOutput `pulumi:"configRuleName"`
	// Configuration block for execution controls. See below.
	ExecutionControls RemediationConfigurationExecutionControlsPtrOutput `pulumi:"executionControls"`
	// Maximum number of failed attempts for auto-remediation. If you do not select a number, the default is 5.
	MaximumAutomaticAttempts pulumi.IntPtrOutput `pulumi:"maximumAutomaticAttempts"`
	// Can be specified multiple times for each parameter. Each parameter block supports arguments below.
	Parameters RemediationConfigurationParameterArrayOutput `pulumi:"parameters"`
	// Type of resource.
	ResourceType pulumi.StringPtrOutput `pulumi:"resourceType"`
	// Maximum time in seconds that AWS Config runs auto-remediation. If you do not select a number, the default is 60 seconds.
	RetryAttemptSeconds pulumi.IntPtrOutput `pulumi:"retryAttemptSeconds"`
	// Target ID is the name of the public document.
	TargetId pulumi.StringOutput `pulumi:"targetId"`
	// Type of the target. Target executes remediation. For example, SSM document.
	TargetType pulumi.StringOutput `pulumi:"targetType"`
	// Version of the target. For example, version of the SSM document
	TargetVersion pulumi.StringPtrOutput `pulumi:"targetVersion"`
}

// NewRemediationConfiguration registers a new resource with the given unique name, arguments, and options.
func NewRemediationConfiguration(ctx *pulumi.Context,
	name string, args *RemediationConfigurationArgs, opts ...pulumi.ResourceOption) (*RemediationConfiguration, error) {
	if args == nil {
		return nil, errors.New("missing one or more required arguments")
	}

	if args.ConfigRuleName == nil {
		return nil, errors.New("invalid value for required argument 'ConfigRuleName'")
	}
	if args.TargetId == nil {
		return nil, errors.New("invalid value for required argument 'TargetId'")
	}
	if args.TargetType == nil {
		return nil, errors.New("invalid value for required argument 'TargetType'")
	}
	var resource RemediationConfiguration
	err := ctx.RegisterResource("aws:cfg/remediationConfiguration:RemediationConfiguration", name, args, &resource, opts...)
	if err != nil {
		return nil, err
	}
	return &resource, nil
}

// GetRemediationConfiguration gets an existing RemediationConfiguration resource's state with the given name, ID, and optional
// state properties that are used to uniquely qualify the lookup (nil if not required).
func GetRemediationConfiguration(ctx *pulumi.Context,
	name string, id pulumi.IDInput, state *RemediationConfigurationState, opts ...pulumi.ResourceOption) (*RemediationConfiguration, error) {
	var resource RemediationConfiguration
	err := ctx.ReadResource("aws:cfg/remediationConfiguration:RemediationConfiguration", name, id, state, &resource, opts...)
	if err != nil {
		return nil, err
	}
	return &resource, nil
}

// Input properties used for looking up and filtering RemediationConfiguration resources.
type remediationConfigurationState struct {
	// ARN of the Config Remediation Configuration.
	Arn *string `pulumi:"arn"`
	// Remediation is triggered automatically if `true`.
	Automatic *bool `pulumi:"automatic"`
	// Name of the AWS Config rule.
	ConfigRuleName *string `pulumi:"configRuleName"`
	// Configuration block for execution controls. See below.
	ExecutionControls *RemediationConfigurationExecutionControls `pulumi:"executionControls"`
	// Maximum number of failed attempts for auto-remediation. If you do not select a number, the default is 5.
	MaximumAutomaticAttempts *int `pulumi:"maximumAutomaticAttempts"`
	// Can be specified multiple times for each parameter. Each parameter block supports arguments below.
	Parameters []RemediationConfigurationParameter `pulumi:"parameters"`
	// Type of resource.
	ResourceType *string `pulumi:"resourceType"`
	// Maximum time in seconds that AWS Config runs auto-remediation. If you do not select a number, the default is 60 seconds.
	RetryAttemptSeconds *int `pulumi:"retryAttemptSeconds"`
	// Target ID is the name of the public document.
	TargetId *string `pulumi:"targetId"`
	// Type of the target. Target executes remediation. For example, SSM document.
	TargetType *string `pulumi:"targetType"`
	// Version of the target. For example, version of the SSM document
	TargetVersion *string `pulumi:"targetVersion"`
}

type RemediationConfigurationState struct {
	// ARN of the Config Remediation Configuration.
	Arn pulumi.StringPtrInput
	// Remediation is triggered automatically if `true`.
	Automatic pulumi.BoolPtrInput
	// Name of the AWS Config rule.
	ConfigRuleName pulumi.StringPtrInput
	// Configuration block for execution controls. See below.
	ExecutionControls RemediationConfigurationExecutionControlsPtrInput
	// Maximum number of failed attempts for auto-remediation. If you do not select a number, the default is 5.
	MaximumAutomaticAttempts pulumi.IntPtrInput
	// Can be specified multiple times for each parameter. Each parameter block supports arguments below.
	Parameters RemediationConfigurationParameterArrayInput
	// Type of resource.
	ResourceType pulumi.StringPtrInput
	// Maximum time in seconds that AWS Config runs auto-remediation. If you do not select a number, the default is 60 seconds.
	RetryAttemptSeconds pulumi.IntPtrInput
	// Target ID is the name of the public document.
	TargetId pulumi.StringPtrInput
	// Type of the target. Target executes remediation. For example, SSM document.
	TargetType pulumi.StringPtrInput
	// Version of the target. For example, version of the SSM document
	TargetVersion pulumi.StringPtrInput
}

func (RemediationConfigurationState) ElementType() reflect.Type {
	return reflect.TypeOf((*remediationConfigurationState)(nil)).Elem()
}

type remediationConfigurationArgs struct {
	// Remediation is triggered automatically if `true`.
	Automatic *bool `pulumi:"automatic"`
	// Name of the AWS Config rule.
	ConfigRuleName string `pulumi:"configRuleName"`
	// Configuration block for execution controls. See below.
	ExecutionControls *RemediationConfigurationExecutionControls `pulumi:"executionControls"`
	// Maximum number of failed attempts for auto-remediation. If you do not select a number, the default is 5.
	MaximumAutomaticAttempts *int `pulumi:"maximumAutomaticAttempts"`
	// Can be specified multiple times for each parameter. Each parameter block supports arguments below.
	Parameters []RemediationConfigurationParameter `pulumi:"parameters"`
	// Type of resource.
	ResourceType *string `pulumi:"resourceType"`
	// Maximum time in seconds that AWS Config runs auto-remediation. If you do not select a number, the default is 60 seconds.
	RetryAttemptSeconds *int `pulumi:"retryAttemptSeconds"`
	// Target ID is the name of the public document.
	TargetId string `pulumi:"targetId"`
	// Type of the target. Target executes remediation. For example, SSM document.
	TargetType string `pulumi:"targetType"`
	// Version of the target. For example, version of the SSM document
	TargetVersion *string `pulumi:"targetVersion"`
}

// The set of arguments for constructing a RemediationConfiguration resource.
type RemediationConfigurationArgs struct {
	// Remediation is triggered automatically if `true`.
	Automatic pulumi.BoolPtrInput
	// Name of the AWS Config rule.
	ConfigRuleName pulumi.StringInput
	// Configuration block for execution controls. See below.
	ExecutionControls RemediationConfigurationExecutionControlsPtrInput
	// Maximum number of failed attempts for auto-remediation. If you do not select a number, the default is 5.
	MaximumAutomaticAttempts pulumi.IntPtrInput
	// Can be specified multiple times for each parameter. Each parameter block supports arguments below.
	Parameters RemediationConfigurationParameterArrayInput
	// Type of resource.
	ResourceType pulumi.StringPtrInput
	// Maximum time in seconds that AWS Config runs auto-remediation. If you do not select a number, the default is 60 seconds.
	RetryAttemptSeconds pulumi.IntPtrInput
	// Target ID is the name of the public document.
	TargetId pulumi.StringInput
	// Type of the target. Target executes remediation. For example, SSM document.
	TargetType pulumi.StringInput
	// Version of the target. For example, version of the SSM document
	TargetVersion pulumi.StringPtrInput
}

func (RemediationConfigurationArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*remediationConfigurationArgs)(nil)).Elem()
}

type RemediationConfigurationInput interface {
	pulumi.Input

	ToRemediationConfigurationOutput() RemediationConfigurationOutput
	ToRemediationConfigurationOutputWithContext(ctx context.Context) RemediationConfigurationOutput
}

func (*RemediationConfiguration) ElementType() reflect.Type {
	return reflect.TypeOf((**RemediationConfiguration)(nil)).Elem()
}

func (i *RemediationConfiguration) ToRemediationConfigurationOutput() RemediationConfigurationOutput {
	return i.ToRemediationConfigurationOutputWithContext(context.Background())
}

func (i *RemediationConfiguration) ToRemediationConfigurationOutputWithContext(ctx context.Context) RemediationConfigurationOutput {
	return pulumi.ToOutputWithContext(ctx, i).(RemediationConfigurationOutput)
}

// RemediationConfigurationArrayInput is an input type that accepts RemediationConfigurationArray and RemediationConfigurationArrayOutput values.
// You can construct a concrete instance of `RemediationConfigurationArrayInput` via:
//
//          RemediationConfigurationArray{ RemediationConfigurationArgs{...} }
type RemediationConfigurationArrayInput interface {
	pulumi.Input

	ToRemediationConfigurationArrayOutput() RemediationConfigurationArrayOutput
	ToRemediationConfigurationArrayOutputWithContext(context.Context) RemediationConfigurationArrayOutput
}

type RemediationConfigurationArray []RemediationConfigurationInput

func (RemediationConfigurationArray) ElementType() reflect.Type {
	return reflect.TypeOf((*[]*RemediationConfiguration)(nil)).Elem()
}

func (i RemediationConfigurationArray) ToRemediationConfigurationArrayOutput() RemediationConfigurationArrayOutput {
	return i.ToRemediationConfigurationArrayOutputWithContext(context.Background())
}

func (i RemediationConfigurationArray) ToRemediationConfigurationArrayOutputWithContext(ctx context.Context) RemediationConfigurationArrayOutput {
	return pulumi.ToOutputWithContext(ctx, i).(RemediationConfigurationArrayOutput)
}

// RemediationConfigurationMapInput is an input type that accepts RemediationConfigurationMap and RemediationConfigurationMapOutput values.
// You can construct a concrete instance of `RemediationConfigurationMapInput` via:
//
//          RemediationConfigurationMap{ "key": RemediationConfigurationArgs{...} }
type RemediationConfigurationMapInput interface {
	pulumi.Input

	ToRemediationConfigurationMapOutput() RemediationConfigurationMapOutput
	ToRemediationConfigurationMapOutputWithContext(context.Context) RemediationConfigurationMapOutput
}

type RemediationConfigurationMap map[string]RemediationConfigurationInput

func (RemediationConfigurationMap) ElementType() reflect.Type {
	return reflect.TypeOf((*map[string]*RemediationConfiguration)(nil)).Elem()
}

func (i RemediationConfigurationMap) ToRemediationConfigurationMapOutput() RemediationConfigurationMapOutput {
	return i.ToRemediationConfigurationMapOutputWithContext(context.Background())
}

func (i RemediationConfigurationMap) ToRemediationConfigurationMapOutputWithContext(ctx context.Context) RemediationConfigurationMapOutput {
	return pulumi.ToOutputWithContext(ctx, i).(RemediationConfigurationMapOutput)
}

type RemediationConfigurationOutput struct{ *pulumi.OutputState }

func (RemediationConfigurationOutput) ElementType() reflect.Type {
	return reflect.TypeOf((**RemediationConfiguration)(nil)).Elem()
}

func (o RemediationConfigurationOutput) ToRemediationConfigurationOutput() RemediationConfigurationOutput {
	return o
}

func (o RemediationConfigurationOutput) ToRemediationConfigurationOutputWithContext(ctx context.Context) RemediationConfigurationOutput {
	return o
}

type RemediationConfigurationArrayOutput struct{ *pulumi.OutputState }

func (RemediationConfigurationArrayOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*[]*RemediationConfiguration)(nil)).Elem()
}

func (o RemediationConfigurationArrayOutput) ToRemediationConfigurationArrayOutput() RemediationConfigurationArrayOutput {
	return o
}

func (o RemediationConfigurationArrayOutput) ToRemediationConfigurationArrayOutputWithContext(ctx context.Context) RemediationConfigurationArrayOutput {
	return o
}

func (o RemediationConfigurationArrayOutput) Index(i pulumi.IntInput) RemediationConfigurationOutput {
	return pulumi.All(o, i).ApplyT(func(vs []interface{}) *RemediationConfiguration {
		return vs[0].([]*RemediationConfiguration)[vs[1].(int)]
	}).(RemediationConfigurationOutput)
}

type RemediationConfigurationMapOutput struct{ *pulumi.OutputState }

func (RemediationConfigurationMapOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*map[string]*RemediationConfiguration)(nil)).Elem()
}

func (o RemediationConfigurationMapOutput) ToRemediationConfigurationMapOutput() RemediationConfigurationMapOutput {
	return o
}

func (o RemediationConfigurationMapOutput) ToRemediationConfigurationMapOutputWithContext(ctx context.Context) RemediationConfigurationMapOutput {
	return o
}

func (o RemediationConfigurationMapOutput) MapIndex(k pulumi.StringInput) RemediationConfigurationOutput {
	return pulumi.All(o, k).ApplyT(func(vs []interface{}) *RemediationConfiguration {
		return vs[0].(map[string]*RemediationConfiguration)[vs[1].(string)]
	}).(RemediationConfigurationOutput)
}

func init() {
	pulumi.RegisterInputType(reflect.TypeOf((*RemediationConfigurationInput)(nil)).Elem(), &RemediationConfiguration{})
	pulumi.RegisterInputType(reflect.TypeOf((*RemediationConfigurationArrayInput)(nil)).Elem(), RemediationConfigurationArray{})
	pulumi.RegisterInputType(reflect.TypeOf((*RemediationConfigurationMapInput)(nil)).Elem(), RemediationConfigurationMap{})
	pulumi.RegisterOutputType(RemediationConfigurationOutput{})
	pulumi.RegisterOutputType(RemediationConfigurationArrayOutput{})
	pulumi.RegisterOutputType(RemediationConfigurationMapOutput{})
}
