@@ -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