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

package example

import (
	"context"
	"reflect"

	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
	"resource-args-python/example/internal"
)

type Person struct {
	pulumi.CustomResourceState

	Name pulumi.StringPtrOutput `pulumi:"name"`
	Pets PetTypeArrayOutput     `pulumi:"pets"`
}

// NewPerson registers a new resource with the given unique name, arguments, and options.
func NewPerson(ctx *pulumi.Context,
	name string, args *PersonArgs, opts ...pulumi.ResourceOption) (*Person, error) {
	if args == nil {
		args = &PersonArgs{}
	}

	opts = internal.PkgResourceDefaultOpts(opts)
	var resource Person
	err := ctx.RegisterResource("example::Person", name, args, &resource, opts...)
	if err != nil {
		return nil, err
	}
	return &resource, nil
}

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

// Input properties used for looking up and filtering Person resources.
type personState struct {
}

type PersonState struct {
}

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

type personArgs struct {
	Name *string   `pulumi:"name"`
	Pets []PetType `pulumi:"pets"`
}

// The set of arguments for constructing a Person resource.
type PersonArgs struct {
	Name pulumi.StringPtrInput
	Pets PetTypeArrayInput
}

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

type PersonInput interface {
	pulumi.Input

	ToPersonOutput() PersonOutput
	ToPersonOutputWithContext(ctx context.Context) PersonOutput
}

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

func (i *Person) ToPersonOutput() PersonOutput {
	return i.ToPersonOutputWithContext(context.Background())
}

func (i *Person) ToPersonOutputWithContext(ctx context.Context) PersonOutput {
	return pulumi.ToOutputWithContext(ctx, i).(PersonOutput)
}

// PersonArrayInput is an input type that accepts PersonArray and PersonArrayOutput values.
// You can construct a concrete instance of `PersonArrayInput` via:
//
//	PersonArray{ PersonArgs{...} }
type PersonArrayInput interface {
	pulumi.Input

	ToPersonArrayOutput() PersonArrayOutput
	ToPersonArrayOutputWithContext(context.Context) PersonArrayOutput
}

type PersonArray []PersonInput

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

func (i PersonArray) ToPersonArrayOutput() PersonArrayOutput {
	return i.ToPersonArrayOutputWithContext(context.Background())
}

func (i PersonArray) ToPersonArrayOutputWithContext(ctx context.Context) PersonArrayOutput {
	return pulumi.ToOutputWithContext(ctx, i).(PersonArrayOutput)
}

// PersonMapInput is an input type that accepts PersonMap and PersonMapOutput values.
// You can construct a concrete instance of `PersonMapInput` via:
//
//	PersonMap{ "key": PersonArgs{...} }
type PersonMapInput interface {
	pulumi.Input

	ToPersonMapOutput() PersonMapOutput
	ToPersonMapOutputWithContext(context.Context) PersonMapOutput
}

type PersonMap map[string]PersonInput

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

func (i PersonMap) ToPersonMapOutput() PersonMapOutput {
	return i.ToPersonMapOutputWithContext(context.Background())
}

func (i PersonMap) ToPersonMapOutputWithContext(ctx context.Context) PersonMapOutput {
	return pulumi.ToOutputWithContext(ctx, i).(PersonMapOutput)
}

type PersonOutput struct{ *pulumi.OutputState }

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

func (o PersonOutput) ToPersonOutput() PersonOutput {
	return o
}

func (o PersonOutput) ToPersonOutputWithContext(ctx context.Context) PersonOutput {
	return o
}

func (o PersonOutput) Name() pulumi.StringPtrOutput {
	return o.ApplyT(func(v *Person) pulumi.StringPtrOutput { return v.Name }).(pulumi.StringPtrOutput)
}

func (o PersonOutput) Pets() PetTypeArrayOutput {
	return o.ApplyT(func(v *Person) PetTypeArrayOutput { return v.Pets }).(PetTypeArrayOutput)
}

type PersonArrayOutput struct{ *pulumi.OutputState }

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

func (o PersonArrayOutput) ToPersonArrayOutput() PersonArrayOutput {
	return o
}

func (o PersonArrayOutput) ToPersonArrayOutputWithContext(ctx context.Context) PersonArrayOutput {
	return o
}

func (o PersonArrayOutput) Index(i pulumi.IntInput) PersonOutput {
	return pulumi.All(o, i).ApplyT(func(vs []interface{}) *Person {
		return vs[0].([]*Person)[vs[1].(int)]
	}).(PersonOutput)
}

type PersonMapOutput struct{ *pulumi.OutputState }

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

func (o PersonMapOutput) ToPersonMapOutput() PersonMapOutput {
	return o
}

func (o PersonMapOutput) ToPersonMapOutputWithContext(ctx context.Context) PersonMapOutput {
	return o
}

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

func init() {
	pulumi.RegisterInputType(reflect.TypeOf((*PersonInput)(nil)).Elem(), &Person{})
	pulumi.RegisterInputType(reflect.TypeOf((*PersonArrayInput)(nil)).Elem(), PersonArray{})
	pulumi.RegisterInputType(reflect.TypeOf((*PersonMapInput)(nil)).Elem(), PersonMap{})
	pulumi.RegisterOutputType(PersonOutput{})
	pulumi.RegisterOutputType(PersonArrayOutput{})
	pulumi.RegisterOutputType(PersonMapOutput{})
}