smithy-lang / smithy-kotlin

Smithy code generator for Kotlin (in development)
Apache License 2.0
72 stars 26 forks source link

Map shapes targeting enum keys are generated as kotlin.String #1045

Closed aajtodd closed 3 months ago

aajtodd commented 4 months ago

Describe the bug

For every map type we hard code the key type to a kotlin.String but this doesn't take into account enums (which are just a specialization of string).

Real example from iam

Expected Behavior

map MyMap {
    key MyEnum,
    value Int
}

enum MyEnum { ... }

Should generate Map<MyEnum, Int>

Current Behavior

Always generates Map<String, Int> or more generically Map<String, VALUE_SHAPE_TYPE>

Affected AWS APIs

smithy select --aut --selector 'map > member :test(> string [trait|enum])' *.json | rg "key" > /tmp/mapkeys.txt

All map shapes with a key member targeting an enum:

com.amazonaws.appconfig#ActionsMap$key
com.amazonaws.appflow#ConnectorConfigurationsMap$key
com.amazonaws.appflow#TaskPropertiesMap$key
com.amazonaws.applicationinsights#DetectedWorkload$key
com.amazonaws.applicationinsights#Feedback$key
com.amazonaws.backup#BackupJobChildJobsInState$key
com.amazonaws.backup#CopyJobChildJobsInState$key
com.amazonaws.codeartifact#AssetHashes$key
com.amazonaws.codedeploy#TargetFilters$key
com.amazonaws.codeguruprofiler#AgentParameters$key
com.amazonaws.codeguruprofiler#Metadata$key
com.amazonaws.connect#ChannelToCountMap$key
com.amazonaws.customerprofiles#TaskPropertiesMap$key
com.amazonaws.datasync#ResourceFilters$key
com.amazonaws.detective#DatasourcePackageIngestDetails$key
com.amazonaws.detective#DatasourcePackageIngestHistory$key
com.amazonaws.detective#DatasourcePackageIngestStates$key
com.amazonaws.detective#LastIngestStateChangeDates$key
com.amazonaws.detective#VolumeUsageByDatasourcePackage$key
com.amazonaws.devicefarm#PurchasedDevicesMap$key
com.amazonaws.devicefarm#UniqueProblemsByExecutionResultMap$key
com.amazonaws.ecr#FindingSeverityCounts$key
com.amazonaws.elasticsearchservice#LogPublishingOptions$key
com.amazonaws.fms#CustomerPolicyScopeMap$key
com.amazonaws.fms#IssueInfoMap$key
com.amazonaws.glue#ConnectionProperties$key
com.amazonaws.glue#DQAdditionalOptions$key
com.amazonaws.glue#JDBCDataTypeMapping$key
com.amazonaws.guardduty#CountByCoverageStatus$key
com.amazonaws.guardduty#CountByResourceType$key
com.amazonaws.guardduty#ScanCriterion$key
com.amazonaws.health#entityStatuses$key
com.amazonaws.iam#summaryMapType$key
com.amazonaws.inspector#AssessmentRunFindingCounts$key
com.amazonaws.iot#AlertTargets$key
com.amazonaws.iot#AuditNotificationTargetConfigurations$key
com.amazonaws.iot#EventConfigurations$key
com.amazonaws.kinesisvideo#FormatConfig$key
com.amazonaws.kinesisvideoarchivedmedia#FormatConfig$key
com.amazonaws.lakeformation#StorageOptimizerConfigMap$key
com.amazonaws.lambda#Endpoints$key
com.amazonaws.lexmodelsv2#PromptAttemptsSpecificationMap$key
com.amazonaws.lexmodelsv2#TestResultMatchStatusCountMap$key
com.amazonaws.lightsail#LoadBalancerConfigurationOptions$key
com.amazonaws.machinelearning#DetailsMap$key
com.amazonaws.marketplaceentitlementservice#GetEntitlementFilters$key
com.amazonaws.omics#FormatToHeader$key
com.amazonaws.opensearch#LogPublishingOptions$key
com.amazonaws.opsworks#AppAttributes$key
com.amazonaws.opsworks#LayerAttributes$key
com.amazonaws.opsworks#StackAttributes$key
com.amazonaws.outposts#LineItemStatusCounts$key
com.amazonaws.pinpoint#MapOfListOfOpenHoursRules$key
com.amazonaws.pinpointsmsvoicev2#DestinationCountryParameters$key
com.amazonaws.privatenetworks#DeviceIdentifierFilters$key
com.amazonaws.privatenetworks#NetworkFilters$key
com.amazonaws.privatenetworks#NetworkResourceFilters$key
com.amazonaws.privatenetworks#NetworkSiteFilters$key
com.amazonaws.privatenetworks#OrderFilters$key
com.amazonaws.resiliencehub#AssessmentCompliance$key
com.amazonaws.resiliencehub#DisruptionPolicy$key
com.amazonaws.resiliencehub#DisruptionResiliencyScore$key
com.amazonaws.resiliencehub#RecommendationCompliance$key
com.amazonaws.resiliencehub#ScoringComponentResiliencyScores$key
com.amazonaws.sagemaker#AutoMLInferenceContainerDefinitions$key
com.amazonaws.sagemaker#FillingTransformationMap$key
com.amazonaws.servicecatalog#ProductViewFilters$key
com.amazonaws.servicecatalog#ProvisionedProductFilters$key
com.amazonaws.servicecatalog#ProvisionedProductProperties$key
com.amazonaws.servicecatalog#ServiceActionDefinitionMap$key
com.amazonaws.servicecatalog#SourceProvisioningArtifactPropertiesMap$key
com.amazonaws.servicediscovery#OperationTargetsMap$key
com.amazonaws.sesv2#Dimensions$key
com.amazonaws.sesv2#ExportDimensions$key
com.amazonaws.sesv2#ListRecommendationsFilter$key
com.amazonaws.sqs#MessageBodySystemAttributeMap$key
com.amazonaws.sqs#MessageSystemAttributeMap$key
com.amazonaws.sqs#QueueAttributeMap$key
com.amazonaws.ssmcontacts#ShiftCoveragesMap$key
com.amazonaws.transcribe#LanguageIdSettingsMap$key
com.amazonaws.wafv2#RequestBody$key
com.amazonaws.wellarchitected#AccountSummary$key
com.amazonaws.wellarchitected#QuestionCounts$key
com.amazonaws.wellarchitected#RiskCounts$key
com.amazonaws.workdocs#DocumentSourceUrlMap$key
com.amazonaws.workdocs#DocumentThumbnailUrlMap$key

Backwards Compatability

Fixing this would almost certainly be a breaking change.

ianbotsf commented 3 months ago

Resolved by merging https://github.com/smithy-lang/smithy-kotlin/pull/1054