terraform/internal/command/jsonprovider/attribute.go

72 lines
2.2 KiB
Go

package jsonprovider
import (
"encoding/json"
"github.com/hashicorp/terraform/internal/configs/configschema"
"github.com/zclconf/go-cty/cty"
)
type attribute struct {
AttributeType json.RawMessage `json:"type,omitempty"`
AttributeNestedType *nestedType `json:"nested_type,omitempty"`
Description string `json:"description,omitempty"`
DescriptionKind string `json:"description_kind,omitempty"`
Deprecated bool `json:"deprecated,omitempty"`
Required bool `json:"required,omitempty"`
Optional bool `json:"optional,omitempty"`
Computed bool `json:"computed,omitempty"`
Sensitive bool `json:"sensitive,omitempty"`
}
type nestedType struct {
Attributes map[string]*attribute `json:"attributes,omitempty"`
NestingMode string `json:"nesting_mode,omitempty"`
MinItems uint64 `json:"min_items,omitempty"`
MaxItems uint64 `json:"max_items,omitempty"`
}
func marshalStringKind(sk configschema.StringKind) string {
switch sk {
default:
return "plain"
case configschema.StringMarkdown:
return "markdown"
}
}
func marshalAttribute(attr *configschema.Attribute) *attribute {
ret := &attribute{
Description: attr.Description,
DescriptionKind: marshalStringKind(attr.DescriptionKind),
Required: attr.Required,
Optional: attr.Optional,
Computed: attr.Computed,
Sensitive: attr.Sensitive,
Deprecated: attr.Deprecated,
}
// we're not concerned about errors because at this point the schema has
// already been checked and re-checked.
if attr.Type != cty.NilType {
attrTy, _ := attr.Type.MarshalJSON()
ret.AttributeType = attrTy
}
if attr.NestedType != nil {
nestedTy := nestedType{
MinItems: uint64(attr.NestedType.MinItems),
MaxItems: uint64(attr.NestedType.MaxItems),
NestingMode: nestingModeString(attr.NestedType.Nesting),
}
attrs := make(map[string]*attribute, len(attr.NestedType.Attributes))
for k, attr := range attr.NestedType.Attributes {
attrs[k] = marshalAttribute(attr)
}
nestedTy.Attributes = attrs
ret.AttributeNestedType = &nestedTy
}
return ret
}