// Code generated by test DO NOT EDIT.
// *** WARNING: Do not edit by hand unless you're certain you know what you are doing! ***

package foo

import (
	"context"
	"reflect"

	"errors"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumix"
	"plain-and-default/foo/internal"
)

type ModuleResource struct {
	pulumi.CustomResourceState

	OptionalBool pulumi.BoolPtrOutput `pulumi:"optionalBool"`
}

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

	if args.OptionalBool == nil {
		args.OptionalBool = pulumi.BoolPtr(true)
	}
	args.OptionalConst = pulumi.StringPtr("val")
	if args.OptionalEnum == nil {
		args.OptionalEnum = EnumThing(8)
	}
	if args.OptionalNumber == nil {
		args.OptionalNumber = pulumi.Float64Ptr(42.0)
	}
	if args.OptionalString == nil {
		args.OptionalString = pulumi.StringPtr("buzzer")
	}
	if args.PlainOptionalBool == nil {
		plainOptionalBool_ := true
		args.PlainOptionalBool = &plainOptionalBool_
	}
	plainOptionalConst_ := "val"
	args.PlainOptionalConst = &plainOptionalConst_
	if args.PlainOptionalNumber == nil {
		plainOptionalNumber_ := 42.0
		args.PlainOptionalNumber = &plainOptionalNumber_
	}
	if args.PlainOptionalString == nil {
		plainOptionalString_ := "buzzer"
		args.PlainOptionalString = &plainOptionalString_
	}
	if internal.IsZero(args.PlainRequiredBool) {
		args.PlainRequiredBool = true
	}
	args.PlainRequiredConst = "val"
	if internal.IsZero(args.PlainRequiredNumber) {
		args.PlainRequiredNumber = 42.0
	}
	if internal.IsZero(args.PlainRequiredString) {
		args.PlainRequiredString = "buzzer"
	}
	if args.RequiredBool == nil {
		args.RequiredBool = pulumi.Bool(true)
	}
	if args.RequiredEnum == nil {
		args.RequiredEnum = EnumThing(4)
	}
	if args.RequiredNumber == nil {
		args.RequiredNumber = pulumi.Float64(42.0)
	}
	if args.RequiredString == nil {
		args.RequiredString = pulumi.String("buzzer")
	}
	opts = internal.PkgResourceDefaultOpts(opts)
	var resource ModuleResource
	err := ctx.RegisterResource("foobar::ModuleResource", name, args, &resource, opts...)
	if err != nil {
		return nil, err
	}
	return &resource, nil
}

// GetModuleResource gets an existing ModuleResource 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 GetModuleResource(ctx *pulumi.Context,
	name string, id pulumi.IDInput, state *ModuleResourceState, opts ...pulumi.ResourceOption) (*ModuleResource, error) {
	var resource ModuleResource
	err := ctx.ReadResource("foobar::ModuleResource", name, id, state, &resource, opts...)
	if err != nil {
		return nil, err
	}
	return &resource, nil
}

// Input properties used for looking up and filtering ModuleResource resources.
type moduleResourceState struct {
}

type ModuleResourceState struct {
}

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

type moduleResourceArgs struct {
	OptionalBool        *bool      `pulumi:"optionalBool"`
	OptionalConst       *string    `pulumi:"optionalConst"`
	OptionalEnum        *EnumThing `pulumi:"optionalEnum"`
	OptionalNumber      *float64   `pulumi:"optionalNumber"`
	OptionalString      *string    `pulumi:"optionalString"`
	PlainOptionalBool   *bool      `pulumi:"plainOptionalBool"`
	PlainOptionalConst  *string    `pulumi:"plainOptionalConst"`
	PlainOptionalNumber *float64   `pulumi:"plainOptionalNumber"`
	PlainOptionalString *string    `pulumi:"plainOptionalString"`
	PlainRequiredBool   bool       `pulumi:"plainRequiredBool"`
	PlainRequiredConst  string     `pulumi:"plainRequiredConst"`
	PlainRequiredNumber float64    `pulumi:"plainRequiredNumber"`
	PlainRequiredString string     `pulumi:"plainRequiredString"`
	RequiredBool        bool       `pulumi:"requiredBool"`
	RequiredEnum        EnumThing  `pulumi:"requiredEnum"`
	RequiredNumber      float64    `pulumi:"requiredNumber"`
	RequiredString      string     `pulumi:"requiredString"`
}

// The set of arguments for constructing a ModuleResource resource.
type ModuleResourceArgs struct {
	OptionalBool        pulumi.BoolPtrInput
	OptionalConst       pulumi.StringPtrInput
	OptionalEnum        EnumThingPtrInput
	OptionalNumber      pulumi.Float64PtrInput
	OptionalString      pulumi.StringPtrInput
	PlainOptionalBool   *bool
	PlainOptionalConst  *string
	PlainOptionalNumber *float64
	PlainOptionalString *string
	PlainRequiredBool   bool
	PlainRequiredConst  string
	PlainRequiredNumber float64
	PlainRequiredString string
	RequiredBool        pulumi.BoolInput
	RequiredEnum        EnumThingInput
	RequiredNumber      pulumi.Float64Input
	RequiredString      pulumi.StringInput
}

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

type ModuleResourceInput interface {
	pulumi.Input

	ToModuleResourceOutput() ModuleResourceOutput
	ToModuleResourceOutputWithContext(ctx context.Context) ModuleResourceOutput
}

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

func (i *ModuleResource) ToModuleResourceOutput() ModuleResourceOutput {
	return i.ToModuleResourceOutputWithContext(context.Background())
}

func (i *ModuleResource) ToModuleResourceOutputWithContext(ctx context.Context) ModuleResourceOutput {
	return pulumi.ToOutputWithContext(ctx, i).(ModuleResourceOutput)
}

func (i *ModuleResource) ToOutput(ctx context.Context) pulumix.Output[*ModuleResource] {
	return pulumix.Output[*ModuleResource]{
		OutputState: i.ToModuleResourceOutputWithContext(ctx).OutputState,
	}
}

type ModuleResourceOutput struct{ *pulumi.OutputState }

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

func (o ModuleResourceOutput) ToModuleResourceOutput() ModuleResourceOutput {
	return o
}

func (o ModuleResourceOutput) ToModuleResourceOutputWithContext(ctx context.Context) ModuleResourceOutput {
	return o
}

func (o ModuleResourceOutput) ToOutput(ctx context.Context) pulumix.Output[*ModuleResource] {
	return pulumix.Output[*ModuleResource]{
		OutputState: o.OutputState,
	}
}

func (o ModuleResourceOutput) OptionalBool() pulumi.BoolPtrOutput {
	return o.ApplyT(func(v *ModuleResource) pulumi.BoolPtrOutput { return v.OptionalBool }).(pulumi.BoolPtrOutput)
}

func init() {
	pulumi.RegisterInputType(reflect.TypeOf((*ModuleResourceInput)(nil)).Elem(), &ModuleResource{})
	pulumi.RegisterOutputType(ModuleResourceOutput{})
}