Files
opentf/internal/command/jsonprovider/function.go
2024-07-01 16:41:27 +01:00

115 lines
2.9 KiB
Go

// Copyright (c) The OpenTofu Authors
// SPDX-License-Identifier: MPL-2.0
// Copyright (c) 2023 HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
package jsonprovider
import (
"github.com/opentofu/opentofu/internal/providers"
"github.com/zclconf/go-cty/cty"
)
const (
mapTypeName = "map"
listTypeName = "list"
setTypeName = "set"
tupleTypeName = "tuple"
)
// Function is the top-level object returned when exporting function schemas
type Function struct {
Description string `json:"description"`
Summary string `json:"summary"`
ReturnType any `json:"return_type"`
Parameters []*FunctionParam `json:"parameters,omitempty"`
VariadicParameter *FunctionParam `json:"variadic_parameter,omitempty"`
}
// FunctionParam is the object for wrapping the functions parameters and return types
type FunctionParam struct {
Name string `json:"name"`
Description string `json:"description"`
Type any `json:"type"`
IsNullable *bool `json:"is_nullable,omitempty"`
}
func marshalReturnType(returnType cty.Type) any {
switch {
case returnType.IsObjectType():
return []any{
returnType.FriendlyName(),
returnType.AttributeTypes(),
}
case returnType.IsListType():
return []any{
listTypeName,
returnType.ListElementType(),
}
case returnType.IsMapType():
return []any{
mapTypeName,
returnType.MapElementType(),
}
case returnType.IsSetType():
return []any{
setTypeName,
returnType.SetElementType(),
}
case returnType.IsTupleType():
return []any{
tupleTypeName,
returnType.TupleElementTypes(),
}
default:
return returnType.FriendlyName()
}
}
func marshalParameter(parameter providers.FunctionParameterSpec) *FunctionParam {
var output FunctionParam
output.Description = parameter.Description
output.Name = parameter.Name
output.Type = marshalReturnType(parameter.Type)
if parameter.AllowNullValue {
isNullable := true
output.IsNullable = &isNullable
}
return &output
}
func marshalParameters(parameters []providers.FunctionParameterSpec) []*FunctionParam {
output := make([]*FunctionParam, 0, len(parameters))
for _, parameter := range parameters {
output = append(output, marshalParameter(parameter))
}
return output
}
func marshalFunction(function providers.FunctionSpec) *Function {
var output Function
output.Description = function.Description
output.Summary = function.Summary
output.ReturnType = marshalReturnType(function.Return)
output.Parameters = marshalParameters(function.Parameters)
if function.VariadicParameter != nil {
output.VariadicParameter = marshalParameter(*function.VariadicParameter)
}
return &output
}
func marshalFunctions(functions map[string]providers.FunctionSpec) map[string]*Function {
if functions == nil {
return map[string]*Function{}
}
output := make(map[string]*Function, len(functions))
for k, v := range functions {
output[k] = marshalFunction(v)
}
return output
}