From a28e4e7cfc604aedfe1ef827ed25c34908c2740f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bryan=E2=84=A2=EF=B8=8F?= Date: Tue, 31 Aug 2021 14:58:11 -0500 Subject: [PATCH 1/2] refactor setSDKReadMany to use FindPluralizedIdentifiersInShape --- pkg/generate/code/set_sdk.go | 34 ++++++++++------------------------ 1 file changed, 10 insertions(+), 24 deletions(-) diff --git a/pkg/generate/code/set_sdk.go b/pkg/generate/code/set_sdk.go index 03ebf9c7..cfedbeea 100644 --- a/pkg/generate/code/set_sdk.go +++ b/pkg/generate/code/set_sdk.go @@ -18,13 +18,10 @@ import ( "sort" "strings" - awssdkmodel "github.com/aws/aws-sdk-go/private/model/api" - "github.com/gertd/go-pluralize" - ackgenconfig "github.com/aws-controllers-k8s/code-generator/pkg/generate/config" "github.com/aws-controllers-k8s/code-generator/pkg/model" "github.com/aws-controllers-k8s/code-generator/pkg/names" - "github.com/aws-controllers-k8s/code-generator/pkg/util" + awssdkmodel "github.com/aws/aws-sdk-go/private/model/api" ) // SetSDK returns the Go code that sets an SDK input shape's member fields from @@ -760,9 +757,7 @@ func setSDKReadMany( indent := strings.Repeat("\t", indentLevel) resVarPath := "" - pluralize := pluralize.NewClient() opConfig, override := cfg.OverrideValues(op.Name) - shapeIdentifiers := FindIdentifiersInShape(r, inputShape) var err error for memberIndex, memberName := range inputShape.MemberNames() { if override { @@ -787,24 +782,15 @@ func setSDKReadMany( // Field renames are handled in GetSanitizedMemberPath resVarPath, err = r.GetSanitizedMemberPath(memberName, op, sourceVarName) if err != nil { - // if it's an identifier field check for singular/plural - if util.InStrings(memberName, shapeIdentifiers) { - var flipped string - if pluralize.IsPlural(memberName) { - flipped = pluralize.Singular(memberName) - } else { - flipped = pluralize.Plural(memberName) - } - // If there are multiple identifiers, then prioritize the - // 'Id' identifier. - if resVarPath == "" || (!strings.HasSuffix(resVarPath, "Id") || - !strings.HasSuffix(resVarPath, "Ids")) { - resVarPath, err = r.GetSanitizedMemberPath(flipped, op, sourceVarName) - if err != nil { - panic(fmt.Sprintf( - "Unable to locate identifier field %s in "+ - "%s Spec/Status in generate.code.setSDKReadMany", flipped, r.Kind)) - } + // if memberName is an identifier field, then check for + // corresponding model identifier + crIdentifier, shapeIdentifier := FindPluralizedIdentifiersInShape(r, inputShape) + if strings.EqualFold(memberName, shapeIdentifier) { + resVarPath, err = r.GetSanitizedMemberPath(crIdentifier, op, sourceVarName) + if err != nil { + panic(fmt.Sprintf( + "Unable to locate identifier field %s in "+ + "%s Spec/Status in generate.code.setSDKReadMany", crIdentifier, r.Kind)) } } else { // TODO(jaypipes): check generator config for exceptions? From b6ca35026bd8d4d7c68701dcac57a335c6a20313 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bryan=E2=84=A2=EF=B8=8F?= Date: Tue, 31 Aug 2021 15:43:45 -0500 Subject: [PATCH 2/2] refactor setResourceForScalar with cleaner params --- pkg/generate/code/set_resource.go | 72 +++++++++++++------------------ pkg/generate/code/set_sdk.go | 3 +- 2 files changed, 33 insertions(+), 42 deletions(-) diff --git a/pkg/generate/code/set_resource.go b/pkg/generate/code/set_resource.go index 938b4b8b..66c725db 100644 --- a/pkg/generate/code/set_resource.go +++ b/pkg/generate/code/set_resource.go @@ -258,6 +258,9 @@ func SetResource( out += fmt.Sprintf( "%sif %s != nil {\n", indent, sourceAdaptedVarName, ) + qualifiedTargetVar := fmt.Sprintf( + "%s.%s", targetAdaptedVarName, f.Names.Camel, + ) switch sourceMemberShape.Type { case "list", "structure", "map": @@ -279,9 +282,7 @@ func SetResource( indentLevel+1, ) out += setResourceForScalar( - cfg, r, - f.Names.Camel, - targetAdaptedVarName, + qualifiedTargetVar, memberVarName, sourceMemberShapeRef, indentLevel+1, @@ -289,9 +290,7 @@ func SetResource( } default: out += setResourceForScalar( - cfg, r, - f.Names.Camel, - targetAdaptedVarName, + qualifiedTargetVar, sourceAdaptedVarName, sourceMemberShapeRef, indentLevel+1, @@ -514,6 +513,11 @@ func setResourceReadMany( out += fmt.Sprintf( "%s\tif %s != nil {\n", indent, sourceAdaptedVarName, ) + + //ex: r.ko.Spec.CacheClusterID + qualifiedTargetVar := fmt.Sprintf( + "%s.%s", targetAdaptedVarName, f.Names.Camel, + ) switch sourceMemberShape.Type { case "list", "structure", "map": { @@ -534,9 +538,7 @@ func setResourceReadMany( indentLevel+2, ) out += setResourceForScalar( - cfg, r, - f.Names.Camel, - targetAdaptedVarName, + qualifiedTargetVar, memberVarName, sourceMemberShapeRef, indentLevel+2, @@ -574,9 +576,7 @@ func setResourceReadMany( } // r.ko.Spec.CacheClusterID = elem.CacheClusterId out += setResourceForScalar( - cfg, r, - f.Names.Camel, - targetAdaptedVarName, + qualifiedTargetVar, sourceAdaptedVarName, sourceMemberShapeRef, indentLevel+2, @@ -1008,10 +1008,10 @@ func setResourceIdentifierPrimaryIdentifier( indentLevel int, ) string { adaptedMemberPath := fmt.Sprintf("&%s.NameOrID", sourceVarName) + qualifiedTargetVar := fmt.Sprintf("%s.%s", targetVarName, targetField.Path) + return setResourceForScalar( - cfg, r, - targetField.Path, - targetVarName, + qualifiedTargetVar, adaptedMemberPath, targetField.ShapeRef, indentLevel, @@ -1052,10 +1052,9 @@ func setResourceIdentifierAdditionalKey( // throwing an error accessible to the user additionalKeyOut += fmt.Sprintf("%s%s, %sok := %s\n", indent, fieldIndexName, fieldIndexName, sourceAdaptedVarName) additionalKeyOut += fmt.Sprintf("%sif %sok {\n", indent, fieldIndexName) + qualifiedTargetVar := fmt.Sprintf("%s.%s", targetVarName, targetField.Path) additionalKeyOut += setResourceForScalar( - cfg, r, - targetField.Path, - targetVarName, + qualifiedTargetVar, fmt.Sprintf("&%s", fieldIndexName), targetField.ShapeRef, indentLevel+1, @@ -1117,9 +1116,7 @@ func setResourceForContainer( ) default: return setResourceForScalar( - cfg, r, - targetFieldName, - targetVarName, + fmt.Sprintf("%s.%s", targetFieldName, targetVarName), sourceVarName, sourceShapeRef, indentLevel, @@ -1162,6 +1159,9 @@ func SetResourceForStruct( out += fmt.Sprintf( "%sif %s != nil {\n", indent, sourceAdaptedVarName, ) + qualifiedTargetVar := fmt.Sprintf( + "%s.%s", targetVarName, cleanNames.Camel, + ) switch memberShape.Type { case "list", "structure", "map": { @@ -1181,9 +1181,7 @@ func SetResourceForStruct( indentLevel+1, ) out += setResourceForScalar( - cfg, r, - cleanNames.Camel, - targetVarName, + qualifiedTargetVar, memberVarName, memberShapeRef, indentLevel+1, @@ -1191,9 +1189,7 @@ func SetResourceForStruct( } default: out += setResourceForScalar( - cfg, r, - cleanNames.Camel, - targetVarName, + qualifiedTargetVar, sourceAdaptedVarName, memberShapeRef, indentLevel+1, @@ -1334,30 +1330,24 @@ func setResourceForMap( // value to a source variable when the type of the source variable is a scalar // type (not a map, slice or struct). func setResourceForScalar( - cfg *ackgenconfig.Config, - r *model.CRD, - // The name of the Input SDK Shape member we're outputting for - targetFieldName string, - // The variable name that we want to set a value to - targetVarName string, + // The fully-qualified variable that will be set to sourceVar + targetVar string, // The struct or struct field that we access our source value from - sourceVarName string, + sourceVar string, shapeRef *awssdkmodel.ShapeRef, indentLevel int, ) string { out := "" indent := strings.Repeat("\t", indentLevel) - setTo := sourceVarName + setTo := sourceVar shape := shapeRef.Shape if shape.Type == "timestamp" { - setTo = "&metav1.Time{*" + sourceVarName + "}" + setTo = "&metav1.Time{*" + sourceVar + "}" } - targetVarPath := targetVarName - if targetFieldName != "" { - targetVarPath += "." + targetFieldName - } else { + if strings.HasPrefix(targetVar, ".") { + targetVar = targetVar[1:] setTo = "*" + setTo } - out += fmt.Sprintf("%s%s = %s\n", indent, targetVarPath, setTo) + out += fmt.Sprintf("%s%s = %s\n", indent, targetVar, setTo) return out } diff --git a/pkg/generate/code/set_sdk.go b/pkg/generate/code/set_sdk.go index cfedbeea..551b5358 100644 --- a/pkg/generate/code/set_sdk.go +++ b/pkg/generate/code/set_sdk.go @@ -18,10 +18,11 @@ import ( "sort" "strings" + awssdkmodel "github.com/aws/aws-sdk-go/private/model/api" + ackgenconfig "github.com/aws-controllers-k8s/code-generator/pkg/generate/config" "github.com/aws-controllers-k8s/code-generator/pkg/model" "github.com/aws-controllers-k8s/code-generator/pkg/names" - awssdkmodel "github.com/aws/aws-sdk-go/private/model/api" ) // SetSDK returns the Go code that sets an SDK input shape's member fields from