| // Copyright (c) HashiCorp, Inc. | |
| // SPDX-License-Identifier: MPL-2.0 | |
| package tfjson | |
| import ( | |
| "encoding/json" | |
| "errors" | |
| "fmt" | |
| "github.com/hashicorp/go-version" | |
| "github.com/zclconf/go-cty/cty" | |
| ) | |
| // MetadataFunctionsFormatVersionConstraints defines the versions of the JSON | |
| // metadata functions format that are supported by this package. | |
| var MetadataFunctionsFormatVersionConstraints = "~> 1.0" | |
| // MetadataFunctions is the top-level object returned when exporting function | |
| // signatures | |
| type MetadataFunctions struct { | |
| // The version of the format. This should always match the | |
| // MetadataFunctionsFormatVersionConstraints in this package, else | |
| // unmarshaling will fail. | |
| FormatVersion string `json:"format_version"` | |
| // The signatures of the functions available in a Terraform version. | |
| Signatures map[string]*FunctionSignature `json:"function_signatures,omitempty"` | |
| } | |
| // Validate checks to ensure that MetadataFunctions is present, and the | |
| // version matches the version supported by this library. | |
| func (f *MetadataFunctions) Validate() error { | |
| if f == nil { | |
| return errors.New("metadata functions data is nil") | |
| } | |
| if f.FormatVersion == "" { | |
| return errors.New("unexpected metadata functions data, format version is missing") | |
| } | |
| constraint, err := version.NewConstraint(MetadataFunctionsFormatVersionConstraints) | |
| if err != nil { | |
| return fmt.Errorf("invalid version constraint: %w", err) | |
| } | |
| version, err := version.NewVersion(f.FormatVersion) | |
| if err != nil { | |
| return fmt.Errorf("invalid format version %q: %w", f.FormatVersion, err) | |
| } | |
| if !constraint.Check(version) { | |
| return fmt.Errorf("unsupported metadata functions format version: %q does not satisfy %q", | |
| version, constraint) | |
| } | |
| return nil | |
| } | |
| func (f *MetadataFunctions) UnmarshalJSON(b []byte) error { | |
| type rawFunctions MetadataFunctions | |
| var functions rawFunctions | |
| err := json.Unmarshal(b, &functions) | |
| if err != nil { | |
| return err | |
| } | |
| *f = *(*MetadataFunctions)(&functions) | |
| return f.Validate() | |
| } | |
| // FunctionSignature represents a function signature. | |
| type FunctionSignature struct { | |
| // Description is an optional human-readable description | |
| // of the function | |
| Description string `json:"description,omitempty"` | |
| // Summary is an optional shortened description of the function | |
| Summary string `json:"summary,omitempty"` | |
| // DeprecationMessage is an optional message that indicates that the | |
| // function should be considered deprecated and what actions should be | |
| // performed by the practitioner to handle the deprecation. | |
| DeprecationMessage string `json:"deprecation_message,omitempty"` | |
| // ReturnType is the ctyjson representation of the function's | |
| // return types based on supplying all parameters using | |
| // dynamic types. Functions can have dynamic return types. | |
| ReturnType cty.Type `json:"return_type"` | |
| // Parameters describes the function's fixed positional parameters. | |
| Parameters []*FunctionParameter `json:"parameters,omitempty"` | |
| // VariadicParameter describes the function's variadic | |
| // parameter if it is supported. | |
| VariadicParameter *FunctionParameter `json:"variadic_parameter,omitempty"` | |
| } | |
| // FunctionParameter represents a parameter to a function. | |
| type FunctionParameter struct { | |
| // Name is an optional name for the argument. | |
| Name string `json:"name,omitempty"` | |
| // Description is an optional human-readable description | |
| // of the argument | |
| Description string `json:"description,omitempty"` | |
| // IsNullable is true if null is acceptable value for the argument | |
| IsNullable bool `json:"is_nullable,omitempty"` | |
| // A type that any argument for this parameter must conform to. | |
| Type cty.Type `json:"type"` | |
| } |