| // 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 | |
| } |