mirror of
https://github.com/opentffoundation/opentf.git
synced 2025-12-19 17:59:05 -05:00
115 lines
2.9 KiB
Go
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
|
|
}
|