2023-05-02 10:33:06 -05:00
|
|
|
// Copyright (c) HashiCorp, Inc.
|
|
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
|
2023-02-14 08:08:47 -06:00
|
|
|
package command
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
"github.com/hashicorp/terraform/internal/command/jsonfunction"
|
|
|
|
"github.com/hashicorp/terraform/internal/lang"
|
|
|
|
"github.com/zclconf/go-cty/cty/function"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
ignoredFunctions = []string{"map", "list"}
|
|
|
|
)
|
|
|
|
|
|
|
|
// MetadataFunctionsCommand is a Command implementation that prints out information
|
|
|
|
// about the available functions in Terraform.
|
|
|
|
type MetadataFunctionsCommand struct {
|
|
|
|
Meta
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *MetadataFunctionsCommand) Help() string {
|
|
|
|
return metadataFunctionsCommandHelp
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *MetadataFunctionsCommand) Synopsis() string {
|
|
|
|
return "Show signatures and descriptions for the available functions"
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *MetadataFunctionsCommand) Run(args []string) int {
|
|
|
|
args = c.Meta.process(args)
|
|
|
|
cmdFlags := c.Meta.defaultFlagSet("metadata functions")
|
|
|
|
var jsonOutput bool
|
|
|
|
cmdFlags.BoolVar(&jsonOutput, "json", false, "produce JSON output")
|
|
|
|
|
|
|
|
cmdFlags.Usage = func() { c.Ui.Error(c.Help()) }
|
|
|
|
if err := cmdFlags.Parse(args); err != nil {
|
|
|
|
c.Ui.Error(fmt.Sprintf("Error parsing command-line flags: %s\n", err.Error()))
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
|
|
|
|
if !jsonOutput {
|
|
|
|
c.Ui.Error(
|
|
|
|
"The `terraform metadata functions` command requires the `-json` flag.\n")
|
|
|
|
cmdFlags.Usage()
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
|
|
|
|
scope := &lang.Scope{}
|
|
|
|
funcs := scope.Functions()
|
|
|
|
filteredFuncs := make(map[string]function.Function)
|
|
|
|
for k, v := range funcs {
|
|
|
|
if isIgnoredFunction(k) {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
filteredFuncs[k] = v
|
|
|
|
}
|
|
|
|
|
|
|
|
jsonFunctions, marshalDiags := jsonfunction.Marshal(filteredFuncs)
|
|
|
|
if marshalDiags.HasErrors() {
|
|
|
|
c.showDiagnostics(marshalDiags)
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
c.Ui.Output(string(jsonFunctions))
|
|
|
|
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
|
|
|
const metadataFunctionsCommandHelp = `
|
|
|
|
Usage: terraform [global options] metadata functions -json
|
|
|
|
|
|
|
|
Prints out a json representation of the available function signatures.
|
|
|
|
`
|
|
|
|
|
|
|
|
func isIgnoredFunction(name string) bool {
|
|
|
|
for _, i := range ignoredFunctions {
|
|
|
|
if i == name {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|