@@ -308,6 +308,8 @@ func SetResource(
308
308
setCfg ,
309
309
sourceAdaptedVarName ,
310
310
sourceMemberShapeRef ,
311
+ f .Names .Camel ,
312
+ opType ,
311
313
indentLevel + 1 ,
312
314
)
313
315
out += setResourceForScalar (
@@ -578,6 +580,8 @@ func setResourceReadMany(
578
580
setCfg ,
579
581
sourceAdaptedVarName ,
580
582
sourceMemberShapeRef ,
583
+ f .Names .Camel ,
584
+ model .OpTypeList ,
581
585
indentLevel + 2 ,
582
586
)
583
587
out += setResourceForScalar (
@@ -1156,6 +1160,9 @@ func setResourceForContainer(
1156
1160
sourceVarName string ,
1157
1161
// ShapeRef of the source struct field
1158
1162
sourceShapeRef * awssdkmodel.ShapeRef ,
1163
+ // targetFieldPath is the field path for the target containing field
1164
+ targetFieldPath string ,
1165
+ op model.OpType ,
1159
1166
indentLevel int ,
1160
1167
) string {
1161
1168
switch sourceShapeRef .Shape .Type {
@@ -1168,6 +1175,8 @@ func setResourceForContainer(
1168
1175
targetSetCfg ,
1169
1176
sourceVarName ,
1170
1177
sourceShapeRef ,
1178
+ targetFieldPath ,
1179
+ op ,
1171
1180
indentLevel ,
1172
1181
)
1173
1182
case "list" :
@@ -1179,6 +1188,8 @@ func setResourceForContainer(
1179
1188
targetSetCfg ,
1180
1189
sourceVarName ,
1181
1190
sourceShapeRef ,
1191
+ targetFieldPath ,
1192
+ op ,
1182
1193
indentLevel ,
1183
1194
)
1184
1195
case "map" :
@@ -1190,6 +1201,8 @@ func setResourceForContainer(
1190
1201
targetSetCfg ,
1191
1202
sourceVarName ,
1192
1203
sourceShapeRef ,
1204
+ targetFieldPath ,
1205
+ op ,
1193
1206
indentLevel ,
1194
1207
)
1195
1208
default :
@@ -1219,15 +1232,21 @@ func SetResourceForStruct(
1219
1232
sourceVarName string ,
1220
1233
// ShapeRef of the source struct field
1221
1234
sourceShapeRef * awssdkmodel.ShapeRef ,
1235
+ // targetFieldPath is the field path to targetFieldName
1236
+ targetFieldPath string ,
1237
+ op model.OpType ,
1222
1238
indentLevel int ,
1223
1239
) string {
1224
1240
out := ""
1225
1241
indent := strings .Repeat ("\t " , indentLevel )
1226
1242
sourceShape := sourceShapeRef .Shape
1227
1243
targetShape := targetShapeRef .Shape
1228
1244
1245
+ var sourceMemberShapeRef * awssdkmodel.ShapeRef
1246
+ var sourceAdaptedVarName , qualifiedTargetVar string
1247
+
1229
1248
for _ , targetMemberName := range targetShape .MemberNames () {
1230
- sourceMemberShapeRef : = sourceShape .MemberRefs [targetMemberName ]
1249
+ sourceMemberShapeRef = sourceShape .MemberRefs [targetMemberName ]
1231
1250
if sourceMemberShapeRef == nil {
1232
1251
continue
1233
1252
}
@@ -1244,13 +1263,14 @@ func SetResourceForStruct(
1244
1263
indexedVarName := fmt .Sprintf ("%sf%d" , targetVarName , sourceMemberIndex )
1245
1264
sourceMemberShape := sourceMemberShapeRef .Shape
1246
1265
targetMemberCleanNames := names .New (targetMemberName )
1247
- sourceAdaptedVarName : = sourceVarName + "." + targetMemberName
1266
+ sourceAdaptedVarName = sourceVarName + "." + targetMemberName
1248
1267
out += fmt .Sprintf (
1249
1268
"%sif %s != nil {\n " , indent , sourceAdaptedVarName ,
1250
1269
)
1251
- qualifiedTargetVar : = fmt .Sprintf (
1270
+ qualifiedTargetVar = fmt .Sprintf (
1252
1271
"%s.%s" , targetVarName , targetMemberCleanNames .Camel ,
1253
1272
)
1273
+ updatedTargetFieldPath := targetFieldPath + "." + targetMemberCleanNames .Camel
1254
1274
1255
1275
switch sourceMemberShape .Type {
1256
1276
case "list" , "structure" , "map" :
@@ -1269,6 +1289,8 @@ func SetResourceForStruct(
1269
1289
nil ,
1270
1290
sourceAdaptedVarName ,
1271
1291
sourceMemberShapeRef ,
1292
+ updatedTargetFieldPath ,
1293
+ op ,
1272
1294
indentLevel + 1 ,
1273
1295
)
1274
1296
out += setResourceForScalar (
@@ -1290,6 +1312,52 @@ func SetResourceForStruct(
1290
1312
"%s}\n " , indent ,
1291
1313
)
1292
1314
}
1315
+ if len (targetShape .MemberNames ()) == 0 {
1316
+ // This scenario can occur when the targetShape is a primitive, but
1317
+ // the sourceShape is a struct. For example, EC2 resource DHCPOptions
1318
+ // has a field NewDhcpConfiguration.Values(targetShape = string) whose name
1319
+ // aligns with DhcpConfiguration.Values(sourceShape = AttributeValue).
1320
+ // Although the names correspond, the shapes/types are different and the intent
1321
+ // is to set NewDhcpConfiguration.Values using DhcpConfiguration.Values.Value
1322
+ // (AttributeValue.Value) shape instead. This behavior can be configured using
1323
+ // SetConfig.
1324
+
1325
+ // Check if target field has a SetConfig, validate SetConfig.From points
1326
+ // to a shape within sourceShape, and generate Go code using
1327
+ // said shape. Using the example above, SetConfig is set
1328
+ // for NewDhcpConfiguration.Values and Setconfig.From points
1329
+ // to AttributeValue.Value (string), which leads to generating Go
1330
+ // code referencing DhcpConfiguration.Values.Value instead of 'Values'.
1331
+
1332
+ if targetField , ok := r .Fields [targetFieldPath ]; ok {
1333
+ setCfg := targetField .GetSetterConfig (op )
1334
+ if setCfg != nil && setCfg .From != nil {
1335
+ fp := fieldpath .FromString (* setCfg .From )
1336
+ sourceMemberShapeRef = fp .ShapeRef (sourceShapeRef )
1337
+ if sourceMemberShapeRef != nil && sourceMemberShapeRef .Shape != nil {
1338
+ names := names .New (sourceMemberShapeRef .LocationName )
1339
+ sourceAdaptedVarName = sourceVarName + "." + names .Camel
1340
+ out += fmt .Sprintf (
1341
+ "%sif %s != nil {\n " , indent , sourceAdaptedVarName ,
1342
+ )
1343
+ qualifiedTargetVar = targetVarName
1344
+
1345
+ // Use setResourceForScalar and dereference sourceAdaptedVarName
1346
+ // because primitives are being set.
1347
+ sourceAdaptedVarName = "*" + sourceAdaptedVarName
1348
+ out += setResourceForScalar (
1349
+ qualifiedTargetVar ,
1350
+ sourceAdaptedVarName ,
1351
+ sourceMemberShapeRef ,
1352
+ indentLevel + 1 ,
1353
+ )
1354
+ out += fmt .Sprintf (
1355
+ "%s}\n " , indent ,
1356
+ )
1357
+ }
1358
+ }
1359
+ }
1360
+ }
1293
1361
return out
1294
1362
}
1295
1363
@@ -1310,6 +1378,9 @@ func setResourceForSlice(
1310
1378
sourceVarName string ,
1311
1379
// ShapeRef of the source slice field
1312
1380
sourceShapeRef * awssdkmodel.ShapeRef ,
1381
+ // targetFieldPath is the field path to targetFieldName
1382
+ targetFieldPath string ,
1383
+ op model.OpType ,
1313
1384
indentLevel int ,
1314
1385
) string {
1315
1386
out := ""
@@ -1388,6 +1459,8 @@ func setResourceForSlice(
1388
1459
targetSetCfg ,
1389
1460
iterVarName ,
1390
1461
& sourceShape .MemberRef ,
1462
+ targetFieldPath ,
1463
+ op ,
1391
1464
indentLevel + 1 ,
1392
1465
)
1393
1466
}
@@ -1421,6 +1494,9 @@ func setResourceForMap(
1421
1494
sourceVarName string ,
1422
1495
// ShapeRef of the source map field
1423
1496
sourceShapeRef * awssdkmodel.ShapeRef ,
1497
+ // targetFieldPath is the field path to targetFieldName
1498
+ targetFieldPath string ,
1499
+ op model.OpType ,
1424
1500
indentLevel int ,
1425
1501
) string {
1426
1502
out := ""
@@ -1453,6 +1529,8 @@ func setResourceForMap(
1453
1529
nil ,
1454
1530
valIterVarName ,
1455
1531
& sourceShape .ValueRef ,
1532
+ targetFieldPath ,
1533
+ op ,
1456
1534
indentLevel + 1 ,
1457
1535
)
1458
1536
addressOfVar := ""
0 commit comments