@@ -50,43 +50,13 @@ func WorkspaceTags(modules terraform.Modules, files map[string]*hcl.File) (types
5050
5151 var tags []types.Tag
5252 for _ , item := range tagsObj .Items {
53- key , kdiags := item .KeyExpr .Value (evCtx )
54- val , vdiags := item .ValueExpr .Value (evCtx )
55-
56- // TODO: what do do with the diags?
57- if kdiags .HasErrors () {
58- key = cty .UnknownVal (cty .String )
59- }
60- if vdiags .HasErrors () {
61- val = cty .UnknownVal (cty .String )
62- }
63-
64- if key .IsKnown () && key .Type () != cty .String {
65- r := item .KeyExpr .Range ()
66- diags = diags .Append (& hcl.Diagnostic {
67- Severity : hcl .DiagError ,
68- Summary : "Invalid key type for tags" ,
69- Detail : fmt .Sprintf ("Key must be a string, but got %s" , key .Type ().FriendlyName ()),
70- Subject : & r ,
71- Context : & tagsObj .SrcRange ,
72- Expression : item .KeyExpr ,
73- EvalContext : evCtx ,
74- })
53+ tag , tagDiag := NewTag (tagsObj , files , item , evCtx )
54+ if tagDiag != nil {
55+ diags = diags .Append (tagDiag )
7556 continue
7657 }
7758
78- safe , err := source (item .KeyExpr .Range (), files )
79- if err != nil {
80- safe = []byte ("???" ) // we could do more here
81- }
82-
83- tags = append (tags , types.Tag {
84- Key : key ,
85- SafeKeyID : string (safe ),
86- KeyExpr : item .KeyExpr ,
87- Value : val ,
88- ValueExpr : item .ValueExpr ,
89- })
59+ tags = append (tags , tag )
9060 }
9161 tagBlocks = append (tagBlocks , types.TagBlock {
9262 Tags : tags ,
@@ -97,3 +67,71 @@ func WorkspaceTags(modules terraform.Modules, files map[string]*hcl.File) (types
9767
9868 return tagBlocks , diags
9969}
70+
71+ // NewTag creates a workspace tag from its hcl expression.
72+ func NewTag (block * hclsyntax.ObjectConsExpr , files map [string ]* hcl.File , expr hclsyntax.ObjectConsItem , evCtx * hcl.EvalContext ) (types.Tag , * hcl.Diagnostic ) {
73+ key , kdiags := expr .KeyExpr .Value (evCtx )
74+ val , vdiags := expr .ValueExpr .Value (evCtx )
75+
76+ // TODO: ???
77+
78+ //if kdiags.HasErrors() {
79+ // key = cty.UnknownVal(cty.String)
80+ //}
81+ //if vdiags.HasErrors() {
82+ // val = cty.UnknownVal(cty.String)
83+ //}
84+
85+ if key .IsKnown () && key .Type () != cty .String {
86+ r := expr .KeyExpr .Range ()
87+ return types.Tag {}, & hcl.Diagnostic {
88+ Severity : hcl .DiagError ,
89+ Summary : "Invalid key type for tags" ,
90+ Detail : fmt .Sprintf ("Key must be a string, but got %s" , key .Type ().FriendlyName ()),
91+ Subject : & r ,
92+ Context : & block .SrcRange ,
93+ Expression : expr .KeyExpr ,
94+ EvalContext : evCtx ,
95+ }
96+ }
97+
98+ if val .IsKnown () && val .Type () != cty .String {
99+ r := expr .ValueExpr .Range ()
100+ return types.Tag {}, & hcl.Diagnostic {
101+ Severity : hcl .DiagError ,
102+ Summary : "Invalid value type for tag" ,
103+ Detail : fmt .Sprintf ("Value must be a string, but got %s" , val .Type ().FriendlyName ()),
104+ Subject : & r ,
105+ Context : & block .SrcRange ,
106+ Expression : expr .ValueExpr ,
107+ EvalContext : evCtx ,
108+ }
109+ }
110+
111+ tag := types.Tag {
112+ Key : types.HCLString {
113+ Value : key ,
114+ ValueDiags : kdiags ,
115+ ValueExpr : expr .KeyExpr ,
116+ },
117+ Value : types.HCLString {
118+ Value : val ,
119+ ValueDiags : vdiags ,
120+ ValueExpr : expr .ValueExpr ,
121+ },
122+ }
123+
124+ ks , err := source (expr .KeyExpr .Range (), files )
125+ if err == nil {
126+ src := string (ks )
127+ tag .Key .Source = & src
128+ }
129+
130+ vs , err := source (expr .ValueExpr .Range (), files )
131+ if err == nil {
132+ src := string (vs )
133+ tag .Value .Source = & src
134+ }
135+
136+ return tag , nil
137+ }
0 commit comments