[codegen] Add support for default values in enum properties (#6017)
This commit is contained in:
parent
b8e31446d1
commit
0f9273fc7b
|
@ -597,11 +597,35 @@ func primitiveValue(value interface{}) (string, error) {
|
||||||
func (mod *modContext) getDefaultValue(dv *schema.DefaultValue, t schema.Type) (string, error) {
|
func (mod *modContext) getDefaultValue(dv *schema.DefaultValue, t schema.Type) (string, error) {
|
||||||
var val string
|
var val string
|
||||||
if dv.Value != nil {
|
if dv.Value != nil {
|
||||||
v, err := primitiveValue(dv.Value)
|
switch enum := t.(type) {
|
||||||
if err != nil {
|
case *schema.EnumType:
|
||||||
return "", err
|
enumName := tokenToName(enum.Token)
|
||||||
|
for _, e := range enum.Elements {
|
||||||
|
if e.Value != dv.Value {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
elName := e.Name
|
||||||
|
if elName == "" {
|
||||||
|
elName = fmt.Sprintf("%v", e.Value)
|
||||||
|
}
|
||||||
|
safeName, err := makeSafeEnumName(elName, enumName)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
val = fmt.Sprintf("%s.%s.%s", mod.namespaceName, enumName, safeName)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if val == "" {
|
||||||
|
return "", errors.Errorf("default value '%v' not found in enum '%s'", dv.Value, enumName)
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
v, err := primitiveValue(dv.Value)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
val = v
|
||||||
}
|
}
|
||||||
val = v
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(dv.Environment) != 0 {
|
if len(dv.Environment) != 0 {
|
||||||
|
|
|
@ -26,6 +26,7 @@ namespace Pulumi.PlantProvider.Inputs
|
||||||
|
|
||||||
public ContainerArgs()
|
public ContainerArgs()
|
||||||
{
|
{
|
||||||
|
Brightness = Pulumi.PlantProvider.ContainerBrightness.One;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,6 +77,7 @@ namespace Pulumi.PlantProvider.Tree.V1
|
||||||
|
|
||||||
public RubberTreeArgs()
|
public RubberTreeArgs()
|
||||||
{
|
{
|
||||||
|
Farm = "(unknown)";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,9 @@ func NewRubberTree(ctx *pulumi.Context,
|
||||||
return nil, errors.New("missing one or more required arguments")
|
return nil, errors.New("missing one or more required arguments")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if args.Farm == nil {
|
||||||
|
args.Farm = pulumi.StringPtr("(unknown)")
|
||||||
|
}
|
||||||
var resource RubberTree
|
var resource RubberTree
|
||||||
err := ctx.RegisterResource("plant-provider:tree/v1:RubberTree", name, args, &resource, opts...)
|
err := ctx.RegisterResource("plant-provider:tree/v1:RubberTree", name, args, &resource, opts...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -50,7 +50,7 @@ export class RubberTree extends pulumi.CustomResource {
|
||||||
throw new Error("Missing required property 'type'");
|
throw new Error("Missing required property 'type'");
|
||||||
}
|
}
|
||||||
inputs["container"] = args ? args.container : undefined;
|
inputs["container"] = args ? args.container : undefined;
|
||||||
inputs["farm"] = args ? args.farm : undefined;
|
inputs["farm"] = (args ? args.farm : undefined) || "(unknown)";
|
||||||
inputs["type"] = args ? args.type : undefined;
|
inputs["type"] = args ? args.type : undefined;
|
||||||
} else {
|
} else {
|
||||||
inputs["container"] = undefined /*out*/;
|
inputs["container"] = undefined /*out*/;
|
||||||
|
|
|
@ -21,6 +21,8 @@ class ContainerArgs:
|
||||||
color: Optional[pulumi.Input[Union['ContainerColor', str]]] = None,
|
color: Optional[pulumi.Input[Union['ContainerColor', str]]] = None,
|
||||||
material: Optional[pulumi.Input[str]] = None):
|
material: Optional[pulumi.Input[str]] = None):
|
||||||
pulumi.set(__self__, "size", size)
|
pulumi.set(__self__, "size", size)
|
||||||
|
if brightness is None:
|
||||||
|
brightness = 1
|
||||||
if brightness is not None:
|
if brightness is not None:
|
||||||
pulumi.set(__self__, "brightness", brightness)
|
pulumi.set(__self__, "brightness", brightness)
|
||||||
if color is not None:
|
if color is not None:
|
||||||
|
|
|
@ -21,6 +21,8 @@ class Container(dict):
|
||||||
color: Optional[str] = None,
|
color: Optional[str] = None,
|
||||||
material: Optional[str] = None):
|
material: Optional[str] = None):
|
||||||
pulumi.set(__self__, "size", size)
|
pulumi.set(__self__, "size", size)
|
||||||
|
if brightness is None:
|
||||||
|
brightness = 1
|
||||||
if brightness is not None:
|
if brightness is not None:
|
||||||
pulumi.set(__self__, "brightness", brightness)
|
pulumi.set(__self__, "brightness", brightness)
|
||||||
if color is not None:
|
if color is not None:
|
||||||
|
|
|
@ -48,6 +48,8 @@ class RubberTree(pulumi.CustomResource):
|
||||||
__props__ = dict()
|
__props__ = dict()
|
||||||
|
|
||||||
__props__['container'] = container
|
__props__['container'] = container
|
||||||
|
if farm is None:
|
||||||
|
farm = '(unknown)'
|
||||||
__props__['farm'] = farm
|
__props__['farm'] = farm
|
||||||
if type is None and not opts.urn:
|
if type is None and not opts.urn:
|
||||||
raise TypeError("Missing required property 'type'")
|
raise TypeError("Missing required property 'type'")
|
||||||
|
|
|
@ -14,7 +14,8 @@
|
||||||
"oneOf": [
|
"oneOf": [
|
||||||
{"$ref": "#/types/plant-provider:tree/v1:Farm"},
|
{"$ref": "#/types/plant-provider:tree/v1:Farm"},
|
||||||
{"type": "string"}
|
{"type": "string"}
|
||||||
]
|
],
|
||||||
|
"default": "(unknown)"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"properties": {
|
"properties": {
|
||||||
|
@ -52,7 +53,8 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"brightness": {
|
"brightness": {
|
||||||
"$ref": "#/types/plant-provider::ContainerBrightness"
|
"$ref": "#/types/plant-provider::ContainerBrightness",
|
||||||
|
"default": 1.0
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"required": ["size"]
|
"required": ["size"]
|
||||||
|
|
|
@ -1281,6 +1281,21 @@ func bindDefaultValue(value interface{}, spec *DefaultSpec, typ Type) (*DefaultV
|
||||||
}
|
}
|
||||||
|
|
||||||
if value != nil {
|
if value != nil {
|
||||||
|
switch typ := typ.(type) {
|
||||||
|
case *UnionType:
|
||||||
|
if typ.DefaultType != nil {
|
||||||
|
return bindDefaultValue(value, spec, typ.DefaultType)
|
||||||
|
}
|
||||||
|
for _, elementType := range typ.ElementTypes {
|
||||||
|
v, err := bindDefaultValue(value, spec, elementType)
|
||||||
|
if err == nil {
|
||||||
|
return v, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case *EnumType:
|
||||||
|
return bindDefaultValue(value, spec, typ.ElementType)
|
||||||
|
}
|
||||||
|
|
||||||
switch typ {
|
switch typ {
|
||||||
case BoolType:
|
case BoolType:
|
||||||
if _, ok := value.(bool); !ok {
|
if _, ok := value.(bool); !ok {
|
||||||
|
@ -1519,6 +1534,11 @@ func bindTypes(pkg *Package, complexTypes map[string]ComplexTypeSpec, loader Loa
|
||||||
typ := &EnumType{Token: token}
|
typ := &EnumType{Token: token}
|
||||||
typs.enums[token] = typ
|
typs.enums[token] = typ
|
||||||
typs.named[token] = typ
|
typs.named[token] = typ
|
||||||
|
|
||||||
|
// Bind enums before object types because object type generation depends on enum values to be present.
|
||||||
|
if err := typs.bindEnumTypeDetails(typs.enums[token], token, spec); err != nil {
|
||||||
|
return nil, errors.Wrapf(err, "failed to bind type %s", token)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1527,16 +1547,12 @@ func bindTypes(pkg *Package, complexTypes map[string]ComplexTypeSpec, loader Loa
|
||||||
typs.resources[r.Token] = &ResourceType{Token: r.Token}
|
typs.resources[r.Token] = &ResourceType{Token: r.Token}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Process properties.
|
// Process object types.
|
||||||
for token, spec := range complexTypes {
|
for token, spec := range complexTypes {
|
||||||
if spec.Type == "object" {
|
if spec.Type == "object" {
|
||||||
if err := typs.bindObjectTypeDetails(typs.objects[token], token, spec.ObjectTypeSpec); err != nil {
|
if err := typs.bindObjectTypeDetails(typs.objects[token], token, spec.ObjectTypeSpec); err != nil {
|
||||||
return nil, errors.Wrapf(err, "failed to bind type %s", token)
|
return nil, errors.Wrapf(err, "failed to bind type %s", token)
|
||||||
}
|
}
|
||||||
} else if len(spec.Enum) > 0 {
|
|
||||||
if err := typs.bindEnumTypeDetails(typs.enums[token], token, spec); err != nil {
|
|
||||||
return nil, errors.Wrapf(err, "failed to bind type %s", token)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue