@@ -2,7 +2,9 @@ package command
2
2
3
3
import (
4
4
"bytes"
5
+ "encoding/json"
5
6
"fmt"
7
+ tfversion "github.com/hashicorp/terraform/version"
6
8
"strings"
7
9
8
10
"github.com/hashicorp/terraform/internal/tfdiags"
@@ -14,11 +16,25 @@ type WorkspaceListCommand struct {
14
16
LegacyName bool
15
17
}
16
18
19
+ type WorkspaceList struct {
20
+ Name string `json:"name"`
21
+ Selected bool `json:"selected"`
22
+ }
23
+
24
+ type WorkspaceListOutput struct {
25
+ TerraformVersion string `json:"terraform_version"`
26
+ WorkspaceList []WorkspaceList `json:"workspaces"`
27
+ IsOverridden bool `json:"is_overridden"`
28
+ OverriddenNote string `json:"overridden_note"`
29
+ }
30
+
17
31
func (c * WorkspaceListCommand ) Run (args []string ) int {
18
32
args = c .Meta .process (args )
19
33
envCommandShowWarning (c .Ui , c .LegacyName )
20
34
21
35
cmdFlags := c .Meta .defaultFlagSet ("workspace list" )
36
+ var jsonOutput bool
37
+ cmdFlags .BoolVar (& jsonOutput , "json" , false , "produce JSON output" )
22
38
cmdFlags .Usage = func () { c .Ui .Error (c .Help ()) }
23
39
if err := cmdFlags .Parse (args ); err != nil {
24
40
c .Ui .Error (fmt .Sprintf ("Error parsing command-line flags: %s\n " , err .Error ()))
@@ -62,6 +78,31 @@ func (c *WorkspaceListCommand) Run(args []string) int {
62
78
63
79
env , isOverridden := c .WorkspaceOverridden ()
64
80
81
+ // If json
82
+ if jsonOutput == true {
83
+ var wsOutput WorkspaceListOutput
84
+ wsOutput .TerraformVersion = tfversion .String ()
85
+ wsOutput .IsOverridden = isOverridden
86
+ if isOverridden {
87
+ wsOutput .OverriddenNote = envIsOverriddenNote
88
+ }
89
+
90
+ for _ , s := range states {
91
+ ws := WorkspaceList {Name : s , Selected : s == env }
92
+ wsOutput .WorkspaceList = append (wsOutput .WorkspaceList , ws )
93
+ }
94
+
95
+ jsonOutput , err := json .Marshal (wsOutput )
96
+
97
+ if err != nil {
98
+ c .Ui .Error (fmt .Sprintf ("Failed to marshal workspace list to json: %s" , err ))
99
+ return 1
100
+ }
101
+ c .Ui .Output (string (jsonOutput ))
102
+ return 0
103
+ }
104
+
105
+ // If not json
65
106
var out bytes.Buffer
66
107
for _ , s := range states {
67
108
if s == env {
@@ -91,10 +132,14 @@ func (c *WorkspaceListCommand) AutocompleteFlags() complete.Flags {
91
132
92
133
func (c * WorkspaceListCommand ) Help () string {
93
134
helpText := `
94
- Usage: terraform [global options] workspace list
135
+ Usage: terraform [global options] workspace list [options]
95
136
96
137
List Terraform workspaces.
97
138
139
+ Options:
140
+
141
+ -json If specified, output to a machine-readable form.
142
+
98
143
`
99
144
return strings .TrimSpace (helpText )
100
145
}
0 commit comments