From 209e3e013935e953123f9026ad9cbdd9ceccb566 Mon Sep 17 00:00:00 2001 From: kai lin Date: Tue, 13 Jan 2026 14:44:20 -0500 Subject: [PATCH 1/5] Added pagination codegen to new Smithy codegen project with CRTP base clients, service-specific patches, and integration tests for S3, EC2, and DynamoDB --- .../include/aws/dynamodb/DynamoDBClient.h | 4 +- .../aws/dynamodb/DynamoDBClientPagination.h | 31 + .../aws/dynamodb/DynamoDBPaginationBase.h | 83 + .../aws/dynamodb/model/ScanPaginationTraits.h | 35 + .../include/aws/ec2/EC2Client.h | 5 +- .../include/aws/ec2/EC2ClientPagination.h | 592 +++++ .../include/aws/ec2/EC2PaginationBase.h | 1944 +++++++++++++++++ ...DescribeSpotPriceHistoryPaginationTraits.h | 35 + .../aws-cpp-sdk-s3/include/aws/s3/S3Client.h | 5 +- .../include/aws/s3/S3ClientPagination.h | 26 + .../include/aws/s3/S3PaginationBase.h | 62 + .../s3/model/ListBucketsPaginationTraits.h | 37 + .../ListDirectoryBucketsPaginationTraits.h | 37 + .../s3/model/ListObjectsV2PaginationTraits.h | 37 + .../aws/s3/model/ListPartsPaginationTraits.h | 37 + .../DynamoDBPaginationCompilationTests.cpp | 28 + .../EC2PaginationCompilationTests.cpp | 185 ++ .../S3PaginationCompilationTests.cpp | 26 + .../ScanPaginationIntegrationTest.cpp | 214 ++ .../EC2PaginationIntegrationTest.cpp | 156 ++ ...ListObjectsV2PaginationIntegrationTest.cpp | 264 +++ .../cpp/json/JsonServiceClientHeader.vm | 3 +- .../velocity/cpp/s3/S3ClientHeader.vm | 3 +- .../velocity/cpp/smithy/SmithyClientHeader.vm | 4 +- .../cpp/xml/XmlServiceClientHeader.vm | 3 +- .../cpp-pagination-codegen/build.gradle.kts | 18 + .../generators/ClientCodegenSettings.java | 20 + .../generators/CompilationTestParser.java | 45 + .../generators/CppImportContainer.java | 36 + .../generators/CppWriter.java | 45 + .../generators/CppWriterDelegator.java | 37 + .../generators/FeatureParser.java | 67 + .../generators/OperationData.java | 32 + .../generators/ServiceNameUtil.java | 141 ++ .../generators/ShapeUtil.java | 279 +++ .../templates/PaginationBaseGenerator.java | 102 + .../PaginationClientHeaderGenerator.java | 76 + .../templates/PaginationCodegenPlugin.java | 140 ++ .../PaginationCompilationTestGenerator.java | 107 + .../templates/PaginationTraitsGenerator.java | 207 ++ ...ware.amazon.smithy.build.SmithyBuildPlugin | 1 + .../codegen/cpp-pagination/build.gradle.kts | 104 + .../codegen/cpp-pagination/smithy-build.json | 36 + .../smithy/codegen/settings.gradle.kts | 2 + .../codegen/smithy2c2j_service_map.json | 2 +- tools/scripts/codegen/legacy_c2j_cpp_gen.py | 7 - tools/scripts/codegen/pagination_gen.py | 126 ++ tools/scripts/codegen/smoke_tests_gen.py | 16 +- tools/scripts/run_code_generation.py | 16 + 49 files changed, 5499 insertions(+), 19 deletions(-) create mode 100644 generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/DynamoDBClientPagination.h create mode 100644 generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/DynamoDBPaginationBase.h create mode 100644 generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/model/ScanPaginationTraits.h create mode 100644 generated/src/aws-cpp-sdk-ec2/include/aws/ec2/EC2ClientPagination.h create mode 100644 generated/src/aws-cpp-sdk-ec2/include/aws/ec2/EC2PaginationBase.h create mode 100644 generated/src/aws-cpp-sdk-ec2/include/aws/ec2/model/DescribeSpotPriceHistoryPaginationTraits.h create mode 100644 generated/src/aws-cpp-sdk-s3/include/aws/s3/S3ClientPagination.h create mode 100644 generated/src/aws-cpp-sdk-s3/include/aws/s3/S3PaginationBase.h create mode 100644 generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListBucketsPaginationTraits.h create mode 100644 generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListDirectoryBucketsPaginationTraits.h create mode 100644 generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListObjectsV2PaginationTraits.h create mode 100644 generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListPartsPaginationTraits.h create mode 100644 generated/tests/dynamodb-gen-tests/DynamoDBPaginationCompilationTests.cpp create mode 100644 generated/tests/ec2-gen-tests/EC2PaginationCompilationTests.cpp create mode 100644 generated/tests/s3-gen-tests/S3PaginationCompilationTests.cpp create mode 100644 tests/aws-cpp-sdk-dynamodb-integration-tests/ScanPaginationIntegrationTest.cpp create mode 100644 tests/aws-cpp-sdk-ec2-integration-tests/EC2PaginationIntegrationTest.cpp create mode 100644 tests/aws-cpp-sdk-s3-integration-tests/ListObjectsV2PaginationIntegrationTest.cpp create mode 100644 tools/code-generation/smithy/codegen/cpp-pagination-codegen/build.gradle.kts create mode 100644 tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ClientCodegenSettings.java create mode 100644 tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CompilationTestParser.java create mode 100644 tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CppImportContainer.java create mode 100644 tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CppWriter.java create mode 100644 tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CppWriterDelegator.java create mode 100644 tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/FeatureParser.java create mode 100644 tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/OperationData.java create mode 100644 tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ServiceNameUtil.java create mode 100644 tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ShapeUtil.java create mode 100644 tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationBaseGenerator.java create mode 100644 tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationClientHeaderGenerator.java create mode 100644 tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationCodegenPlugin.java create mode 100644 tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationCompilationTestGenerator.java create mode 100644 tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationTraitsGenerator.java create mode 100644 tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/resources/META-INF/services/software.amazon.smithy.build.SmithyBuildPlugin create mode 100644 tools/code-generation/smithy/codegen/cpp-pagination/build.gradle.kts create mode 100644 tools/code-generation/smithy/codegen/cpp-pagination/smithy-build.json create mode 100644 tools/scripts/codegen/pagination_gen.py diff --git a/generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/DynamoDBClient.h b/generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/DynamoDBClient.h index 873154dd938b..a4cfb576b72e 100644 --- a/generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/DynamoDBClient.h +++ b/generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/DynamoDBClient.h @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -40,7 +41,8 @@ class AWS_DYNAMODB_API DynamoDBClient public smithy::client::AwsSmithyClientT, Aws::Crt::Variant, DynamoDBEndpointProviderBase, smithy::client::JsonOutcomeSerializer, - smithy::client::JsonOutcome, Aws::Client::DynamoDBErrorMarshaller> { + smithy::client::JsonOutcome, Aws::Client::DynamoDBErrorMarshaller>, + public DynamoDBPaginationBase { public: static const char* GetServiceName(); static const char* GetAllocationTag(); diff --git a/generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/DynamoDBClientPagination.h b/generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/DynamoDBClientPagination.h new file mode 100644 index 000000000000..41e75132dbc4 --- /dev/null +++ b/generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/DynamoDBClientPagination.h @@ -0,0 +1,31 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ + +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Aws { +namespace DynamoDB { + +using ListContributorInsightsPaginator = Aws::Utils::Pagination::PagePaginator; +using ListExportsPaginator = + Aws::Utils::Pagination::PagePaginator; +using ListImportsPaginator = + Aws::Utils::Pagination::PagePaginator; +using ListTablesPaginator = + Aws::Utils::Pagination::PagePaginator; +using QueryPaginator = Aws::Utils::Pagination::PagePaginator; +using ScanPaginator = Aws::Utils::Pagination::PagePaginator; + +} // namespace DynamoDB +} // namespace Aws diff --git a/generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/DynamoDBPaginationBase.h b/generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/DynamoDBPaginationBase.h new file mode 100644 index 000000000000..739b15e86c26 --- /dev/null +++ b/generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/DynamoDBPaginationBase.h @@ -0,0 +1,83 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace Aws { +namespace DynamoDB { + +class DynamoDBClient; + +template +class DynamoDBPaginationBase { + public: + /** + * Create a paginator for ListContributorInsights operation + */ + Aws::Utils::Pagination::PagePaginator + ListContributorInsightsPaginator(const Model::ListContributorInsightsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for ListExports operation + */ + Aws::Utils::Pagination::PagePaginator + ListExportsPaginator(const Model::ListExportsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for ListImports operation + */ + Aws::Utils::Pagination::PagePaginator + ListImportsPaginator(const Model::ListImportsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for ListTables operation + */ + Aws::Utils::Pagination::PagePaginator + ListTablesPaginator(const Model::ListTablesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for Query operation + */ + Aws::Utils::Pagination::PagePaginator QueryPaginator( + const Model::QueryRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for Scan operation + */ + Aws::Utils::Pagination::PagePaginator ScanPaginator( + const Model::ScanRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } +}; +} // namespace DynamoDB +} // namespace Aws diff --git a/generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/model/ScanPaginationTraits.h b/generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/model/ScanPaginationTraits.h new file mode 100644 index 000000000000..988cf65a5828 --- /dev/null +++ b/generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/model/ScanPaginationTraits.h @@ -0,0 +1,35 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ + +#pragma once +#include +#include +#include +#include + +namespace Aws { +namespace DynamoDB { +class DynamoDBClient; +namespace Pagination { + +struct ScanPaginationTraits { + using RequestType = Model::ScanRequest; + using ResultType = Model::ScanResult; + using OutcomeType = Model::ScanOutcome; + using ClientType = DynamoDBClient; + + template + static OutcomeType Invoke(Client& client, const RequestType& request) { + return client.Scan(request); + } + + static bool HasMoreResults(const ResultType& result) { return !result.GetLastEvaluatedKey().empty(); } + + static void SetNextRequest(const ResultType& result, RequestType& request) { request.SetExclusiveStartKey(result.GetLastEvaluatedKey()); } +}; + +} // namespace Pagination +} // namespace DynamoDB +} // namespace Aws diff --git a/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/EC2Client.h b/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/EC2Client.h index 448f1a952f35..49cf8ca71505 100644 --- a/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/EC2Client.h +++ b/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/EC2Client.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -21,7 +22,9 @@ namespace EC2 { * href="https://docs.aws.amazon.com/ec2/latest/devguide">Amazon EC2 Developer * Guide.

*/ -class AWS_EC2_API EC2Client : public Aws::Client::AWSXMLClient, public Aws::Client::ClientWithAsyncTemplateMethods { +class AWS_EC2_API EC2Client : public Aws::Client::AWSXMLClient, + public Aws::Client::ClientWithAsyncTemplateMethods, + public EC2PaginationBase { public: typedef Aws::Client::AWSXMLClient BASECLASS; static const char* GetServiceName(); diff --git a/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/EC2ClientPagination.h b/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/EC2ClientPagination.h new file mode 100644 index 000000000000..a108d6a661d3 --- /dev/null +++ b/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/EC2ClientPagination.h @@ -0,0 +1,592 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ + +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Aws { +namespace EC2 { + +using DescribeAddressesAttributePaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeAddressTransfersPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeAwsNetworkPerformanceMetricSubscriptionsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeByoipCidrsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeCapacityBlockExtensionHistoryPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeCapacityBlockExtensionOfferingsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeCapacityBlockOfferingsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeCapacityBlocksPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeCapacityBlockStatusPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeCapacityManagerDataExportsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeCapacityReservationBillingRequestsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeCapacityReservationFleetsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeCapacityReservationsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeCarrierGatewaysPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeClassicLinkInstancesPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeClientVpnAuthorizationRulesPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeClientVpnConnectionsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeClientVpnEndpointsPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeClientVpnRoutesPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeClientVpnTargetNetworksPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeCoipPoolsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeDhcpOptionsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeEgressOnlyInternetGatewaysPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeExportImageTasksPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeFastLaunchImagesPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeFastSnapshotRestoresPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeFleetsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeFlowLogsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeFpgaImagesPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeHostReservationOfferingsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeHostReservationsPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeHostsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeIamInstanceProfileAssociationsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeImageReferencesPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeImagesPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeImageUsageReportEntriesPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeImageUsageReportsPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeImportImageTasksPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeImportSnapshotTasksPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeInstanceConnectEndpointsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeInstanceCreditSpecificationsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeInstanceEventWindowsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeInstanceImageMetadataPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeInstancesPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeInstanceStatusPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeInstanceTopologyPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeInstanceTypeOfferingsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeInstanceTypesPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeInternetGatewaysPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeIpamPoolsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeIpamPrefixListResolversPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeIpamPrefixListResolverTargetsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeIpamResourceDiscoveriesPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeIpamResourceDiscoveryAssociationsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeIpamsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeIpamScopesPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeIpv6PoolsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeLaunchTemplatesPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeLaunchTemplateVersionsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeLocalGatewayRouteTablesPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeLocalGatewayRouteTableVpcAssociationsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeLocalGatewaysPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeLocalGatewayVirtualInterfaceGroupsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeLocalGatewayVirtualInterfacesPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeMacHostsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeMacModificationTasksPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeManagedPrefixListsPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeMovingAddressesPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeNatGatewaysPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeNetworkAclsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeNetworkInsightsAccessScopeAnalysesPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeNetworkInsightsAccessScopesPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeNetworkInsightsAnalysesPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeNetworkInsightsPathsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeNetworkInterfacePermissionsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeNetworkInterfacesPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribePrefixListsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribePrincipalIdFormatPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribePublicIpv4PoolsPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeReplaceRootVolumeTasksPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeReservedInstancesModificationsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeReservedInstancesOfferingsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeRouteServerEndpointsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeRouteServerPeersPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeRouteServersPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeRouteTablesPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeScheduledInstanceAvailabilityPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeScheduledInstancesPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeSecurityGroupRulesPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeSecurityGroupsPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeSecurityGroupVpcAssociationsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeSnapshotsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeSnapshotTierStatusPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeSpotFleetRequestsPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeSpotInstanceRequestsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeSpotPriceHistoryPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeStaleSecurityGroupsPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeStoreImageTasksPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeSubnetsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeTagsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeTrafficMirrorFiltersPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeTrafficMirrorSessionsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeTrafficMirrorTargetsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeTransitGatewayAttachmentsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeTransitGatewayConnectPeersPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeTransitGatewayConnectsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeTransitGatewayMulticastDomainsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeTransitGatewayPeeringAttachmentsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeTransitGatewayPolicyTablesPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeTransitGatewayRouteTableAnnouncementsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeTransitGatewayRouteTablesPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeTransitGatewaysPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeTransitGatewayVpcAttachmentsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeTrunkInterfaceAssociationsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeVerifiedAccessEndpointsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeVerifiedAccessGroupsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeVerifiedAccessInstanceLoggingConfigurationsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeVerifiedAccessInstancesPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeVerifiedAccessTrustProvidersPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeVolumesPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeVolumesModificationsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeVolumeStatusPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeVpcClassicLinkDnsSupportPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeVpcEndpointConnectionNotificationsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeVpcEndpointConnectionsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeVpcEndpointsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeVpcEndpointServiceConfigurationsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeVpcEndpointServicePermissionsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeVpcPeeringConnectionsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeVpcsPaginator = + Aws::Utils::Pagination::PagePaginator; +using DescribeVpnConcentratorsPaginator = Aws::Utils::Pagination::PagePaginator; +using GetAssociatedIpv6PoolCidrsPaginator = Aws::Utils::Pagination::PagePaginator; +using GetAwsNetworkPerformanceDataPaginator = + Aws::Utils::Pagination::PagePaginator; +using GetCapacityManagerMetricDataPaginator = + Aws::Utils::Pagination::PagePaginator; +using GetCapacityManagerMetricDimensionsPaginator = + Aws::Utils::Pagination::PagePaginator; +using GetGroupsForCapacityReservationPaginator = + Aws::Utils::Pagination::PagePaginator; +using GetInstanceTypesFromInstanceRequirementsPaginator = + Aws::Utils::Pagination::PagePaginator; +using GetIpamAddressHistoryPaginator = Aws::Utils::Pagination::PagePaginator; +using GetIpamDiscoveredAccountsPaginator = Aws::Utils::Pagination::PagePaginator; +using GetIpamDiscoveredResourceCidrsPaginator = + Aws::Utils::Pagination::PagePaginator; +using GetIpamPoolAllocationsPaginator = Aws::Utils::Pagination::PagePaginator; +using GetIpamPoolCidrsPaginator = + Aws::Utils::Pagination::PagePaginator; +using GetIpamPrefixListResolverRulesPaginator = + Aws::Utils::Pagination::PagePaginator; +using GetIpamPrefixListResolverVersionEntriesPaginator = + Aws::Utils::Pagination::PagePaginator; +using GetIpamPrefixListResolverVersionsPaginator = + Aws::Utils::Pagination::PagePaginator; +using GetIpamResourceCidrsPaginator = + Aws::Utils::Pagination::PagePaginator; +using GetManagedPrefixListAssociationsPaginator = + Aws::Utils::Pagination::PagePaginator; +using GetManagedPrefixListEntriesPaginator = Aws::Utils::Pagination::PagePaginator; +using GetNetworkInsightsAccessScopeAnalysisFindingsPaginator = + Aws::Utils::Pagination::PagePaginator; +using GetSecurityGroupsForVpcPaginator = Aws::Utils::Pagination::PagePaginator; +using GetSpotPlacementScoresPaginator = Aws::Utils::Pagination::PagePaginator; +using GetTransitGatewayAttachmentPropagationsPaginator = + Aws::Utils::Pagination::PagePaginator; +using GetTransitGatewayMulticastDomainAssociationsPaginator = + Aws::Utils::Pagination::PagePaginator; +using GetTransitGatewayPolicyTableAssociationsPaginator = + Aws::Utils::Pagination::PagePaginator; +using GetTransitGatewayPrefixListReferencesPaginator = + Aws::Utils::Pagination::PagePaginator; +using GetTransitGatewayRouteTableAssociationsPaginator = + Aws::Utils::Pagination::PagePaginator; +using GetTransitGatewayRouteTablePropagationsPaginator = + Aws::Utils::Pagination::PagePaginator; +using GetVpnConnectionDeviceTypesPaginator = Aws::Utils::Pagination::PagePaginator; +using ListImagesInRecycleBinPaginator = Aws::Utils::Pagination::PagePaginator; +using ListSnapshotsInRecycleBinPaginator = Aws::Utils::Pagination::PagePaginator; +using SearchLocalGatewayRoutesPaginator = Aws::Utils::Pagination::PagePaginator; +using SearchTransitGatewayMulticastGroupsPaginator = + Aws::Utils::Pagination::PagePaginator; + +} // namespace EC2 +} // namespace Aws diff --git a/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/EC2PaginationBase.h b/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/EC2PaginationBase.h new file mode 100644 index 000000000000..da4d9f967f4f --- /dev/null +++ b/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/EC2PaginationBase.h @@ -0,0 +1,1944 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace Aws { +namespace EC2 { + +class EC2Client; + +template +class EC2PaginationBase { + public: + /** + * Create a paginator for DescribeAddressesAttribute operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeAddressesAttributePaginator(const Model::DescribeAddressesAttributeRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeAddressTransfers operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeAddressTransfersPaginator(const Model::DescribeAddressTransfersRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeAwsNetworkPerformanceMetricSubscriptions operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeAwsNetworkPerformanceMetricSubscriptionsPaginator(const Model::DescribeAwsNetworkPerformanceMetricSubscriptionsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeByoipCidrs operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeByoipCidrsPaginator(const Model::DescribeByoipCidrsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeCapacityBlockExtensionHistory operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeCapacityBlockExtensionHistoryPaginator(const Model::DescribeCapacityBlockExtensionHistoryRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeCapacityBlockExtensionOfferings operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeCapacityBlockExtensionOfferingsPaginator(const Model::DescribeCapacityBlockExtensionOfferingsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeCapacityBlockOfferings operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeCapacityBlockOfferingsPaginator(const Model::DescribeCapacityBlockOfferingsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeCapacityBlocks operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeCapacityBlocksPaginator(const Model::DescribeCapacityBlocksRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeCapacityBlockStatus operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeCapacityBlockStatusPaginator(const Model::DescribeCapacityBlockStatusRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeCapacityManagerDataExports operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeCapacityManagerDataExportsPaginator(const Model::DescribeCapacityManagerDataExportsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeCapacityReservationBillingRequests operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeCapacityReservationBillingRequestsPaginator(const Model::DescribeCapacityReservationBillingRequestsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeCapacityReservationFleets operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeCapacityReservationFleetsPaginator(const Model::DescribeCapacityReservationFleetsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeCapacityReservations operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeCapacityReservationsPaginator(const Model::DescribeCapacityReservationsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeCarrierGateways operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeCarrierGatewaysPaginator(const Model::DescribeCarrierGatewaysRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeClassicLinkInstances operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeClassicLinkInstancesPaginator(const Model::DescribeClassicLinkInstancesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeClientVpnAuthorizationRules operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeClientVpnAuthorizationRulesPaginator(const Model::DescribeClientVpnAuthorizationRulesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeClientVpnConnections operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeClientVpnConnectionsPaginator(const Model::DescribeClientVpnConnectionsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeClientVpnEndpoints operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeClientVpnEndpointsPaginator(const Model::DescribeClientVpnEndpointsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeClientVpnRoutes operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeClientVpnRoutesPaginator(const Model::DescribeClientVpnRoutesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeClientVpnTargetNetworks operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeClientVpnTargetNetworksPaginator(const Model::DescribeClientVpnTargetNetworksRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeCoipPools operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeCoipPoolsPaginator(const Model::DescribeCoipPoolsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeDhcpOptions operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeDhcpOptionsPaginator(const Model::DescribeDhcpOptionsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeEgressOnlyInternetGateways operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeEgressOnlyInternetGatewaysPaginator(const Model::DescribeEgressOnlyInternetGatewaysRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeExportImageTasks operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeExportImageTasksPaginator(const Model::DescribeExportImageTasksRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeFastLaunchImages operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeFastLaunchImagesPaginator(const Model::DescribeFastLaunchImagesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeFastSnapshotRestores operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeFastSnapshotRestoresPaginator(const Model::DescribeFastSnapshotRestoresRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeFleets operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeFleetsPaginator(const Model::DescribeFleetsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeFlowLogs operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeFlowLogsPaginator(const Model::DescribeFlowLogsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeFpgaImages operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeFpgaImagesPaginator(const Model::DescribeFpgaImagesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeHostReservationOfferings operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeHostReservationOfferingsPaginator(const Model::DescribeHostReservationOfferingsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeHostReservations operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeHostReservationsPaginator(const Model::DescribeHostReservationsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeHosts operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeHostsPaginator(const Model::DescribeHostsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeIamInstanceProfileAssociations operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeIamInstanceProfileAssociationsPaginator(const Model::DescribeIamInstanceProfileAssociationsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeImageReferences operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeImageReferencesPaginator(const Model::DescribeImageReferencesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeImages operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeImagesPaginator(const Model::DescribeImagesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeImageUsageReportEntries operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeImageUsageReportEntriesPaginator(const Model::DescribeImageUsageReportEntriesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeImageUsageReports operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeImageUsageReportsPaginator(const Model::DescribeImageUsageReportsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeImportImageTasks operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeImportImageTasksPaginator(const Model::DescribeImportImageTasksRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeImportSnapshotTasks operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeImportSnapshotTasksPaginator(const Model::DescribeImportSnapshotTasksRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeInstanceConnectEndpoints operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeInstanceConnectEndpointsPaginator(const Model::DescribeInstanceConnectEndpointsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeInstanceCreditSpecifications operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeInstanceCreditSpecificationsPaginator(const Model::DescribeInstanceCreditSpecificationsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeInstanceEventWindows operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeInstanceEventWindowsPaginator(const Model::DescribeInstanceEventWindowsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeInstanceImageMetadata operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeInstanceImageMetadataPaginator(const Model::DescribeInstanceImageMetadataRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeInstances operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeInstancesPaginator(const Model::DescribeInstancesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeInstanceStatus operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeInstanceStatusPaginator(const Model::DescribeInstanceStatusRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeInstanceTopology operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeInstanceTopologyPaginator(const Model::DescribeInstanceTopologyRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeInstanceTypeOfferings operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeInstanceTypeOfferingsPaginator(const Model::DescribeInstanceTypeOfferingsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeInstanceTypes operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeInstanceTypesPaginator(const Model::DescribeInstanceTypesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeInternetGateways operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeInternetGatewaysPaginator(const Model::DescribeInternetGatewaysRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeIpamPools operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeIpamPoolsPaginator(const Model::DescribeIpamPoolsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeIpamPrefixListResolvers operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeIpamPrefixListResolversPaginator(const Model::DescribeIpamPrefixListResolversRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeIpamPrefixListResolverTargets operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeIpamPrefixListResolverTargetsPaginator(const Model::DescribeIpamPrefixListResolverTargetsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeIpamResourceDiscoveries operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeIpamResourceDiscoveriesPaginator(const Model::DescribeIpamResourceDiscoveriesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeIpamResourceDiscoveryAssociations operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeIpamResourceDiscoveryAssociationsPaginator(const Model::DescribeIpamResourceDiscoveryAssociationsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeIpams operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeIpamsPaginator(const Model::DescribeIpamsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeIpamScopes operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeIpamScopesPaginator(const Model::DescribeIpamScopesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeIpv6Pools operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeIpv6PoolsPaginator(const Model::DescribeIpv6PoolsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeLaunchTemplates operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeLaunchTemplatesPaginator(const Model::DescribeLaunchTemplatesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeLaunchTemplateVersions operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeLaunchTemplateVersionsPaginator(const Model::DescribeLaunchTemplateVersionsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeLocalGatewayRouteTables operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeLocalGatewayRouteTablesPaginator(const Model::DescribeLocalGatewayRouteTablesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociations operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsPaginator( + const Model::DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsRequest& request) { + return Aws::Utils::Pagination::PagePaginator< + DerivedClient, Model::DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsRequest, + Pagination::DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsPaginationTraits>{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeLocalGatewayRouteTableVpcAssociations operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeLocalGatewayRouteTableVpcAssociationsPaginator(const Model::DescribeLocalGatewayRouteTableVpcAssociationsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeLocalGateways operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeLocalGatewaysPaginator(const Model::DescribeLocalGatewaysRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeLocalGatewayVirtualInterfaceGroups operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeLocalGatewayVirtualInterfaceGroupsPaginator(const Model::DescribeLocalGatewayVirtualInterfaceGroupsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeLocalGatewayVirtualInterfaces operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeLocalGatewayVirtualInterfacesPaginator(const Model::DescribeLocalGatewayVirtualInterfacesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeMacHosts operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeMacHostsPaginator(const Model::DescribeMacHostsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeMacModificationTasks operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeMacModificationTasksPaginator(const Model::DescribeMacModificationTasksRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeManagedPrefixLists operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeManagedPrefixListsPaginator(const Model::DescribeManagedPrefixListsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeMovingAddresses operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeMovingAddressesPaginator(const Model::DescribeMovingAddressesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeNatGateways operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeNatGatewaysPaginator(const Model::DescribeNatGatewaysRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeNetworkAcls operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeNetworkAclsPaginator(const Model::DescribeNetworkAclsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeNetworkInsightsAccessScopeAnalyses operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeNetworkInsightsAccessScopeAnalysesPaginator(const Model::DescribeNetworkInsightsAccessScopeAnalysesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeNetworkInsightsAccessScopes operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeNetworkInsightsAccessScopesPaginator(const Model::DescribeNetworkInsightsAccessScopesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeNetworkInsightsAnalyses operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeNetworkInsightsAnalysesPaginator(const Model::DescribeNetworkInsightsAnalysesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeNetworkInsightsPaths operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeNetworkInsightsPathsPaginator(const Model::DescribeNetworkInsightsPathsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeNetworkInterfacePermissions operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeNetworkInterfacePermissionsPaginator(const Model::DescribeNetworkInterfacePermissionsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeNetworkInterfaces operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeNetworkInterfacesPaginator(const Model::DescribeNetworkInterfacesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribePrefixLists operation + */ + Aws::Utils::Pagination::PagePaginator + DescribePrefixListsPaginator(const Model::DescribePrefixListsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribePrincipalIdFormat operation + */ + Aws::Utils::Pagination::PagePaginator + DescribePrincipalIdFormatPaginator(const Model::DescribePrincipalIdFormatRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribePublicIpv4Pools operation + */ + Aws::Utils::Pagination::PagePaginator + DescribePublicIpv4PoolsPaginator(const Model::DescribePublicIpv4PoolsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeReplaceRootVolumeTasks operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeReplaceRootVolumeTasksPaginator(const Model::DescribeReplaceRootVolumeTasksRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeReservedInstancesModifications operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeReservedInstancesModificationsPaginator(const Model::DescribeReservedInstancesModificationsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeReservedInstancesOfferings operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeReservedInstancesOfferingsPaginator(const Model::DescribeReservedInstancesOfferingsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeRouteServerEndpoints operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeRouteServerEndpointsPaginator(const Model::DescribeRouteServerEndpointsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeRouteServerPeers operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeRouteServerPeersPaginator(const Model::DescribeRouteServerPeersRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeRouteServers operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeRouteServersPaginator(const Model::DescribeRouteServersRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeRouteTables operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeRouteTablesPaginator(const Model::DescribeRouteTablesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeScheduledInstanceAvailability operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeScheduledInstanceAvailabilityPaginator(const Model::DescribeScheduledInstanceAvailabilityRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeScheduledInstances operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeScheduledInstancesPaginator(const Model::DescribeScheduledInstancesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeSecurityGroupRules operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeSecurityGroupRulesPaginator(const Model::DescribeSecurityGroupRulesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeSecurityGroups operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeSecurityGroupsPaginator(const Model::DescribeSecurityGroupsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeSecurityGroupVpcAssociations operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeSecurityGroupVpcAssociationsPaginator(const Model::DescribeSecurityGroupVpcAssociationsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeSnapshots operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeSnapshotsPaginator(const Model::DescribeSnapshotsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeSnapshotTierStatus operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeSnapshotTierStatusPaginator(const Model::DescribeSnapshotTierStatusRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeSpotFleetRequests operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeSpotFleetRequestsPaginator(const Model::DescribeSpotFleetRequestsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeSpotInstanceRequests operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeSpotInstanceRequestsPaginator(const Model::DescribeSpotInstanceRequestsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeSpotPriceHistory operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeSpotPriceHistoryPaginator(const Model::DescribeSpotPriceHistoryRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeStaleSecurityGroups operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeStaleSecurityGroupsPaginator(const Model::DescribeStaleSecurityGroupsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeStoreImageTasks operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeStoreImageTasksPaginator(const Model::DescribeStoreImageTasksRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeSubnets operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeSubnetsPaginator(const Model::DescribeSubnetsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeTags operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeTagsPaginator(const Model::DescribeTagsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeTrafficMirrorFilters operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeTrafficMirrorFiltersPaginator(const Model::DescribeTrafficMirrorFiltersRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeTrafficMirrorSessions operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeTrafficMirrorSessionsPaginator(const Model::DescribeTrafficMirrorSessionsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeTrafficMirrorTargets operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeTrafficMirrorTargetsPaginator(const Model::DescribeTrafficMirrorTargetsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeTransitGatewayAttachments operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeTransitGatewayAttachmentsPaginator(const Model::DescribeTransitGatewayAttachmentsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeTransitGatewayConnectPeers operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeTransitGatewayConnectPeersPaginator(const Model::DescribeTransitGatewayConnectPeersRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeTransitGatewayConnects operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeTransitGatewayConnectsPaginator(const Model::DescribeTransitGatewayConnectsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeTransitGatewayMulticastDomains operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeTransitGatewayMulticastDomainsPaginator(const Model::DescribeTransitGatewayMulticastDomainsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeTransitGatewayPeeringAttachments operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeTransitGatewayPeeringAttachmentsPaginator(const Model::DescribeTransitGatewayPeeringAttachmentsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeTransitGatewayPolicyTables operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeTransitGatewayPolicyTablesPaginator(const Model::DescribeTransitGatewayPolicyTablesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeTransitGatewayRouteTableAnnouncements operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeTransitGatewayRouteTableAnnouncementsPaginator(const Model::DescribeTransitGatewayRouteTableAnnouncementsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeTransitGatewayRouteTables operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeTransitGatewayRouteTablesPaginator(const Model::DescribeTransitGatewayRouteTablesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeTransitGateways operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeTransitGatewaysPaginator(const Model::DescribeTransitGatewaysRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeTransitGatewayVpcAttachments operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeTransitGatewayVpcAttachmentsPaginator(const Model::DescribeTransitGatewayVpcAttachmentsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeTrunkInterfaceAssociations operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeTrunkInterfaceAssociationsPaginator(const Model::DescribeTrunkInterfaceAssociationsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeVerifiedAccessEndpoints operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeVerifiedAccessEndpointsPaginator(const Model::DescribeVerifiedAccessEndpointsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeVerifiedAccessGroups operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeVerifiedAccessGroupsPaginator(const Model::DescribeVerifiedAccessGroupsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeVerifiedAccessInstanceLoggingConfigurations operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeVerifiedAccessInstanceLoggingConfigurationsPaginator( + const Model::DescribeVerifiedAccessInstanceLoggingConfigurationsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeVerifiedAccessInstances operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeVerifiedAccessInstancesPaginator(const Model::DescribeVerifiedAccessInstancesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeVerifiedAccessTrustProviders operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeVerifiedAccessTrustProvidersPaginator(const Model::DescribeVerifiedAccessTrustProvidersRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeVolumes operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeVolumesPaginator(const Model::DescribeVolumesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeVolumesModifications operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeVolumesModificationsPaginator(const Model::DescribeVolumesModificationsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeVolumeStatus operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeVolumeStatusPaginator(const Model::DescribeVolumeStatusRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeVpcClassicLinkDnsSupport operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeVpcClassicLinkDnsSupportPaginator(const Model::DescribeVpcClassicLinkDnsSupportRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeVpcEndpointConnectionNotifications operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeVpcEndpointConnectionNotificationsPaginator(const Model::DescribeVpcEndpointConnectionNotificationsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeVpcEndpointConnections operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeVpcEndpointConnectionsPaginator(const Model::DescribeVpcEndpointConnectionsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeVpcEndpoints operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeVpcEndpointsPaginator(const Model::DescribeVpcEndpointsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeVpcEndpointServiceConfigurations operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeVpcEndpointServiceConfigurationsPaginator(const Model::DescribeVpcEndpointServiceConfigurationsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeVpcEndpointServicePermissions operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeVpcEndpointServicePermissionsPaginator(const Model::DescribeVpcEndpointServicePermissionsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeVpcPeeringConnections operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeVpcPeeringConnectionsPaginator(const Model::DescribeVpcPeeringConnectionsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeVpcs operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeVpcsPaginator(const Model::DescribeVpcsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for DescribeVpnConcentrators operation + */ + Aws::Utils::Pagination::PagePaginator + DescribeVpnConcentratorsPaginator(const Model::DescribeVpnConcentratorsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for GetAssociatedIpv6PoolCidrs operation + */ + Aws::Utils::Pagination::PagePaginator + GetAssociatedIpv6PoolCidrsPaginator(const Model::GetAssociatedIpv6PoolCidrsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for GetAwsNetworkPerformanceData operation + */ + Aws::Utils::Pagination::PagePaginator + GetAwsNetworkPerformanceDataPaginator(const Model::GetAwsNetworkPerformanceDataRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for GetCapacityManagerMetricData operation + */ + Aws::Utils::Pagination::PagePaginator + GetCapacityManagerMetricDataPaginator(const Model::GetCapacityManagerMetricDataRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for GetCapacityManagerMetricDimensions operation + */ + Aws::Utils::Pagination::PagePaginator + GetCapacityManagerMetricDimensionsPaginator(const Model::GetCapacityManagerMetricDimensionsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for GetGroupsForCapacityReservation operation + */ + Aws::Utils::Pagination::PagePaginator + GetGroupsForCapacityReservationPaginator(const Model::GetGroupsForCapacityReservationRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for GetInstanceTypesFromInstanceRequirements operation + */ + Aws::Utils::Pagination::PagePaginator + GetInstanceTypesFromInstanceRequirementsPaginator(const Model::GetInstanceTypesFromInstanceRequirementsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for GetIpamAddressHistory operation + */ + Aws::Utils::Pagination::PagePaginator + GetIpamAddressHistoryPaginator(const Model::GetIpamAddressHistoryRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for GetIpamDiscoveredAccounts operation + */ + Aws::Utils::Pagination::PagePaginator + GetIpamDiscoveredAccountsPaginator(const Model::GetIpamDiscoveredAccountsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for GetIpamDiscoveredResourceCidrs operation + */ + Aws::Utils::Pagination::PagePaginator + GetIpamDiscoveredResourceCidrsPaginator(const Model::GetIpamDiscoveredResourceCidrsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for GetIpamPoolAllocations operation + */ + Aws::Utils::Pagination::PagePaginator + GetIpamPoolAllocationsPaginator(const Model::GetIpamPoolAllocationsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for GetIpamPoolCidrs operation + */ + Aws::Utils::Pagination::PagePaginator + GetIpamPoolCidrsPaginator(const Model::GetIpamPoolCidrsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for GetIpamPrefixListResolverRules operation + */ + Aws::Utils::Pagination::PagePaginator + GetIpamPrefixListResolverRulesPaginator(const Model::GetIpamPrefixListResolverRulesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for GetIpamPrefixListResolverVersionEntries operation + */ + Aws::Utils::Pagination::PagePaginator + GetIpamPrefixListResolverVersionEntriesPaginator(const Model::GetIpamPrefixListResolverVersionEntriesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for GetIpamPrefixListResolverVersions operation + */ + Aws::Utils::Pagination::PagePaginator + GetIpamPrefixListResolverVersionsPaginator(const Model::GetIpamPrefixListResolverVersionsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for GetIpamResourceCidrs operation + */ + Aws::Utils::Pagination::PagePaginator + GetIpamResourceCidrsPaginator(const Model::GetIpamResourceCidrsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for GetManagedPrefixListAssociations operation + */ + Aws::Utils::Pagination::PagePaginator + GetManagedPrefixListAssociationsPaginator(const Model::GetManagedPrefixListAssociationsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for GetManagedPrefixListEntries operation + */ + Aws::Utils::Pagination::PagePaginator + GetManagedPrefixListEntriesPaginator(const Model::GetManagedPrefixListEntriesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for GetNetworkInsightsAccessScopeAnalysisFindings operation + */ + Aws::Utils::Pagination::PagePaginator + GetNetworkInsightsAccessScopeAnalysisFindingsPaginator(const Model::GetNetworkInsightsAccessScopeAnalysisFindingsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for GetSecurityGroupsForVpc operation + */ + Aws::Utils::Pagination::PagePaginator + GetSecurityGroupsForVpcPaginator(const Model::GetSecurityGroupsForVpcRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for GetSpotPlacementScores operation + */ + Aws::Utils::Pagination::PagePaginator + GetSpotPlacementScoresPaginator(const Model::GetSpotPlacementScoresRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for GetTransitGatewayAttachmentPropagations operation + */ + Aws::Utils::Pagination::PagePaginator + GetTransitGatewayAttachmentPropagationsPaginator(const Model::GetTransitGatewayAttachmentPropagationsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for GetTransitGatewayMulticastDomainAssociations operation + */ + Aws::Utils::Pagination::PagePaginator + GetTransitGatewayMulticastDomainAssociationsPaginator(const Model::GetTransitGatewayMulticastDomainAssociationsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for GetTransitGatewayPolicyTableAssociations operation + */ + Aws::Utils::Pagination::PagePaginator + GetTransitGatewayPolicyTableAssociationsPaginator(const Model::GetTransitGatewayPolicyTableAssociationsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for GetTransitGatewayPrefixListReferences operation + */ + Aws::Utils::Pagination::PagePaginator + GetTransitGatewayPrefixListReferencesPaginator(const Model::GetTransitGatewayPrefixListReferencesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for GetTransitGatewayRouteTableAssociations operation + */ + Aws::Utils::Pagination::PagePaginator + GetTransitGatewayRouteTableAssociationsPaginator(const Model::GetTransitGatewayRouteTableAssociationsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for GetTransitGatewayRouteTablePropagations operation + */ + Aws::Utils::Pagination::PagePaginator + GetTransitGatewayRouteTablePropagationsPaginator(const Model::GetTransitGatewayRouteTablePropagationsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for GetVpnConnectionDeviceTypes operation + */ + Aws::Utils::Pagination::PagePaginator + GetVpnConnectionDeviceTypesPaginator(const Model::GetVpnConnectionDeviceTypesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for ListImagesInRecycleBin operation + */ + Aws::Utils::Pagination::PagePaginator + ListImagesInRecycleBinPaginator(const Model::ListImagesInRecycleBinRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for ListSnapshotsInRecycleBin operation + */ + Aws::Utils::Pagination::PagePaginator + ListSnapshotsInRecycleBinPaginator(const Model::ListSnapshotsInRecycleBinRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for SearchLocalGatewayRoutes operation + */ + Aws::Utils::Pagination::PagePaginator + SearchLocalGatewayRoutesPaginator(const Model::SearchLocalGatewayRoutesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for SearchTransitGatewayMulticastGroups operation + */ + Aws::Utils::Pagination::PagePaginator + SearchTransitGatewayMulticastGroupsPaginator(const Model::SearchTransitGatewayMulticastGroupsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } +}; +} // namespace EC2 +} // namespace Aws diff --git a/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/model/DescribeSpotPriceHistoryPaginationTraits.h b/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/model/DescribeSpotPriceHistoryPaginationTraits.h new file mode 100644 index 000000000000..b46693ff9250 --- /dev/null +++ b/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/model/DescribeSpotPriceHistoryPaginationTraits.h @@ -0,0 +1,35 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ + +#pragma once +#include +#include +#include +#include + +namespace Aws { +namespace EC2 { +class EC2Client; +namespace Pagination { + +struct DescribeSpotPriceHistoryPaginationTraits { + using RequestType = Model::DescribeSpotPriceHistoryRequest; + using ResultType = Model::DescribeSpotPriceHistoryResponse; + using OutcomeType = Model::DescribeSpotPriceHistoryOutcome; + using ClientType = EC2Client; + + template + static OutcomeType Invoke(Client& client, const RequestType& request) { + return client.DescribeSpotPriceHistory(request); + } + + static bool HasMoreResults(const ResultType& result) { return !result.GetNextToken().empty(); } + + static void SetNextRequest(const ResultType& result, RequestType& request) { request.SetNextToken(result.GetNextToken()); } +}; + +} // namespace Pagination +} // namespace EC2 +} // namespace Aws diff --git a/generated/src/aws-cpp-sdk-s3/include/aws/s3/S3Client.h b/generated/src/aws-cpp-sdk-s3/include/aws/s3/S3Client.h index 7e036d82a8c5..65454163aa02 100644 --- a/generated/src/aws-cpp-sdk-s3/include/aws/s3/S3Client.h +++ b/generated/src/aws-cpp-sdk-s3/include/aws/s3/S3Client.h @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -36,7 +37,9 @@ static const unsigned MAX_EXPIRATION_SECONDS = 7 * 24 * 60 * 60; /** *

*/ -class AWS_S3_API S3Client : public Aws::Client::AWSXMLClient, public Aws::Client::ClientWithAsyncTemplateMethods { +class AWS_S3_API S3Client : public Aws::Client::AWSXMLClient, + public Aws::Client::ClientWithAsyncTemplateMethods, + public S3PaginationBase { public: typedef Aws::Client::AWSXMLClient BASECLASS; static const char* GetServiceName(); diff --git a/generated/src/aws-cpp-sdk-s3/include/aws/s3/S3ClientPagination.h b/generated/src/aws-cpp-sdk-s3/include/aws/s3/S3ClientPagination.h new file mode 100644 index 000000000000..c2853b35f652 --- /dev/null +++ b/generated/src/aws-cpp-sdk-s3/include/aws/s3/S3ClientPagination.h @@ -0,0 +1,26 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ + +#pragma once +#include +#include +#include +#include +#include +#include + +namespace Aws { +namespace S3 { + +using ListBucketsPaginator = + Aws::Utils::Pagination::PagePaginator; +using ListDirectoryBucketsPaginator = + Aws::Utils::Pagination::PagePaginator; +using ListObjectsV2Paginator = + Aws::Utils::Pagination::PagePaginator; +using ListPartsPaginator = Aws::Utils::Pagination::PagePaginator; + +} // namespace S3 +} // namespace Aws diff --git a/generated/src/aws-cpp-sdk-s3/include/aws/s3/S3PaginationBase.h b/generated/src/aws-cpp-sdk-s3/include/aws/s3/S3PaginationBase.h new file mode 100644 index 000000000000..d7156cc705e7 --- /dev/null +++ b/generated/src/aws-cpp-sdk-s3/include/aws/s3/S3PaginationBase.h @@ -0,0 +1,62 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ + +#pragma once + +#include +#include +#include +#include +#include + +#include + +namespace Aws { +namespace S3 { + +class S3Client; + +template +class S3PaginationBase { + public: + /** + * Create a paginator for ListBuckets operation + */ + Aws::Utils::Pagination::PagePaginator + ListBucketsPaginator(const Model::ListBucketsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for ListDirectoryBuckets operation + */ + Aws::Utils::Pagination::PagePaginator + ListDirectoryBucketsPaginator(const Model::ListDirectoryBucketsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for ListObjectsV2 operation + */ + Aws::Utils::Pagination::PagePaginator + ListObjectsV2Paginator(const Model::ListObjectsV2Request& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } + + /** + * Create a paginator for ListParts operation + */ + Aws::Utils::Pagination::PagePaginator ListPartsPaginator( + const Model::ListPartsRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } +}; +} // namespace S3 +} // namespace Aws diff --git a/generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListBucketsPaginationTraits.h b/generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListBucketsPaginationTraits.h new file mode 100644 index 000000000000..272aabe4e831 --- /dev/null +++ b/generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListBucketsPaginationTraits.h @@ -0,0 +1,37 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ + +#pragma once +#include +#include +#include +#include + +namespace Aws { +namespace S3 { +class S3Client; +namespace Pagination { + +struct ListBucketsPaginationTraits { + using RequestType = Model::ListBucketsRequest; + using ResultType = Model::ListBucketsResult; + using OutcomeType = Model::ListBucketsOutcome; + using ClientType = S3Client; + + template + static OutcomeType Invoke(Client& client, const RequestType& request) { + return client.ListBuckets(request); + } + + static bool HasMoreResults(const ResultType& result) { return !result.GetContinuationToken().empty(); } + + static void SetNextRequest(const ResultType& result, RequestType& request) { + request.SetContinuationToken(result.GetContinuationToken()); + } +}; + +} // namespace Pagination +} // namespace S3 +} // namespace Aws diff --git a/generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListDirectoryBucketsPaginationTraits.h b/generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListDirectoryBucketsPaginationTraits.h new file mode 100644 index 000000000000..558e26aa71c8 --- /dev/null +++ b/generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListDirectoryBucketsPaginationTraits.h @@ -0,0 +1,37 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ + +#pragma once +#include +#include +#include +#include + +namespace Aws { +namespace S3 { +class S3Client; +namespace Pagination { + +struct ListDirectoryBucketsPaginationTraits { + using RequestType = Model::ListDirectoryBucketsRequest; + using ResultType = Model::ListDirectoryBucketsResult; + using OutcomeType = Model::ListDirectoryBucketsOutcome; + using ClientType = S3Client; + + template + static OutcomeType Invoke(Client& client, const RequestType& request) { + return client.ListDirectoryBuckets(request); + } + + static bool HasMoreResults(const ResultType& result) { return !result.GetContinuationToken().empty(); } + + static void SetNextRequest(const ResultType& result, RequestType& request) { + request.SetContinuationToken(result.GetContinuationToken()); + } +}; + +} // namespace Pagination +} // namespace S3 +} // namespace Aws diff --git a/generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListObjectsV2PaginationTraits.h b/generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListObjectsV2PaginationTraits.h new file mode 100644 index 000000000000..a8968e1a0d03 --- /dev/null +++ b/generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListObjectsV2PaginationTraits.h @@ -0,0 +1,37 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ + +#pragma once +#include +#include +#include +#include + +namespace Aws { +namespace S3 { +class S3Client; +namespace Pagination { + +struct ListObjectsV2PaginationTraits { + using RequestType = Model::ListObjectsV2Request; + using ResultType = Model::ListObjectsV2Result; + using OutcomeType = Model::ListObjectsV2Outcome; + using ClientType = S3Client; + + template + static OutcomeType Invoke(Client& client, const RequestType& request) { + return client.ListObjectsV2(request); + } + + static bool HasMoreResults(const ResultType& result) { return !result.GetNextContinuationToken().empty(); } + + static void SetNextRequest(const ResultType& result, RequestType& request) { + request.SetContinuationToken(result.GetNextContinuationToken()); + } +}; + +} // namespace Pagination +} // namespace S3 +} // namespace Aws diff --git a/generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListPartsPaginationTraits.h b/generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListPartsPaginationTraits.h new file mode 100644 index 000000000000..78ce1d6b4b1f --- /dev/null +++ b/generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListPartsPaginationTraits.h @@ -0,0 +1,37 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ + +#pragma once +#include +#include +#include +#include + +namespace Aws { +namespace S3 { +class S3Client; +namespace Pagination { + +struct ListPartsPaginationTraits { + using RequestType = Model::ListPartsRequest; + using ResultType = Model::ListPartsResult; + using OutcomeType = Model::ListPartsOutcome; + using ClientType = S3Client; + + template + static OutcomeType Invoke(Client& client, const RequestType& request) { + return client.ListParts(request); + } + + static bool HasMoreResults(const ResultType& result) { return result.GetNextPartNumberMarker() != 0; } + + static void SetNextRequest(const ResultType& result, RequestType& request) { + request.SetPartNumberMarker(result.GetNextPartNumberMarker()); + } +}; + +} // namespace Pagination +} // namespace S3 +} // namespace Aws diff --git a/generated/tests/dynamodb-gen-tests/DynamoDBPaginationCompilationTests.cpp b/generated/tests/dynamodb-gen-tests/DynamoDBPaginationCompilationTests.cpp new file mode 100644 index 000000000000..2cf383ab5857 --- /dev/null +++ b/generated/tests/dynamodb-gen-tests/DynamoDBPaginationCompilationTests.cpp @@ -0,0 +1,28 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ + +// Header compilation test for DynamoDB pagination headers +// This test ensures all generated pagination headers compile successfully + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +class DynamoDBPaginationCompilationTest : public Aws::Testing::AwsCppSdkGTestSuite +{ +}; + +TEST_F(DynamoDBPaginationCompilationTest, DynamoDBPaginationHeadersCompile) +{ + // Test passes if compilation succeeds + SUCCEED(); +} diff --git a/generated/tests/ec2-gen-tests/EC2PaginationCompilationTests.cpp b/generated/tests/ec2-gen-tests/EC2PaginationCompilationTests.cpp new file mode 100644 index 000000000000..9a477cb17b1a --- /dev/null +++ b/generated/tests/ec2-gen-tests/EC2PaginationCompilationTests.cpp @@ -0,0 +1,185 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ + +// Header compilation test for EC2 pagination headers +// This test ensures all generated pagination headers compile successfully + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +class EC2PaginationCompilationTest : public Aws::Testing::AwsCppSdkGTestSuite +{ +}; + +TEST_F(EC2PaginationCompilationTest, EC2PaginationHeadersCompile) +{ + // Test passes if compilation succeeds + SUCCEED(); +} diff --git a/generated/tests/s3-gen-tests/S3PaginationCompilationTests.cpp b/generated/tests/s3-gen-tests/S3PaginationCompilationTests.cpp new file mode 100644 index 000000000000..d35f2a6692e6 --- /dev/null +++ b/generated/tests/s3-gen-tests/S3PaginationCompilationTests.cpp @@ -0,0 +1,26 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ + +// Header compilation test for S3 pagination headers +// This test ensures all generated pagination headers compile successfully + +#include +#include +#include +#include +#include +#include + +#include + +class S3PaginationCompilationTest : public Aws::Testing::AwsCppSdkGTestSuite +{ +}; + +TEST_F(S3PaginationCompilationTest, S3PaginationHeadersCompile) +{ + // Test passes if compilation succeeds + SUCCEED(); +} diff --git a/tests/aws-cpp-sdk-dynamodb-integration-tests/ScanPaginationIntegrationTest.cpp b/tests/aws-cpp-sdk-dynamodb-integration-tests/ScanPaginationIntegrationTest.cpp new file mode 100644 index 000000000000..e5c5bd86dcab --- /dev/null +++ b/tests/aws-cpp-sdk-dynamodb-integration-tests/ScanPaginationIntegrationTest.cpp @@ -0,0 +1,214 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ + +// TODO: Uncomment and test to identify which integration test is the bottleneck +/* +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace Aws; +using namespace Aws::DynamoDB; +using namespace Aws::DynamoDB::Model; + +namespace { + static const char* ALLOCATION_TAG = "ScanPaginationTest"; + const size_t ITEM_COUNT = 19; + const Aws::String HASH_KEY_NAME = "id"; + const Aws::String ATTRIBUTE_FOO = "attribute_foo"; +} + +class ScanPaginationTest : public Aws::Testing::AwsCppSdkGTestSuite { +protected: + std::shared_ptr dynamoClient; + Aws::String tableName; + + void SetUp() override { + dynamoClient = Aws::MakeShared(ALLOCATION_TAG); + tableName = CalculateTableName("scan-paginator-test"); + + CreateTable(); + PutTestData(); + } + + void TearDown() override { + DeleteTableRequest deleteRequest; + deleteRequest.SetTableName(tableName); + dynamoClient->DeleteTable(deleteRequest); + } + + Aws::String CalculateTableName(const Aws::String& tablePrefix) { + return Aws::Testing::GetAwsResourcePrefix() + tablePrefix; + } + + void CreateTable() { + CreateTableRequest createRequest; + createRequest.SetTableName(tableName); + + KeySchemaElement keySchema; + keySchema.SetKeyType(KeyType::HASH); + keySchema.SetAttributeName(HASH_KEY_NAME); + createRequest.AddKeySchema(keySchema); + + AttributeDefinition attrDef; + attrDef.SetAttributeType(ScalarAttributeType::N); + attrDef.SetAttributeName(HASH_KEY_NAME); + createRequest.AddAttributeDefinitions(attrDef); + + ProvisionedThroughput throughput; + throughput.SetReadCapacityUnits(5); + throughput.SetWriteCapacityUnits(5); + createRequest.SetProvisionedThroughput(throughput); + + auto outcome = dynamoClient->CreateTable(createRequest); + AWS_ASSERT_SUCCESS(outcome); + + WaitUntilActive(tableName); + } + + DescribeTableResult WaitUntilActive(const Aws::String& tableNameParam) { + DescribeTableRequest describeTableRequest; + describeTableRequest.SetTableName(tableNameParam); + + DescribeTableOutcome outcome = dynamoClient->DescribeTable(describeTableRequest); + while (outcome.IsSuccess() && outcome.GetResult().GetTable().GetTableStatus() != TableStatus::ACTIVE) { + std::this_thread::sleep_for(std::chrono::seconds(1)); + outcome = dynamoClient->DescribeTable(describeTableRequest); + } + + return outcome.GetResult(); + } + + void PutTestData() { + for (size_t i = 0; i < ITEM_COUNT; ++i) { + PutItemRequest putRequest; + putRequest.SetTableName(tableName); + + Aws::Map item; + item[HASH_KEY_NAME] = AttributeValue().SetN(Aws::Utils::StringUtils::to_string(i)); + item[ATTRIBUTE_FOO] = AttributeValue().SetN(Aws::Utils::StringUtils::to_string(i * 2)); + + putRequest.SetItem(item); + auto outcome = dynamoClient->PutItem(putRequest); + ASSERT_TRUE(outcome.IsSuccess()); + } + } +}; + +TEST_F(ScanPaginationTest, TestMultipleIterationOnResponses) { + ScanRequest request; + request.SetTableName(tableName); + request.SetConsistentRead(true); + request.SetLimit(2); + + size_t count = 0; + auto outcome = dynamoClient->Scan(request); + + // First iteration + while (outcome.IsSuccess()) { + const auto& result = outcome.GetResult(); + count += result.GetCount(); + + if (!Aws::DynamoDB::Pagination::ScanPaginationTraits::HasMoreResults(result)) { + break; + } + + Aws::DynamoDB::Pagination::ScanPaginationTraits::SetNextRequest(result, request); + outcome = dynamoClient->Scan(request); + } + + EXPECT_EQ(ITEM_COUNT, count); + + // Reset for second iteration + request = ScanRequest(); + request.SetTableName(tableName); + request.SetConsistentRead(true); + request.SetLimit(2); + + count = 0; + outcome = dynamoClient->Scan(request); + + // Second iteration + while (outcome.IsSuccess()) { + const auto& result = outcome.GetResult(); + count += result.GetCount(); + + if (!Aws::DynamoDB::Pagination::ScanPaginationTraits::HasMoreResults(result)) { + break; + } + + Aws::DynamoDB::Pagination::ScanPaginationTraits::SetNextRequest(result, request); + outcome = dynamoClient->Scan(request); + } + + EXPECT_EQ(ITEM_COUNT, count); +} + +TEST_F(ScanPaginationTest, TestPaginationWithLimit) { + ScanRequest request; + request.SetTableName(tableName); + request.SetConsistentRead(true); + request.SetLimit(3); + + size_t totalItems = 0; + size_t pageCount = 0; + auto outcome = dynamoClient->Scan(request); + + while (outcome.IsSuccess()) { + const auto& result = outcome.GetResult(); + totalItems += result.GetCount(); + pageCount++; + + if (!Aws::DynamoDB::Pagination::ScanPaginationTraits::HasMoreResults(result)) { + break; + } + + Aws::DynamoDB::Pagination::ScanPaginationTraits::SetNextRequest(result, request); + outcome = dynamoClient->Scan(request); + } + + EXPECT_EQ(ITEM_COUNT, totalItems); + EXPECT_GT(pageCount, 1u); // Should have multiple pages with limit=3 +} + +TEST_F(ScanPaginationTest, TestManualPaginationWithExclusiveStartKey) { + ScanRequest request; + request.SetTableName(tableName); + request.SetConsistentRead(true); + request.SetLimit(5); + + Aws::Vector> allItems; + + do { + auto outcome = dynamoClient->Scan(request); + ASSERT_TRUE(outcome.IsSuccess()); + + const auto& result = outcome.GetResult(); + for (const auto& item : result.GetItems()) { + allItems.push_back(item); + } + + if (!result.GetLastEvaluatedKey().empty()) { + request.SetExclusiveStartKey(result.GetLastEvaluatedKey()); + } else { + break; + } + } while (true); + + EXPECT_EQ(ITEM_COUNT, allItems.size()); +} +*/ \ No newline at end of file diff --git a/tests/aws-cpp-sdk-ec2-integration-tests/EC2PaginationIntegrationTest.cpp b/tests/aws-cpp-sdk-ec2-integration-tests/EC2PaginationIntegrationTest.cpp new file mode 100644 index 000000000000..142ccde5a1d2 --- /dev/null +++ b/tests/aws-cpp-sdk-ec2-integration-tests/EC2PaginationIntegrationTest.cpp @@ -0,0 +1,156 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ + +// TODO: Update these tests to use the new paginator API directly: +// For example: for (const auto& outcome : ec2Client->DescribeSpotPriceHistoryPaginator(request)) { ... } +// instead of manual pagination with traits + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace Aws; +using namespace Aws::EC2; +using namespace Aws::EC2::Model; + +namespace { + static const char* ALLOCATION_TAG = "EC2PaginationTest"; +} + +class EC2PaginationTest : public Aws::Testing::AwsCppSdkGTestSuite { +protected: + std::shared_ptr ec2Client; + + void SetUp() override { + Aws::SDKOptions options; + Aws::InitAPI(options); + + Aws::Client::ClientConfiguration config; + config.region = "us-east-1"; + ec2Client = Aws::MakeShared(ALLOCATION_TAG, config); + } + + void TearDown() override { + Aws::SDKOptions options; + Aws::ShutdownAPI(options); + } +}; + +TEST_F(EC2PaginationTest, TestSpotPriceHistoryPagination) { + DescribeSpotPriceHistoryRequest request; + request.SetAvailabilityZone("us-east-1a"); + request.AddProductDescriptions("Linux/UNIX (Amazon VPC)"); + request.AddInstanceTypes(InstanceType::t1_micro); + request.SetStartTime(Aws::Utils::DateTime::Now() - std::chrono::milliseconds(1)); + request.SetMaxResults(10); + + size_t totalSpotPrices = 0; + auto outcome = ec2Client->DescribeSpotPriceHistory(request); + + while (outcome.IsSuccess()) { + const auto& result = outcome.GetResult(); + totalSpotPrices += result.GetSpotPriceHistory().size(); + + if (!Aws::EC2::Pagination::DescribeSpotPriceHistoryPaginationTraits::HasMoreResults(result)) { + break; + } + + Aws::EC2::Pagination::DescribeSpotPriceHistoryPaginationTraits::SetNextRequest(result, request); + outcome = ec2Client->DescribeSpotPriceHistory(request); + } + + ASSERT_TRUE(outcome.IsSuccess()); + // Should have at least one spot price entry + EXPECT_GE(totalSpotPrices, 1u); +} + +TEST_F(EC2PaginationTest, TestSpotPriceHistoryMultipleIteration) { + DescribeSpotPriceHistoryRequest request; + request.SetAvailabilityZone("us-east-1a"); + request.AddProductDescriptions("Linux/UNIX (Amazon VPC)"); + request.AddInstanceTypes(InstanceType::t1_micro); + request.SetStartTime(Aws::Utils::DateTime::Now() - std::chrono::milliseconds(1)); + request.SetMaxResults(5); + + // First iteration + size_t firstCount = 0; + auto outcome = ec2Client->DescribeSpotPriceHistory(request); + + while (outcome.IsSuccess()) { + const auto& result = outcome.GetResult(); + firstCount += result.GetSpotPriceHistory().size(); + + if (!Aws::EC2::Pagination::DescribeSpotPriceHistoryPaginationTraits::HasMoreResults(result)) { + break; + } + + Aws::EC2::Pagination::DescribeSpotPriceHistoryPaginationTraits::SetNextRequest(result, request); + outcome = ec2Client->DescribeSpotPriceHistory(request); + } + + ASSERT_TRUE(outcome.IsSuccess()); + + // Reset for second iteration + request = DescribeSpotPriceHistoryRequest(); + request.SetAvailabilityZone("us-east-1a"); + request.AddProductDescriptions("Linux/UNIX (Amazon VPC)"); + request.AddInstanceTypes(InstanceType::t1_micro); + request.SetStartTime(Aws::Utils::DateTime::Now() - std::chrono::milliseconds(1)); + request.SetMaxResults(5); + + // Second iteration + size_t secondCount = 0; + outcome = ec2Client->DescribeSpotPriceHistory(request); + + while (outcome.IsSuccess()) { + const auto& result = outcome.GetResult(); + secondCount += result.GetSpotPriceHistory().size(); + + if (!Aws::EC2::Pagination::DescribeSpotPriceHistoryPaginationTraits::HasMoreResults(result)) { + break; + } + + Aws::EC2::Pagination::DescribeSpotPriceHistoryPaginationTraits::SetNextRequest(result, request); + outcome = ec2Client->DescribeSpotPriceHistory(request); + } + + ASSERT_TRUE(outcome.IsSuccess()); + EXPECT_EQ(firstCount, secondCount); // Should get same results +} + +TEST_F(EC2PaginationTest, TestManualPaginationWithNextToken) { + DescribeSpotPriceHistoryRequest request; + request.SetAvailabilityZone("us-east-1a"); + request.AddProductDescriptions("Linux/UNIX (Amazon VPC)"); + request.AddInstanceTypes(InstanceType::t1_micro); + request.SetStartTime(Aws::Utils::DateTime::Now() - std::chrono::hours(24)); // Last 24 hours for more data + request.SetMaxResults(3); + + Aws::Vector allSpotPrices; + + do { + auto outcome = ec2Client->DescribeSpotPriceHistory(request); + ASSERT_TRUE(outcome.IsSuccess()); + + const auto& result = outcome.GetResult(); + for (const auto& spotPrice : result.GetSpotPriceHistory()) { + allSpotPrices.push_back(spotPrice); + } + + if (!result.GetNextToken().empty()) { + request.SetNextToken(result.GetNextToken()); + } else { + break; + } + } while (true); + + // Should have at least some spot price data + EXPECT_GE(allSpotPrices.size(), 1u); +} \ No newline at end of file diff --git a/tests/aws-cpp-sdk-s3-integration-tests/ListObjectsV2PaginationIntegrationTest.cpp b/tests/aws-cpp-sdk-s3-integration-tests/ListObjectsV2PaginationIntegrationTest.cpp new file mode 100644 index 000000000000..da829edc337f --- /dev/null +++ b/tests/aws-cpp-sdk-s3-integration-tests/ListObjectsV2PaginationIntegrationTest.cpp @@ -0,0 +1,264 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ + +// TODO: Uncomment and test to identify which integration test is the bottleneck +/* +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace Aws; +using namespace Aws::S3; +using namespace Aws::S3::Model; + +namespace { + static const char* ALLOCATION_TAG = "ListObjectsV2PaginationTest"; + static const char* TEST_BUCKET_TAG = "IntegrationTestResource"; + static const int TIMEOUT_MAX = 20; + const size_t OBJECT_COUNT = 15; + const size_t MAX_KEYS = 3; +} + +class ListObjectsV2PaginationTest : public Aws::Testing::AwsCppSdkGTestSuite { +protected: + std::shared_ptr Client; + Aws::String bucketName; + Aws::String emptyBucketName; + + void SetUp() override { + Aws::Client::ClientConfiguration config; + config.region = Aws::Region::US_EAST_1; + config.scheme = Aws::Http::Scheme::HTTPS; + config.connectTimeoutMs = 30000; + config.requestTimeoutMs = 30000; + + Client = Aws::MakeShared(ALLOCATION_TAG, config); + + bucketName = CalculateBucketName("listobjectsv2paginationtest"); + emptyBucketName = CalculateBucketName("listobjectsv2emptytest"); + + CreateBucketRequest createRequest; + createRequest.SetBucket(bucketName); + createRequest.SetACL(BucketCannedACL::private_); + auto createOutcome = Client->CreateBucket(createRequest); + AWS_ASSERT_SUCCESS(createOutcome); + + createRequest.SetBucket(emptyBucketName); + createOutcome = Client->CreateBucket(createRequest); + AWS_ASSERT_SUCCESS(createOutcome); + + ASSERT_TRUE(WaitForBucketToPropagate(bucketName)); + ASSERT_TRUE(WaitForBucketToPropagate(emptyBucketName)); + TagTestBucket(bucketName); + TagTestBucket(emptyBucketName); + + // Create test objects + for (size_t i = 1; i <= OBJECT_COUNT; ++i) { + Aws::StringStream ss; + ss << "key-" << std::setfill('0') << std::setw(2) << i; + CreateTestObject(ss.str()); + } + } + + void TearDown() override { + DeleteBucket(bucketName); + DeleteBucket(emptyBucketName); + Client = nullptr; + } + + static void TagTestBucket(const Aws::String& bucketName, const std::shared_ptr& client) { + ASSERT_TRUE(!bucketName.empty()); + ASSERT_TRUE(client); + + PutBucketTaggingRequest taggingRequest; + taggingRequest.SetBucket(bucketName); + Tag tag; + tag.SetKey(TEST_BUCKET_TAG); + tag.SetValue(TEST_BUCKET_TAG); + Tagging tagging; + tagging.AddTagSet(tag); + taggingRequest.SetTagging(tagging); + + auto taggingOutcome = client->PutBucketTagging(taggingRequest); + AWS_ASSERT_SUCCESS(taggingOutcome); + } + + void TagTestBucket(const Aws::String& bucketNameParam) { + TagTestBucket(bucketNameParam, Client); + } + + bool WaitForBucketToPropagate(const Aws::String& bucketNameParam) { + unsigned timeoutCount = 0; + while (timeoutCount++ < TIMEOUT_MAX) { + ListObjectsV2Request listRequest; + listRequest.SetBucket(bucketNameParam); + auto listOutcome = Client->ListObjectsV2(listRequest); + if (listOutcome.IsSuccess()) { + return true; + } + std::this_thread::sleep_for(std::chrono::seconds(10)); + } + return false; + } + + void EmptyBucket(const Aws::String& bucketNameParam) { + ListObjectsV2Request listObjectsRequest; + listObjectsRequest.SetBucket(bucketNameParam); + + ListObjectsV2Outcome listObjectsOutcome = Client->ListObjectsV2(listObjectsRequest); + + if (!listObjectsOutcome.IsSuccess()) + return; + + for (const auto& object : listObjectsOutcome.GetResult().GetContents()) { + DeleteObjectRequest deleteObjectRequest; + deleteObjectRequest.SetBucket(bucketNameParam); + deleteObjectRequest.SetKey(object.GetKey()); + auto deleteObjectOutcome = Client->DeleteObject(deleteObjectRequest); + AWS_ASSERT_SUCCESS(deleteObjectOutcome); + } + } + + void WaitForBucketToEmpty(const Aws::String& bucketNameParam) { + ListObjectsV2Request listObjectsRequest; + listObjectsRequest.SetBucket(bucketNameParam); + + unsigned checkForObjectsCount = 0; + while (checkForObjectsCount++ < TIMEOUT_MAX) { + ListObjectsV2Outcome listObjectsOutcome = Client->ListObjectsV2(listObjectsRequest); + AWS_EXPECT_SUCCESS(listObjectsOutcome); + + if (listObjectsOutcome.GetResult().GetContents().size() > 0) { + std::this_thread::sleep_for(std::chrono::seconds(5)); + } else { + break; + } + } + } + + void DeleteBucket(const Aws::String& bucketNameParam) { + HeadBucketRequest headBucketRequest; + headBucketRequest.SetBucket(bucketNameParam); + HeadBucketOutcome bucketOutcome = Client->HeadBucket(headBucketRequest); + + if (bucketOutcome.IsSuccess()) { + EmptyBucket(bucketNameParam); + WaitForBucketToEmpty(bucketNameParam); + + DeleteBucketRequest deleteBucketRequest; + deleteBucketRequest.SetBucket(bucketNameParam); + + DeleteBucketOutcome deleteBucketOutcome = Client->DeleteBucket(deleteBucketRequest); + AWS_EXPECT_SUCCESS(deleteBucketOutcome); + } + } + + static Aws::String CalculateBucketName(const Aws::String& bucketPrefix) { + return Aws::Testing::GetAwsResourcePrefix() + bucketPrefix; + } + + void CreateTestObject(const Aws::String& key) { + PutObjectRequest putRequest; + putRequest.SetBucket(bucketName); + putRequest.SetKey(key); + + auto data = Aws::MakeShared(ALLOCATION_TAG); + *data << "Test data for " << key; + putRequest.SetBody(data); + + auto putOutcome = Client->PutObject(putRequest); + AWS_ASSERT_SUCCESS(putOutcome); + } +}; + +TEST_F(ListObjectsV2PaginationTest, TestPaginationOnEmptyBucket) { + ListObjectsV2Request request; + request.SetBucket(emptyBucketName); + request.SetMaxKeys(MAX_KEYS); + + size_t objectCount = 0; + auto outcome = Client->ListObjectsV2(request); + + while (outcome.IsSuccess()) { + const auto& result = outcome.GetResult(); + objectCount += result.GetContents().size(); + + if (!Aws::S3::Pagination::ListObjectsV2PaginationTraits::HasMoreResults(result)) { + break; + } + + Aws::S3::Pagination::ListObjectsV2PaginationTraits::SetNextRequest(result, request); + outcome = Client->ListObjectsV2(request); + } + + AWS_ASSERT_SUCCESS(outcome); + EXPECT_EQ(0u, objectCount); +} + +TEST_F(ListObjectsV2PaginationTest, TestPaginationOnNonEmptyBucket) { + ListObjectsV2Request request; + request.SetBucket(bucketName); + request.SetMaxKeys(MAX_KEYS); + + size_t objectCount = 0; + size_t pageCount = 0; + auto outcome = Client->ListObjectsV2(request); + + while (outcome.IsSuccess()) { + const auto& result = outcome.GetResult(); + objectCount += result.GetContents().size(); + pageCount++; + + if (!Aws::S3::Pagination::ListObjectsV2PaginationTraits::HasMoreResults(result)) { + break; + } + + Aws::S3::Pagination::ListObjectsV2PaginationTraits::SetNextRequest(result, request); + outcome = Client->ListObjectsV2(request); + } + + AWS_ASSERT_SUCCESS(outcome); + EXPECT_EQ(OBJECT_COUNT, objectCount); + EXPECT_GT(pageCount, 1u); // Should have multiple pages with MaxKeys=3 +} + +TEST_F(ListObjectsV2PaginationTest, TestManualPaginationLoop) { + ListObjectsV2Request request; + request.SetBucket(bucketName); + request.SetMaxKeys(MAX_KEYS); + + Aws::Vector allKeys; + + do { + auto outcome = Client->ListObjectsV2(request); + AWS_ASSERT_SUCCESS(outcome); + + const auto& result = outcome.GetResult(); + for (const auto& object : result.GetContents()) { + allKeys.push_back(object.GetKey()); + } + + if (!result.GetIsTruncated()) { + break; + } + + request.SetContinuationToken(result.GetNextContinuationToken()); + } while (true); + + EXPECT_EQ(OBJECT_COUNT, allKeys.size()); +} +*/ \ No newline at end of file diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/json/JsonServiceClientHeader.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/json/JsonServiceClientHeader.vm index afc2578fc11e..be9467bd20e7 100644 --- a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/json/JsonServiceClientHeader.vm +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/json/JsonServiceClientHeader.vm @@ -11,6 +11,7 @@ \#include \#include \#include +\#include namespace ${rootNamespace} { @@ -25,7 +26,7 @@ namespace ${serviceNamespace} #if($serviceModel.enableVirtualOperations) #set($finalClass = "") #end - class ${CppViewHelper.computeExportValue($metadata.classNamePrefix)} ${className}${finalClass} : public Aws::Client::AWSJsonClient, public Aws::Client::ClientWithAsyncTemplateMethods<${className}> + class ${CppViewHelper.computeExportValue($metadata.classNamePrefix)} ${className}${finalClass} : public Aws::Client::AWSJsonClient, public Aws::Client::ClientWithAsyncTemplateMethods<${className}>, public ${metadata.classNamePrefix}PaginationBase<${className}> { public: typedef Aws::Client::AWSJsonClient BASECLASS; diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/S3ClientHeader.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/S3ClientHeader.vm index fe7385b9efa5..4d2b11c58ad7 100644 --- a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/S3ClientHeader.vm +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/s3/S3ClientHeader.vm @@ -22,6 +22,7 @@ \#include \#include \#include +\#include #if($serviceNamespace == "S3Crt") \#include \#include @@ -94,7 +95,7 @@ namespace ${rootNamespace} #if($serviceModel.enableVirtualOperations) #set($finalClass = "") #end - class ${CppViewHelper.computeExportValue($metadata.classNamePrefix)} ${className}${finalClass} : public Aws::Client::AWSXMLClient, public Aws::Client::ClientWithAsyncTemplateMethods<${className}> + class ${CppViewHelper.computeExportValue($metadata.classNamePrefix)} ${className}${finalClass} : public Aws::Client::AWSXMLClient, public Aws::Client::ClientWithAsyncTemplateMethods<${className}>, public ${metadata.classNamePrefix}PaginationBase<${className}> { public: typedef Aws::Client::AWSXMLClient BASECLASS; diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/smithy/SmithyClientHeader.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/smithy/SmithyClientHeader.vm index da58148a0909..37932a673031 100644 --- a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/smithy/SmithyClientHeader.vm +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/smithy/SmithyClientHeader.vm @@ -17,6 +17,7 @@ \#include \#include \#include +\#include \#include #if($serviceModel.hasBearerAuth()) \#include @@ -56,7 +57,8 @@ namespace ${serviceNamespace} ${metadata.classNamePrefix}EndpointProviderBase, smithy::client::$serializer, smithy::client::$serializerOutcome, - Aws::Client::${metadata.classNamePrefix}ErrorMarshaller> + Aws::Client::${metadata.classNamePrefix}ErrorMarshaller>, + public ${metadata.classNamePrefix}PaginationBase<${className}> { public: static const char* GetServiceName(); diff --git a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/XmlServiceClientHeader.vm b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/XmlServiceClientHeader.vm index 9112307c5039..e63b11a64561 100644 --- a/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/XmlServiceClientHeader.vm +++ b/tools/code-generation/generator/src/main/resources/com/amazonaws/util/awsclientgenerator/velocity/cpp/xml/XmlServiceClientHeader.vm @@ -12,6 +12,7 @@ \#include \#include \#include +\#include namespace ${rootNamespace} { @@ -26,7 +27,7 @@ namespace ${serviceNamespace} #if($serviceModel.enableVirtualOperations) #set($finalClass = "") #end - class ${CppViewHelper.computeExportValue($metadata.classNamePrefix)} ${className}$finalClass : public Aws::Client::AWSXMLClient, public Aws::Client::ClientWithAsyncTemplateMethods<${className}> + class ${CppViewHelper.computeExportValue($metadata.classNamePrefix)} ${className}$finalClass : public Aws::Client::AWSXMLClient, public Aws::Client::ClientWithAsyncTemplateMethods<${className}>, public ${metadata.classNamePrefix}PaginationBase<${className}> { public: typedef Aws::Client::AWSXMLClient BASECLASS; diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/build.gradle.kts b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/build.gradle.kts new file mode 100644 index 000000000000..d929cca7cbb1 --- /dev/null +++ b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/build.gradle.kts @@ -0,0 +1,18 @@ +plugins { + `java-library` +} + +repositories { + mavenLocal() + mavenCentral() +} + +dependencies { + implementation("software.amazon.smithy:smithy-model:1.51.0") + implementation("software.amazon.smithy:smithy-codegen-core:1.51.0") + implementation("software.amazon.smithy:smithy-aws-traits:1.51.0") + implementation("software.amazon.smithy:smithy-waiters:1.51.0") + implementation("software.amazon.smithy:smithy-rules-engine:1.51.0") + implementation("software.amazon.smithy:smithy-aws-endpoints:1.51.0") + implementation("software.amazon.smithy:smithy-aws-iam-traits:1.51.0") +} diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ClientCodegenSettings.java b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ClientCodegenSettings.java new file mode 100644 index 000000000000..f992d3b76df1 --- /dev/null +++ b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ClientCodegenSettings.java @@ -0,0 +1,20 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ +package com.amazonaws.util.awsclientsmithygenerator.generators; + +import software.amazon.smithy.model.node.ObjectNode; +import software.amazon.smithy.model.shapes.ShapeId; + +public class ClientCodegenSettings { + private final ShapeId service; + + public ClientCodegenSettings(ObjectNode settings) { + this.service = ShapeId.from(settings.expectStringMember("service").getValue()); + } + + public ShapeId getService() { + return service; + } +} \ No newline at end of file diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CompilationTestParser.java b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CompilationTestParser.java new file mode 100644 index 000000000000..7c8d4ed41312 --- /dev/null +++ b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CompilationTestParser.java @@ -0,0 +1,45 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ +package com.amazonaws.util.awsclientsmithygenerator.generators; + +import software.amazon.smithy.build.PluginContext; +import software.amazon.smithy.model.shapes.*; +import software.amazon.smithy.aws.traits.ServiceTrait; +import com.amazonaws.util.awsclientsmithygenerator.generators.CppWriter; +import com.amazonaws.util.awsclientsmithygenerator.generators.ServiceNameUtil; +import java.util.*; +import java.util.function.Consumer; + +public class CompilationTestParser { + private final ServiceShape service; + private final CppWriterDelegator writerDelegator; + private final String testType; + private final Consumer renderFunction; + private final Map serviceMap; + + public CompilationTestParser(PluginContext context, ServiceShape service, List operations, + String testType, Consumer renderFunction, Map serviceMap) { + this.service = service; + this.writerDelegator = new CppWriterDelegator(context.getFileManifest()); + this.testType = testType; + this.renderFunction = renderFunction; + this.serviceMap = serviceMap; + } + + public void run() { + generateCompilationTest(); + writerDelegator.flushWriters(); + } + + private void generateCompilationTest() { + String serviceName = ServiceNameUtil.getServiceName(service); + String c2jServiceName = ServiceNameUtil.getSmithyServiceName(service, serviceMap); + + writerDelegator.useFileWriter( + "generated/tests/" + c2jServiceName + "-gen-tests/" + serviceName + testType + "CompilationTests.cpp", + renderFunction + ); + } +} \ No newline at end of file diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CppImportContainer.java b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CppImportContainer.java new file mode 100644 index 000000000000..8c26688ae5f0 --- /dev/null +++ b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CppImportContainer.java @@ -0,0 +1,36 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ +package com.amazonaws.util.awsclientsmithygenerator.generators; + +import software.amazon.smithy.codegen.core.ImportContainer; +import software.amazon.smithy.codegen.core.Symbol; +import java.util.HashSet; +import java.util.Set; + +/** + * CppImportContainer tracks symbols used in code generation. + * For C++, we handle includes manually via writeInclude method. + */ +public class CppImportContainer implements ImportContainer { + private final Set imports = new HashSet<>(); + + @Override + public void importSymbol(Symbol symbol, String alias) { + // Track the symbol's namespace for potential future use + if (symbol.getNamespace() != null && !symbol.getNamespace().isEmpty()) { + imports.add(symbol.getNamespace()); + } + } + + public Set getImports() { + return imports; + } + + @Override + public String toString() { + // Return empty string since we handle includes manually + return ""; + } +} \ No newline at end of file diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CppWriter.java b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CppWriter.java new file mode 100644 index 000000000000..d3729c6223e6 --- /dev/null +++ b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CppWriter.java @@ -0,0 +1,45 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ +package com.amazonaws.util.awsclientsmithygenerator.generators; + +import software.amazon.smithy.codegen.core.SymbolWriter; + +public class CppWriter extends SymbolWriter { + + public CppWriter() { + super(new CppImportContainer()); + + // Add custom formatter for symbols + putFormatter('T', (arg, indent) -> { + if (!(arg instanceof software.amazon.smithy.codegen.core.Symbol symbol)) { + throw new software.amazon.smithy.codegen.core.CodegenException("Expected a symbol but got " + arg); + } + + // Record our symbol so we can generate appropriate includes later if needed + getImportContainer().importSymbol(symbol, null); + + // For C++, use namespace::name syntax (e.g. Aws::S3::Model::ListBucketsRequest) + if (symbol.getNamespace() != null && !symbol.getNamespace().isEmpty()) { + return symbol.getNamespace() + "::" + symbol.getName(); + } + return symbol.getName(); + }); + } + + public CppWriter writeInclude(String header) { + write("#include <$L>", header); + return this; + } + + public CppWriter writeNamespaceOpen(String namespace) { + openBlock("namespace $L\n{", namespace); + return this; + } + + public CppWriter writeNamespaceClose(String namespace) { + closeBlock("} // namespace $L", namespace); + return this; + } +} \ No newline at end of file diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CppWriterDelegator.java b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CppWriterDelegator.java new file mode 100644 index 000000000000..9d42e8b70900 --- /dev/null +++ b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CppWriterDelegator.java @@ -0,0 +1,37 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ +package com.amazonaws.util.awsclientsmithygenerator.generators; + +import software.amazon.smithy.build.FileManifest; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Consumer; + +public class CppWriterDelegator { + private final FileManifest fileManifest; + private final Map writers = new HashMap<>(); + + public CppWriterDelegator(FileManifest fileManifest) { + this.fileManifest = fileManifest; + } + + public void useFileWriter(String filename, Consumer writerConsumer) { + CppWriter writer = writers.computeIfAbsent(filename, k -> new CppWriter()); + writerConsumer.accept(writer); + } + + public void flushWriters() { + writers.forEach((filename, writer) -> { + try { + Path outputPath = fileManifest.getBaseDir().resolve(filename); + java.nio.file.Files.createDirectories(outputPath.getParent()); + java.nio.file.Files.writeString(outputPath, writer.toString()); + } catch (Exception e) { + throw new RuntimeException("Failed to write file: " + filename, e); + } + }); + } +} \ No newline at end of file diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/FeatureParser.java b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/FeatureParser.java new file mode 100644 index 000000000000..6d76901b0242 --- /dev/null +++ b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/FeatureParser.java @@ -0,0 +1,67 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ +package com.amazonaws.util.awsclientsmithygenerator.generators; + +import software.amazon.smithy.build.PluginContext; +import software.amazon.smithy.model.node.Node; +import software.amazon.smithy.model.node.ObjectNode; +import software.amazon.smithy.model.shapes.*; +import software.amazon.smithy.aws.traits.ServiceTrait; +import java.util.*; +import java.util.function.Consumer; + +public class FeatureParser { + private final PluginContext context; + private final ServiceShape service; + private final List operations; + private final CppWriterDelegator writerDelegator; + private final Map serviceMap; + private final String featureName; + + public FeatureParser(PluginContext context, ServiceShape service, List operations, String featureName) { + this.context = context; + this.service = service; + this.operations = operations; + this.featureName = featureName; + this.writerDelegator = new CppWriterDelegator(context.getFileManifest()); + + // Initialize service map + this.serviceMap = new HashMap<>(); + ObjectNode settings = context.getSettings(); + if (settings.containsMember("c2jMap")) { + Node c2jMapNode = settings.expectMember("c2jMap"); + if (c2jMapNode.isStringNode()) { + String jsonStr = c2jMapNode.expectStringNode().getValue(); + ObjectNode mapNode = Node.parseJsonWithComments(jsonStr).expectObjectNode(); + mapNode.getMembers().forEach((key, value) -> { + this.serviceMap.put(key.getValue(), value.expectStringNode().getValue()); + }); + } + } + } + + public void run(Consumer> generationLogic) { + generationLogic.accept(this); + writerDelegator.flushWriters(); + } + + public void generateClientHeader(String fileName, Consumer generator) { + String serviceName = ServiceNameUtil.getServiceName(service); + String smithyServiceName = ServiceNameUtil.getSmithyServiceName(service, serviceMap); + + writerDelegator.useFileWriter( + "include/aws/" + smithyServiceName + "/" + fileName, + generator + ); + } + + public PluginContext getContext() { return context; } + public ServiceShape getService() { return service; } + public List getOperations() { return operations; } + public String getFeatureName() { return featureName; } + public Map getServiceMap() { return serviceMap; } + public String getServiceName() { return ServiceNameUtil.getServiceName(service); } + public String getSmithyServiceName() { return ServiceNameUtil.getSmithyServiceName(service, serviceMap); } +} \ No newline at end of file diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/OperationData.java b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/OperationData.java new file mode 100644 index 000000000000..7d4c3bec8897 --- /dev/null +++ b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/OperationData.java @@ -0,0 +1,32 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ +package com.amazonaws.util.awsclientsmithygenerator.generators; + +import software.amazon.smithy.model.shapes.*; +import software.amazon.smithy.model.traits.Trait; + +public class OperationData { + private final OperationShape operation; + private final T trait; + private final ServiceShape service; + + public OperationData(OperationShape operation, T trait, ServiceShape service) { + this.operation = operation; + this.trait = trait; + this.service = service; + } + + public OperationShape getOperation() { + return operation; + } + + public T getTrait() { + return trait; + } + + public ServiceShape getService() { + return service; + } +} diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ServiceNameUtil.java b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ServiceNameUtil.java new file mode 100644 index 000000000000..d97626c7cfca --- /dev/null +++ b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ServiceNameUtil.java @@ -0,0 +1,141 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ +package com.amazonaws.util.awsclientsmithygenerator.generators; + +import software.amazon.smithy.model.shapes.ServiceShape; +import software.amazon.smithy.aws.traits.ServiceTrait; +import software.amazon.smithy.model.traits.TitleTrait; +import java.util.Map; +import java.util.Set; + +public final class ServiceNameUtil { + + // Legacy service IDs that need special handling to match what the legacy c2j code generator produced + // This logic is copied from C2jModelToGeneratorModelTransformer.convertMetadata() method + // Hardcoded mappings for legacy services where C2J used fullServiceName for file naming + // Maps serviceId (lowercase, sanitized) to the sanitized fullServiceName from C2J models + private static final Map LEGACY_FULL_SERVICE_NAME_MAP = Map.ofEntries( + Map.entry("amp", "PrometheusService"), + Map.entry("appintegrations", "AppIntegrationsService"), + Map.entry("billingconductor", "BillingConductor"), + Map.entry("chatbot", "chatbot"), + Map.entry("clouddirectory", "CloudDirectory"), + Map.entry("cloudfront", "CloudFront"), + Map.entry("cloudsearch", "CloudSearch"), + Map.entry("cloudsearchdomain", "CloudSearchDomain"), + Map.entry("codeartifact", "CodeArtifact"), + Map.entry("codestarnotifications", "CodeStarNotifications"), + Map.entry("configservice", "ConfigService"), + Map.entry("databrew", "GlueDataBrew"), + Map.entry("deadline", "deadline"), + Map.entry("elasticache", "ElastiCache"), + Map.entry("emrcontainers", "EMRContainers"), + Map.entry("marketplaceentitlementservice", "MarketplaceEntitlementService"), + Map.entry("cloudwatchevents", "CloudWatchEvents"), + Map.entry("evidently", "CloudWatchEvidently"), + Map.entry("forecast", "ForecastService"), + Map.entry("forecastquery", "ForecastQueryService"), + Map.entry("grafana", "ManagedGrafana"), + Map.entry("importexport", "ImportExport"), + Map.entry("inspector", "Inspector"), + Map.entry("lambda", "Lambda"), + Map.entry("location", "LocationService"), + Map.entry("m2", "MainframeModernization"), + Map.entry("migrationhubstrategy", "MigrationHubStrategyRecommendations"), + Map.entry("mq", "MQ"), + Map.entry("opensearch", "OpenSearchService"), + Map.entry("rbin", "RecycleBin"), + Map.entry("rdsdata", "RDSDataService"), + Map.entry("redshiftdata", "RedshiftDataAPIService"), + Map.entry("resiliencehub", "ResilienceHub"), + Map.entry("rum", "CloudWatchRUM"), + Map.entry("lexruntimeservice", "LexRuntimeService"), + Map.entry("lexruntimev2", "LexRuntimeV2"), + Map.entry("lexmodelsv2", "LexModelsV2"), + Map.entry("sagemakerruntime", "SageMakerRuntime"), + Map.entry("sagemakera2iruntime", "AugmentedAIRuntime"), + Map.entry("sagemakeredge", "SagemakerEdgeManager"), + Map.entry("schemas", "Schemas"), + Map.entry("simpledb", "SimpleDB"), + Map.entry("dynamodbstreams", "DynamoDBStreams"), + Map.entry("transcribe", "TranscribeService"), + Map.entry("transcribestreaming", "TranscribeStreamingService"), + Map.entry("transfer", "TransferFamily"), + Map.entry("wisdom", "ConnectWisdomService"), + Map.entry("marketplaceagreement", "MarketplaceAgreementService") + ); + + // TODO: Remove hardcoded mappings once Smithy models include serviceAbbreviation trait + // Smithy sdkId matches C2J serviceId, but C2J prioritizes serviceAbbreviation (which Smithy lacks). + // 18 of 66 services where C2J abbrev != serviceId require these mappings to match C2J output. + // Hardcoded mappings where Smithy sdkId doesn't match C2J serviceAbbreviation + private static final Map SMITHY_TO_C2J_NAMESPACE = Map.ofEntries( + Map.entry("b2bi", "B2BI"), + Map.entry("cloudcontrol", "CloudControlApi"), + Map.entry("ecrpublic", "ECRPublic"), + Map.entry("evs", "EVS"), + Map.entry("finspacedata", "FinSpaceData"), + Map.entry("fis", "FIS"), + Map.entry("identitystore", "IdentityStore"), + Map.entry("inspectorscan", "inspectorscan"), + Map.entry("iotdeviceadvisor", "IoTDeviceAdvisor"), + Map.entry("ivs", "IVS"), + Map.entry("ivsrealtime", "ivsrealtime"), + Map.entry("kinesisvideosignaling", "KinesisVideoSignalingChannels"), + Map.entry("marketplaceagreement", "AgreementService"), + Map.entry("mediapackagev2", "mediapackagev2"), + Map.entry("savingsplans", "SavingsPlans"), + Map.entry("servicecatalogappregistry", "AppRegistry"), + Map.entry("sesv2", "SESV2"), + Map.entry("synthetics", "Synthetics"), + Map.entry("transfer", "Transfer") + ); + + public static String getServiceName(ServiceShape service) { + String serviceId = service.getTrait(ServiceTrait.class) + .map(ServiceTrait::getSdkId) + .orElse(service.getId().getName()); + + String sanitized = sanitizeServiceAbbreviation(serviceId); + + // Check serviceAbbreviation mappings first (highest priority in C2J) + String mapped = SMITHY_TO_C2J_NAMESPACE.get(sanitized.toLowerCase()); + if (mapped != null) { + return mapped; + } + + // Check legacy fullServiceName mappings (fallback when serviceAbbreviation missing) + String legacyName = LEGACY_FULL_SERVICE_NAME_MAP.get(sanitized.toLowerCase()); + if (legacyName != null) { + return legacyName; + } + + return sanitized; + } + + public static String getServiceNameUpperCamel(ServiceShape service) { + return capitalize(getServiceName(service)); + } + + public static String capitalize(String str) { + return str.substring(0, 1).toUpperCase() + str.substring(1); + } + + // Match C2jModelToGeneratorModelTransformer.sanitizeServiceAbbreviation() exactly + private static String sanitizeServiceAbbreviation(String serviceAbbreviation) { + return serviceAbbreviation.replace(" ", "").replace("-", "").replace("_", "").replace("Amazon", "").replace("AWS", "").replace("/", ""); + } + + public static String getSmithyServiceName(ServiceShape service, Map serviceMap) { + String sdkId = service.getTrait(ServiceTrait.class) + .map(ServiceTrait::getSdkId) + .orElse(service.getId().getName()) + .trim() + .toLowerCase() + .replace(" ", "-"); + + return serviceMap != null ? serviceMap.getOrDefault(sdkId, sdkId) : sdkId; + } +} \ No newline at end of file diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ShapeUtil.java b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ShapeUtil.java new file mode 100644 index 000000000000..cc9ea2b0ecff --- /dev/null +++ b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ShapeUtil.java @@ -0,0 +1,279 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ +package com.amazonaws.util.awsclientsmithygenerator.generators; + +import software.amazon.smithy.model.Model; +import software.amazon.smithy.model.shapes.*; +import software.amazon.smithy.model.traits.Trait; +import java.util.*; + +public class ShapeUtil { + + private static final List RESULT_SUFFIXES = List.of("Result", "SdkResult", "CppSdkResult"); + + /** + * Backward compatibility map for operations that must use "SdkResult" suffix. + * + * Background: + * The C2J code generator's renameShape() tries suffixes in order: Result -> SdkResult -> CppSdkResult. + * It picks the first suffix that doesn't collide with existing shape names in the model. + * + * Problem: + * Some legacy C2J models (e.g., medialive-2017-10-14.normal.json) defined shapes like: + * - ListNodesResult (a domain shape) + * - ListNodesResponse (the operation output shape) + * + * When the C2J generator tried to create the SDK wrapper for ListNodes operation: + * 1. Tried "ListNodesResult" -> COLLISION with existing shape + * 2. Fell back to "ListNodesSdkResult" -> No collision, used this + * + * The Smithy models are cleaner and don't have these collisions, but we must preserve + * the "SdkResult" suffix for these operations to maintain backward compatibility with + * existing C2J-generated code. + * + * Map format: service-name -> Set of operation names requiring "SdkResult" + * + * Example: + * medialive C2J model had both ListNodesResult and ListNodesResponse shapes, + * forcing ListNodesSdkResult. Smithy model only has ListNodesResponse, but we + * preserve SdkResult to avoid breaking changes. + * + */ + private static final Map> LEGACY_SDK_RESULT_OPERATIONS = Map.of( + "medialive", Set.of("ListChannelPlacementGroups", "ListClusters", "ListNetworks", "ListNodes") + ); + + /** + * Legacy operation name version suffixes required for backwards compatibility. + * The legacy C2J code generator appended API version suffixes to operation names for certain services. + * This maintains compatibility with existing generated code that depends on these versioned method names. + * + * CloudFront: Uses "2020_05_31" suffix (the API version when C++ SDK generation was standardized) + * - Example: "ListDistributions" becomes "ListDistributions2020_05_31" + * - Required because existing C++ code expects these versioned method names + * - CloudFront has had multiple API versions, and the C2J generator historically used version suffixes + */ + private static final Map OPERATION_VERSION_SUFFIXES = Map.of( + "cloudfront", "2020_05_31" + ); + + /** + * C2J/Smithy model mismatches: tokens that are integers in C2J but strings in Smithy. + * + * Background: + * Some services have tokens that were modeled as integers in C2J but changed to + * strings in Smithy models. The C2J-generated code uses int types, so traits must + * use `!= 0` checks instead of `.empty()` checks. + * + * Map format: service-name -> Map of operation-name -> token-name + * + * Example: + * S3's ListParts operation has NextPartNumberMarker as integer in C2J but string in Smithy. + */ + private static final Map>> NUMERIC_TOKEN_OVERRIDES = Map.of( + "s3", Map.of("ListParts", Set.of("NextPartNumberMarker")), + "s3-crt", Map.of("ListParts", Set.of("NextPartNumberMarker")) + ); + + /** + * Returns all shapes referenced by a root shape, recursively. + */ + public static Set getReferences(Model model, Shape root) { + Set refs = new HashSet<>(); + refs.add(root); + for (var member : root.members()) { + refs.addAll(getReferences(model, model.expectShape(member.getTarget()))); + } + return refs; + } + + /** + * Gets the operation method name with legacy version suffix if required. + * + * Some services require version suffixes appended to operation names for backwards compatibility + * with the legacy C2J code generator. This ensures existing C++ code continues to work with + * the expected method names. + * + * @param opName The base operation name from the Smithy model + * @param smithyServiceName The Smithy service name (e.g., "cloudfront") + * @return The operation name with version suffix if needed (e.g., "ListDistributions2020_05_31") + */ + public static String getOperationMethodName(String opName, String smithyServiceName) { + String versionSuffix = OPERATION_VERSION_SUFFIXES.get(smithyServiceName); + return versionSuffix != null ? opName + versionSuffix : opName; + } + + /** + * Checks if a token is numeric (integer or long type). + * First checks for C2J/Smithy model mismatch overrides, then inspects the actual shape type. + * + * @param model The Smithy model + * @param op The operation shape + * @param smithyServiceName The Smithy service name + * @param wrapperMember The wrapper member name (null if token is at top level) + * @param tokenName The token name + * @return true if the token is numeric + */ + public static boolean isNumericToken(Model model, OperationShape op, String smithyServiceName, String wrapperMember, String tokenName) { + // Check for C2J/Smithy model mismatch overrides first + Map> serviceOverrides = NUMERIC_TOKEN_OVERRIDES.get(smithyServiceName); + if (serviceOverrides != null) { + Set tokens = serviceOverrides.get(op.getId().getName()); + if (tokens != null && tokens.contains(tokenName)) { + return true; + } + } + + Optional tokenShape = getOutputStructure(model, op) + .flatMap(out -> { + if (wrapperMember == null) { + return out.getMember(tokenName); + } + return out.getMember(wrapperMember) + .flatMap(m -> model.getShape(m.getTarget())) + .flatMap(t -> t.asStructureShape()) + .flatMap(w -> w.getMember(tokenName)); + }) + .flatMap(member -> model.getShape(member.getTarget())); + + return tokenShape.map(ts -> ts instanceof IntegerShape || ts instanceof LongShape).orElse(false); + } + + /** + * Determines the result suffix for an operation based on protocol and naming conflicts. + * Replicates C2J renameShape conflict detection logic. + * + * C2J logic: + * 1. Try "Result" first + * 2. If collision exists (direct name match OR Get/Set accessor conflict), try "SdkResult" + * 3. If still collision, try "CppSdkResult" + * + * @param model The Smithy model + * @param operation The operation shape + * @param smithyServiceName The Smithy service name + * @return "Response" for EC2 protocol, "SdkResult" if naming conflict exists, otherwise "Result" + */ + public static String getResultSuffix(Model model, OperationShape operation, String smithyServiceName) { + // EC2 protocol services rename all Result shapes to Response + if ("ec2".equals(smithyServiceName)) { + return "Response"; + } + + // C2J backward compatibility: preserve SdkResult for operations that had collisions in legacy models + Set legacyOps = LEGACY_SDK_RESULT_OPERATIONS.get(smithyServiceName); + if (legacyOps != null && legacyOps.contains(operation.getId().getName())) { + return "SdkResult"; + } + + String baseName = operation.getId().getName(); + Set allShapeNames = new HashSet<>(); + model.shapes().forEach(s -> allShapeNames.add(s.getId().getName())); + + // Output shape name (used for legacy early-accept behavior) + String outputShapeName = operation.getOutput().isPresent() + ? operation.getOutputShape().getName() + : null; + + // For closer parity with the legacy Get/Set collision rule + Set outputMemberNames = getOutputStructure(model, operation) + .map(struct -> new HashSet<>(struct.getAllMembers().keySet())) + .orElse(new HashSet<>()); + + for (String suffix : RESULT_SUFFIXES) { + String candidate = baseName + suffix; + + // Legacy parity: if the operation's output shape is already named exactly candidate, + // then legacy renameShape() would return immediately (no conflict handling). + if (outputShapeName != null && candidate.equals(outputShapeName)) { + return suffix; + } + + // Legacy: otherwise, direct collision with any existing shape name is a conflict + if (allShapeNames.contains(candidate)) { + continue; + } + + // Closer parity with legacy intent (member-gated Get/Set collisions) + if (!outputMemberNames.isEmpty()) { + boolean hasCollision = false; + for (String shapeName : allShapeNames) { + if (outputMemberNames.contains(shapeName) && + (candidate.equals("Get" + shapeName) || candidate.equals("Set" + shapeName))) { + hasCollision = true; + break; + } + } + if (hasCollision) { + continue; + } + } + + return suffix; + } + + // Legacy would throw if no suffix is available; returning CppSdkResult silently can hide bugs + throw new IllegalStateException("Unhandled result shape name conflict for operation: " + baseName); + } + + /** + * Gets the output structure shape for an operation, or null if not present or not a structure. + */ + private static Optional getOutputStructure(Model model, OperationShape op) { + return op.getOutput() + .flatMap(outputId -> model.getShape(outputId)) + .flatMap(shape -> shape.asStructureShape()); + } + + /** + * Finds the wrapper member in an operation's output that contains the specified token. + * Used for token resolution when tokens are nested in wrapper structures. + * + * @param model The Smithy model + * @param op The operation shape + * @param tokenName The token name to find + * @return The wrapper member name, or null if not found + */ + public static String findWrapperMemberContainingToken(Model model, OperationShape op, String tokenName) { + return getOutputStructure(model, op) + .flatMap(outputShape -> + outputShape.getAllMembers().entrySet().stream() + .filter(entry -> model.getShape(entry.getValue().getTarget()) + .flatMap(t -> t.asStructureShape()) + .map(s -> s.getAllMembers().containsKey(tokenName)) + .orElse(false)) + .map(Map.Entry::getKey) + .findFirst() + ) + .orElse(null); + } + + /** + * Checks if an operation's output has a top-level member with the specified name. + * + * @param model The Smithy model + * @param op The operation shape + * @param memberName The member name to check + * @return true if the member exists at the top level + */ + public static boolean hasTopLevelMember(Model model, OperationShape op, String memberName) { + return getOutputStructure(model, op) + .map(outputShape -> outputShape.getAllMembers().containsKey(memberName)) + .orElse(false); + } + + /** + * Gets service-level token when operation-level traits are missing. + * + * @param service The service shape + * @param traitClass The trait class to look for + * @param tokenExtractor Function to extract the token from the trait + * @return The service-level token, or null if not defined + */ + public static String getServiceLevelToken(ServiceShape service, Class traitClass, java.util.function.Function> tokenExtractor) { + return service.getTrait(traitClass) + .map(trait -> tokenExtractor.apply(trait).orElse(null)) + .orElse(null); + } +} \ No newline at end of file diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationBaseGenerator.java b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationBaseGenerator.java new file mode 100644 index 000000000000..ea40a4c5d442 --- /dev/null +++ b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationBaseGenerator.java @@ -0,0 +1,102 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ +package com.amazonaws.util.awsclientsmithygenerator.generators.templates; + +import com.amazonaws.util.awsclientsmithygenerator.generators.CppWriter; +import com.amazonaws.util.awsclientsmithygenerator.generators.OperationData; +import com.amazonaws.util.awsclientsmithygenerator.generators.ServiceNameUtil; +import com.amazonaws.util.awsclientsmithygenerator.generators.ShapeUtil; +import software.amazon.smithy.model.shapes.ServiceShape; +import software.amazon.smithy.model.traits.PaginatedTrait; +import java.util.List; +import java.util.Map; + +public class PaginationBaseGenerator { + private final ServiceShape service; + private final List> paginatedOps; + private final Map serviceMap; + + public PaginationBaseGenerator(ServiceShape service, List> paginatedOps, Map serviceMap) { + this.service = service; + this.paginatedOps = paginatedOps; + this.serviceMap = serviceMap; + } + + public void render(CppWriter writer) { + String serviceName = ServiceNameUtil.getServiceName(service); + String smithyServiceName = ServiceNameUtil.getSmithyServiceName(service, serviceMap); + String classPrefix = ServiceNameUtil.getServiceNameUpperCamel(service); + + renderHeader(writer); + renderIncludes(writer, serviceName, smithyServiceName); + renderBaseClass(writer, serviceName, smithyServiceName, classPrefix); + } + + private void renderHeader(CppWriter writer) { + writer.write("/**") + .write(" * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.") + .write(" * SPDX-License-Identifier: Apache-2.0.") + .write(" */") + .write("") + .write("#pragma once") + .write(""); + } + + private void renderIncludes(CppWriter writer, String serviceName, String smithyServiceName) { + writer.writeInclude("memory"); + + // Include paginator headers + for (OperationData data : paginatedOps) { + String opName = data.getOperation().getId().getName(); + writer.writeInclude("aws/" + smithyServiceName + "/model/" + opName + "PaginationTraits.h"); + } + + writer.writeInclude("aws/core/utils/pagination/Paginator.h"); + writer.write(""); + } + + private void renderBaseClass(CppWriter writer, String serviceName, String smithyServiceName, String classPrefix) { + writer.writeNamespaceOpen("Aws"); + writer.writeNamespaceOpen(serviceName); + writer.write(""); + + // Forward declare the client + writer.write("class " + classPrefix + "Client;"); + writer.write(""); + + // CRTP base class + writer.write("template"); + writer.openBlock("class " + classPrefix + "PaginationBase {\npublic:", "};", () -> { + if (paginatedOps.isEmpty()) { + // Empty base class for services without pagination + // Required because legacy C2J generator always includes PaginationBase inheritance in client headers + writer.write("virtual ~" + classPrefix + "PaginationBase() = default;"); + } else { + // Generate paginator methods + for (OperationData data : paginatedOps) { + String opName = data.getOperation().getId().getName(); + String methodName = ShapeUtil.getOperationMethodName(opName, smithyServiceName); + + writer.write(""); + writer.write("/**") + .write(" * Create a paginator for " + opName + " operation") + .write(" */"); + + writer.write("Aws::Utils::Pagination::PagePaginator") + .write(opName + "Paginator(const Model::" + methodName + "Request& request)"); + + writer.openBlock("{", "}", () -> { + writer.write("return Aws::Utils::Pagination::PagePaginator{") + .write(" std::shared_ptr(static_cast(this), [](DerivedClient*){}), request};"); + }); + } + } + }); + + writer.writeNamespaceClose(serviceName); + writer.writeNamespaceClose("Aws"); + + } +} \ No newline at end of file diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationClientHeaderGenerator.java b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationClientHeaderGenerator.java new file mode 100644 index 000000000000..cd6d3400e7db --- /dev/null +++ b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationClientHeaderGenerator.java @@ -0,0 +1,76 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ +package com.amazonaws.util.awsclientsmithygenerator.generators.templates; + +import com.amazonaws.util.awsclientsmithygenerator.generators.CppWriter; +import com.amazonaws.util.awsclientsmithygenerator.generators.OperationData; +import com.amazonaws.util.awsclientsmithygenerator.generators.ServiceNameUtil; +import com.amazonaws.util.awsclientsmithygenerator.generators.ShapeUtil; +import software.amazon.smithy.model.shapes.ServiceShape; +import software.amazon.smithy.aws.traits.ServiceTrait; +import software.amazon.smithy.model.traits.PaginatedTrait; +import com.amazonaws.util.awsclientsmithygenerator.generators.ServiceNameUtil; +import java.util.List; +import java.util.Map; + +public class PaginationClientHeaderGenerator { + private final ServiceShape service; + private final List> paginatedOps; + private final Map serviceMap; + private final String smithyServiceName; + + public PaginationClientHeaderGenerator(ServiceShape service, List> paginatedOps, Map serviceMap) { + this.service = service; + this.paginatedOps = paginatedOps; + this.serviceMap = serviceMap; + this.smithyServiceName = ServiceNameUtil.getSmithyServiceName(service, serviceMap); + } + + public void render(CppWriter writer) { + String serviceName = ServiceNameUtil.getServiceName(service); + String smithyServiceName = ServiceNameUtil.getSmithyServiceName(service, serviceMap); + + // Header and includes + writer.write("/**"); + writer.write(" * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved."); + writer.write(" * SPDX-License-Identifier: Apache-2.0."); + writer.write(" */"); + writer.write(""); + writer.write("#pragma once"); + + renderIncludes(writer, serviceName, smithyServiceName); + renderNamespaces(writer, serviceName); + } + + private void renderIncludes(CppWriter writer, String serviceName, String smithyServiceName) { + String classPrefix = ServiceNameUtil.getServiceNameUpperCamel(service); + writer.writeInclude("aws/" + smithyServiceName + "/" + classPrefix + "Client.h"); + writer.writeInclude("aws/core/utils/pagination/Paginator.h"); + + for (OperationData data : paginatedOps) { + String opName = data.getOperation().getId().getName(); + writer.writeInclude("aws/" + smithyServiceName + "/model/" + opName + "PaginationTraits.h"); + } + writer.write(""); + } + + private void renderNamespaces(CppWriter writer, String serviceName) { + String classPrefix = ServiceNameUtil.getServiceNameUpperCamel(service); + writer.writeNamespaceOpen("Aws"); + writer.writeNamespaceOpen(serviceName); + writer.write(""); + + for (OperationData data : paginatedOps) { + String opName = data.getOperation().getId().getName(); + String methodName = ShapeUtil.getOperationMethodName(opName, smithyServiceName); + writer.write("using $LPaginator = Aws::Utils::Pagination::PagePaginator<$LClient, Model::$LRequest, Pagination::$LPaginationTraits>;", + opName, classPrefix, methodName, opName); + } + + writer.write(""); + writer.writeNamespaceClose(serviceName); + writer.writeNamespaceClose("Aws"); + } +} \ No newline at end of file diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationCodegenPlugin.java b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationCodegenPlugin.java new file mode 100644 index 000000000000..6371f4d606eb --- /dev/null +++ b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationCodegenPlugin.java @@ -0,0 +1,140 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ +package com.amazonaws.util.awsclientsmithygenerator.generators; + +import software.amazon.smithy.build.PluginContext; +import software.amazon.smithy.build.SmithyBuildPlugin; +import software.amazon.smithy.model.knowledge.TopDownIndex; +import software.amazon.smithy.model.traits.PaginatedTrait; +import software.amazon.smithy.model.traits.DeprecatedTrait; +import software.amazon.smithy.model.shapes.*; +import com.amazonaws.util.awsclientsmithygenerator.generators.OperationData; +import com.amazonaws.util.awsclientsmithygenerator.generators.FeatureParser; +import com.amazonaws.util.awsclientsmithygenerator.generators.templates.PaginationTraitsGenerator; +import com.amazonaws.util.awsclientsmithygenerator.generators.templates.PaginationClientHeaderGenerator; +import com.amazonaws.util.awsclientsmithygenerator.generators.templates.PaginationCompilationTestGenerator; +import com.amazonaws.util.awsclientsmithygenerator.generators.templates.PaginationBaseGenerator; +import java.util.List; +import java.util.Map; +import java.util.HashMap; +import java.util.stream.Collectors; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +public class PaginationCodegenPlugin implements SmithyBuildPlugin { + + @Override + public String getName() { + return "cpp-codegen-pagination-plugin"; + } + + @Override + public void execute(PluginContext context) { + var model = context.getModel(); + + // TODO: Remove this workaround - mock projections should use proper Smithy model generation + // instead of manually writing files in the plugin + // Currently only needed for importexport, sdb (SimpleDB), and s3-crt + // Check if this is a legacy service mock projection + String projectionName = context.getProjectionName(); + if (projectionName.endsWith(".mock")) { + generateLegacyServiceFile(context); + return; + } + + for (ServiceShape service : model.getServiceShapes()) { + // Find paginated operations using TopDownIndex, excluding deprecated operations + List> paginatedOps = TopDownIndex.of(model).getContainedOperations(service).stream() + .filter(op -> op.hasTrait(PaginatedTrait.class)) + .filter(op -> !op.hasTrait(DeprecatedTrait.class)) + .map(op -> new OperationData<>(op, op.expectTrait(PaginatedTrait.class), service)) + .collect(Collectors.toList()); + + // Always generate base class, even if empty + // Required because legacy C2J generator always includes PaginationBase inheritance in client headers + FeatureParser> parser = new FeatureParser<>(context, service, paginatedOps, "Pagination"); + parser.run(featureParser -> { + String serviceName = ServiceNameUtil.getServiceNameUpperCamel(featureParser.getService()); + + // Generate CRTP pagination mixin (always, even if empty) + featureParser.generateClientHeader( + serviceName + "PaginationBase.h", + writer -> new PaginationBaseGenerator(featureParser.getService(), featureParser.getOperations(), featureParser.getServiceMap()).render(writer) + ); + + if (!paginatedOps.isEmpty()) { + // Generate client pagination header + featureParser.generateClientHeader( + serviceName + "ClientPagination.h", + writer -> new PaginationClientHeaderGenerator(featureParser.getService(), featureParser.getOperations(), featureParser.getServiceMap()).render(writer) + ); + + // Generate pagination traits headers + PaginationTraitsGenerator traitsGenerator = new PaginationTraitsGenerator( + featureParser.getContext(), + featureParser.getService(), + featureParser.getOperations(), + featureParser.getSmithyServiceName() + ); + traitsGenerator.write(); + } + }); + + if (!paginatedOps.isEmpty()) { + // Generate compilation test + PaginationCompilationTestGenerator testGenerator = new PaginationCompilationTestGenerator(context, service, paginatedOps, parser.getServiceMap()); + testGenerator.run(); + } + } + } + + private void generateLegacyServiceFile(PluginContext context) { + Map legacyServices = new HashMap<>(); + legacyServices.put("importexport", "ImportExport"); + legacyServices.put("sdb", "SimpleDB"); + legacyServices.put("s3-crt", "S3Crt"); + + String projectionName = context.getProjectionName(); + String c2jName = projectionName.replace(".mock", ""); + String pascalName = legacyServices.get(c2jName); + + if (pascalName == null) { + return; + } + + try { + Path baseDir = context.getFileManifest().getBaseDir(); + Path includeDir = baseDir.resolve("include").resolve("aws").resolve(c2jName); + Files.createDirectories(includeDir); + + // Generate empty pagination base header + Path headerFile = includeDir.resolve(pascalName + "PaginationBase.h"); + String content = String.format( + "/**\n" + + " * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n" + + " * SPDX-License-Identifier: Apache-2.0.\n" + + " */\n\n" + + "#pragma once\n\n" + + "namespace Aws\n" + + "{\n" + + " namespace %s\n" + + " {\n" + + " template\n" + + " class %sPaginationBase\n" + + " {\n" + + " public:\n" + + " virtual ~%sPaginationBase() = default;\n" + + " };\n" + + " } // namespace %s\n" + + "} // namespace Aws\n", + pascalName, pascalName, pascalName, pascalName + ); + Files.writeString(headerFile, content); + } catch (Exception e) { + System.err.println("Failed to generate legacy service " + c2jName + ": " + e.getMessage()); + } + } +} diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationCompilationTestGenerator.java b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationCompilationTestGenerator.java new file mode 100644 index 000000000000..fbda6b736615 --- /dev/null +++ b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationCompilationTestGenerator.java @@ -0,0 +1,107 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ +package com.amazonaws.util.awsclientsmithygenerator.generators.templates; + +import software.amazon.smithy.build.PluginContext; +import software.amazon.smithy.model.shapes.*; +import com.amazonaws.util.awsclientsmithygenerator.generators.CppWriter; +import com.amazonaws.util.awsclientsmithygenerator.generators.CompilationTestParser; +import com.amazonaws.util.awsclientsmithygenerator.generators.OperationData; +import com.amazonaws.util.awsclientsmithygenerator.generators.ServiceNameUtil; +import software.amazon.smithy.model.traits.PaginatedTrait; +import java.util.*; + +public class PaginationCompilationTestGenerator { + private final CompilationTestParser> parser; + private final List> allPaginatedOps; + private final Map serviceMap; + + public PaginationCompilationTestGenerator(PluginContext context, ServiceShape service, List> allPaginatedOps, Map serviceMap) { + this.allPaginatedOps = allPaginatedOps; + this.serviceMap = serviceMap; + this.parser = new CompilationTestParser<>( + context, + service, + allPaginatedOps, + "Pagination", + this::render, + serviceMap + ); + } + + public void run() { + parser.run(); + } + + public void render(CppWriter writer) { + // Get service from the first operation since all operations belong to the same service + ServiceShape service = allPaginatedOps.get(0).getService(); + String serviceName = ServiceNameUtil.getServiceName(service); + + writer.write("/**") + .write(" * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.") + .write(" * SPDX-License-Identifier: Apache-2.0.") + .write(" */") + .write("") + .write("// Header compilation test for " + serviceName + " pagination headers") + .write("// This test ensures all generated pagination headers compile successfully") + .write(""); + + // Include all service headers + writeIncludes(writer); + + writer.write("") + .write("#include ") + .write(""); + + writer.openBlock("class " + serviceName + "PaginationCompilationTest : public Aws::Testing::AwsCppSdkGTestSuite\n{", "};", () -> { + // Empty class body + }); + + writer.write(""); + + writer.openBlock("TEST_F(" + serviceName + "PaginationCompilationTest, " + serviceName + "PaginationHeadersCompile)\n{", "}", () -> { + writer.write(" // Test passes if compilation succeeds") + .write(" SUCCEED();"); + }); + } + + private void writeIncludes(CppWriter writer) { + Set clientHeaders = new HashSet<>(); + Set traitHeaders = new HashSet<>(); + Set mixinHeaders = new HashSet<>(); + + for (OperationData paginationData : allPaginatedOps) { + ServiceShape service = paginationData.getService(); + String serviceName = ServiceNameUtil.getServiceNameUpperCamel(service); + String smithyServiceName = ServiceNameUtil.getSmithyServiceName(service, serviceMap); + + // Collect unique client headers + clientHeaders.add("aws/" + smithyServiceName + "/" + serviceName + "ClientPagination.h"); + + // Collect unique mixin headers + mixinHeaders.add("aws/" + smithyServiceName + "/" + serviceName + "PaginationBase.h"); + + // Collect unique trait headers + String operationName = paginationData.getOperation().getId().getName(); + traitHeaders.add("aws/" + smithyServiceName + "/model/" + operationName + "PaginationTraits.h"); + } + + // Write unique client headers + for (String header : clientHeaders) { + writer.writeInclude(header); + } + + // Write unique mixin headers + for (String header : mixinHeaders) { + writer.writeInclude(header); + } + + // Write unique trait headers + for (String header : traitHeaders) { + writer.writeInclude(header); + } + } +} \ No newline at end of file diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationTraitsGenerator.java b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationTraitsGenerator.java new file mode 100644 index 000000000000..cce819756f5c --- /dev/null +++ b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationTraitsGenerator.java @@ -0,0 +1,207 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ +package com.amazonaws.util.awsclientsmithygenerator.generators.templates; + +import software.amazon.smithy.build.PluginContext; +import software.amazon.smithy.model.shapes.*; +import software.amazon.smithy.model.traits.PaginatedTrait; +import software.amazon.smithy.aws.traits.ServiceTrait; +import com.amazonaws.util.awsclientsmithygenerator.generators.OperationData; +import com.amazonaws.util.awsclientsmithygenerator.generators.CppWriter; +import com.amazonaws.util.awsclientsmithygenerator.generators.CppWriterDelegator; +import com.amazonaws.util.awsclientsmithygenerator.generators.ServiceNameUtil; +import com.amazonaws.util.awsclientsmithygenerator.generators.ShapeUtil; +import java.util.*; +import java.util.Arrays; + +public class PaginationTraitsGenerator { + private final PluginContext context; + private final ServiceShape service; + private final List> paginatedOps; + private final String smithyServiceName; + + private final CppWriterDelegator writerDelegator; + + public PaginationTraitsGenerator(PluginContext context, ServiceShape service, List> paginatedOps, String smithyServiceName) { + this.context = context; + this.service = service; + this.paginatedOps = paginatedOps; + this.smithyServiceName = smithyServiceName; + this.writerDelegator = new CppWriterDelegator(context.getFileManifest()); + } + + public void write() { + String serviceName = ServiceNameUtil.getServiceName(service); + + for (OperationData data : paginatedOps) { + String fileName = "include/aws/" + smithyServiceName + "/model/" + data.getOperation().getId().getName() + "PaginationTraits.h"; + + writerDelegator.useFileWriter(fileName, writer -> { + generateTraitsHeader(writer, data, serviceName); + }); + } + + writerDelegator.flushWriters(); + } + + private void generateTraitsHeader(CppWriter writer, OperationData data, String serviceName) { + OperationShape op = data.getOperation(); + PaginatedTrait trait = data.getTrait(); + String opName = op.getId().getName(); + + // Header comment + writer.write("/**") + .write(" * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.") + .write(" * SPDX-License-Identifier: Apache-2.0.") + .write(" */") + .write("") + .write("#pragma once"); + + // Includes - detect suffix like C2J renameShape logic + String resultSuffix = ShapeUtil.getResultSuffix(context.getModel(), op, smithyServiceName); + String capitalizedServiceName = ServiceNameUtil.getServiceNameUpperCamel(service); + String requestFileName = ShapeUtil.getOperationMethodName(opName, smithyServiceName) + "Request"; + String resultFileName = ShapeUtil.getOperationMethodName(opName, smithyServiceName) + resultSuffix; + String methodName = ShapeUtil.getOperationMethodName(opName, smithyServiceName); + + writer.writeInclude("aws/" + smithyServiceName + "/" + capitalizedServiceName + "_EXPORTS.h") + .writeInclude("aws/" + smithyServiceName + "/model/" + requestFileName + ".h") + .writeInclude("aws/" + smithyServiceName + "/model/" + resultFileName + ".h") + .writeInclude("aws/" + smithyServiceName + "/" + capitalizedServiceName + "ServiceClientModel.h") + .write(""); + + // Namespaces + writer.writeNamespaceOpen("Aws") + .writeNamespaceOpen(serviceName) + .write("class " + capitalizedServiceName + "Client;") + .writeNamespaceOpen("Pagination") + .write(""); + + // Struct definition + writer.openBlock("struct " + opName + "PaginationTraits\n{", "};", () -> { + // Use detected suffix to match C2J renameShape logic + writer.write(" using RequestType = Model::$LRequest;", methodName) + .write(" using ResultType = Model::$L$L;", methodName, resultSuffix) + .write(" using OutcomeType = Model::$LOutcome;", methodName) + .write(" using ClientType = $LClient;", capitalizedServiceName) + .write(""); + + // Invoke method - template to defer instantiation + writer.write(" template") + .openBlock(" static OutcomeType Invoke(Client& client, const RequestType& request)\n {", " }", () -> { + writer.write(" return client.$L(request);", methodName); + }); + + writer.write(""); + + // HasMoreResults method + writer.openBlock(" static bool HasMoreResults(const ResultType& result)\n {", " }", () -> { + if (trait.getOutputToken().isPresent()) { + String outToken = trait.getOutputToken().get(); + + // Pattern A: Explicit nested token like "EngineDefaults.Marker" + if (outToken.contains(".")) { + String[] parts = outToken.split("\\.", 2); + String memberName = parts[0]; + String nestedTokenName = parts[1]; + if (ShapeUtil.isNumericToken(context.getModel(), op, smithyServiceName, memberName, nestedTokenName)) { + writer.write(" return result.Get$L().Get$L() != 0;", ServiceNameUtil.capitalize(memberName), ServiceNameUtil.capitalize(nestedTokenName)); + } else { + writer.write(" return !result.Get$L().Get$L().empty();", ServiceNameUtil.capitalize(memberName), ServiceNameUtil.capitalize(nestedTokenName)); + } + } + // Pattern B: Check if token is on top-level output + else if (ShapeUtil.hasTopLevelMember(context.getModel(), op, outToken)) { + if (ShapeUtil.isNumericToken(context.getModel(), op, smithyServiceName, null, outToken)) { + writer.write(" return result.Get$L() != 0;", ServiceNameUtil.capitalize(outToken)); + } else { + writer.write(" return !result.Get$L().empty();", ServiceNameUtil.capitalize(outToken)); + } + } + // Pattern C: Find wrapper member containing the token + else { + String wrapperMember = ShapeUtil.findWrapperMemberContainingToken(context.getModel(), op, outToken); + if (wrapperMember != null) { + if (ShapeUtil.isNumericToken(context.getModel(), op, smithyServiceName, wrapperMember, outToken)) { + writer.write(" return result.Get$L().Get$L() != 0;", ServiceNameUtil.capitalize(wrapperMember), ServiceNameUtil.capitalize(outToken)); + } else { + writer.write(" return !result.Get$L().Get$L().empty();", ServiceNameUtil.capitalize(wrapperMember), ServiceNameUtil.capitalize(outToken)); + } + } else if (ShapeUtil.hasTopLevelMember(context.getModel(), op, "IsTruncated")) { + writer.write(" return result.GetIsTruncated();"); + } else { + writer.write(" return false;"); + } + } + } else { + // Fallback to service-level pagination configuration when operation-level traits are missing. + // Some services like AccessAnalyzer define pagination tokens at the service level rather than per-operation. + String serviceLevelOutputToken = ShapeUtil.getServiceLevelToken(service, software.amazon.smithy.model.traits.PaginatedTrait.class, t -> t.getOutputToken()); + if (serviceLevelOutputToken != null) { + if (ShapeUtil.isNumericToken(context.getModel(), op, smithyServiceName, null, serviceLevelOutputToken)) { + writer.write(" return result.Get$L() != 0;", ServiceNameUtil.capitalize(serviceLevelOutputToken)); + } else { + writer.write(" return !result.Get$L().empty();", ServiceNameUtil.capitalize(serviceLevelOutputToken)); + } + } else { + writer.write(" return result.GetIsTruncated();"); + } + } + }); + + writer.write(""); + + // SetNextRequest method + writer.openBlock(" static void SetNextRequest(const ResultType& result, RequestType& request)\n {", " }", () -> { + String inToken = null; + String outToken = null; + + if (trait.getInputToken().isPresent() && trait.getOutputToken().isPresent()) { + inToken = trait.getInputToken().get(); + outToken = trait.getOutputToken().get(); + } else { + // Fallback to service-level pagination configuration when operation-level traits are missing. + // Some services like AccessAnalyzer define pagination tokens at the service level rather than per-operation. + String serviceLevelInputToken = ShapeUtil.getServiceLevelToken(service, software.amazon.smithy.model.traits.PaginatedTrait.class, t -> t.getInputToken()); + String serviceLevelOutputToken = ShapeUtil.getServiceLevelToken(service, software.amazon.smithy.model.traits.PaginatedTrait.class, t -> t.getOutputToken()); + if (serviceLevelInputToken != null && serviceLevelOutputToken != null) { + inToken = serviceLevelInputToken; + outToken = serviceLevelOutputToken; + } + } + + if (inToken != null && outToken != null) { + // Pattern A: Explicit nested token like "EngineDefaults.Marker" + if (outToken.contains(".")) { + String[] parts = outToken.split("\\.", 2); + String memberName = parts[0]; + String nestedTokenName = parts[1]; + writer.write(" request.Set$L(result.Get$L().Get$L());", ServiceNameUtil.capitalize(inToken), ServiceNameUtil.capitalize(memberName), ServiceNameUtil.capitalize(nestedTokenName)); + } + // Pattern B: Check if token is on top-level output + else if (ShapeUtil.hasTopLevelMember(context.getModel(), op, outToken)) { + writer.write(" request.Set$L(result.Get$L());", ServiceNameUtil.capitalize(inToken), ServiceNameUtil.capitalize(outToken)); + } + // Pattern C: Find wrapper member containing the token + else { + String wrapperMember = ShapeUtil.findWrapperMemberContainingToken(context.getModel(), op, outToken); + if (wrapperMember != null) { + writer.write(" request.Set$L(result.Get$L().Get$L());", ServiceNameUtil.capitalize(inToken), ServiceNameUtil.capitalize(wrapperMember), ServiceNameUtil.capitalize(outToken)); + } else { + writer.write(" (void)result; (void)request; // Token not found"); + } + } + } else { + writer.write(" (void)result; (void)request; // Unused parameters"); + } + }); + }); + + writer.write("") + .writeNamespaceClose("Pagination") + .writeNamespaceClose(serviceName) + .writeNamespaceClose("Aws"); + } +} \ No newline at end of file diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/resources/META-INF/services/software.amazon.smithy.build.SmithyBuildPlugin b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/resources/META-INF/services/software.amazon.smithy.build.SmithyBuildPlugin new file mode 100644 index 000000000000..f4e064860447 --- /dev/null +++ b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/resources/META-INF/services/software.amazon.smithy.build.SmithyBuildPlugin @@ -0,0 +1 @@ +com.amazonaws.util.awsclientsmithygenerator.generators.PaginationCodegenPlugin diff --git a/tools/code-generation/smithy/codegen/cpp-pagination/build.gradle.kts b/tools/code-generation/smithy/codegen/cpp-pagination/build.gradle.kts new file mode 100644 index 000000000000..29c1ca217b7b --- /dev/null +++ b/tools/code-generation/smithy/codegen/cpp-pagination/build.gradle.kts @@ -0,0 +1,104 @@ +import software.amazon.smithy.model.Model +import software.amazon.smithy.model.node.Node +import software.amazon.smithy.model.shapes.ServiceShape +import software.amazon.smithy.aws.traits.ServiceTrait +import org.gradle.api.logging.Logging +import kotlin.streams.toList + +val logger = Logging.getLogger("MyLogger") + +plugins { + id("java-library") + id("software.amazon.smithy.gradle.smithy-base").version("1.3.0") +} + +repositories { + mavenLocal() + mavenCentral() +} + +buildscript { + dependencies { + classpath(codegen.model) + classpath(codegen.aws.traits) + classpath(codegen.rules.engine) + } +} + +dependencies { + implementation(project(":cpp-pagination-codegen")) + implementation(codegen.aws.traits) + implementation(codegen.aws.cloudformation.traits) + implementation(codegen.aws.iam.traits) + implementation(codegen.aws.endpoints) + implementation(codegen.smoke.test.traits) + implementation(codegen.aws.smoke.test.model) + implementation(codegen.waiters) +} + +tasks.jar { + enabled = false +} + +tasks.register("generate-smithy-build") { + doLast { + val projectionsBuilder = Node.objectNodeBuilder() + val models = project.file("../../api-descriptions") + val filteredServices: String = project.findProperty("servicesFilter")?.toString() ?: "" + val filteredServiceList = filteredServices.split(",").map { it.trim() }.filter { it.isNotEmpty() } + val c2jMapStr: String = project.findProperty("c2jMap")?.toString() ?: "" + + fileTree(models).filter { it.isFile }.files.forEach eachFile@{ file -> + val model = Model.assembler() + .addImport(file.absolutePath) + // Grab the result directly rather than worrying about checking for errors via unwrap. + // All we care about here is the service shape, any unchecked errors will be exposed + // as part of the actual build task done by the smithy gradle plugin. + .assemble().result.get() + val services = model.shapes(ServiceShape::class.java).sorted().toList() + if (services.size != 1) return@eachFile + + val service = services[0] + val serviceTrait = service.getTrait(ServiceTrait::class.java).get() + val sdkId = serviceTrait.sdkId.replace(" ", "-").replace("_", "-").lowercase() + + if (filteredServiceList.isNotEmpty() && sdkId !in filteredServiceList) return@eachFile + + val projectionContents = Node.objectNodeBuilder() + .withMember("imports", Node.fromStrings("${models.absolutePath}${File.separator}${file.name}")) + .withMember("plugins", Node.objectNode() + .withMember("cpp-codegen-pagination-plugin", Node.objectNodeBuilder() + .withMember("c2jMap", Node.from(c2jMapStr)) + .build())) + .build() + + projectionsBuilder.withMember("$sdkId.${service.version.lowercase()}", projectionContents) + } + + // TODO: Remove this workaround - legacy services should have proper Smithy model files + // instead of hardcoding service names in both Gradle and Java + // Currently only needed for importexport, sdb (SimpleDB), and s3-crt + // Add mock projections for legacy C2J-only services + val legacyServices = mapOf("importexport" to "ImportExport", "sdb" to "SimpleDB", "s3-crt" to "S3Crt") + legacyServices.forEach { (c2jName, pascalName) -> + if (filteredServiceList.isEmpty() || c2jName in filteredServiceList) { + val mockProjectionContents = Node.objectNodeBuilder() + .withMember("plugins", Node.objectNode() + .withMember("cpp-codegen-pagination-plugin", Node.objectNodeBuilder() + .withMember("c2jMap", Node.from(c2jMapStr)) + .build())) + .build() + projectionsBuilder.withMember("$c2jName.mock", mockProjectionContents) + } + } + + val outputDirectoryArg = project.findProperty("outputDirectory")?.toString() ?: "output" + file("smithy-build.json").writeText(Node.prettyPrintJson(Node.objectNodeBuilder() + .withMember("version", "1.0") + .withMember("projections", projectionsBuilder.build()) + .withMember("outputDirectory", outputDirectoryArg) + .build())) + } +} + +tasks["build"].dependsOn(tasks["generate-smithy-build"]) diff --git a/tools/code-generation/smithy/codegen/cpp-pagination/smithy-build.json b/tools/code-generation/smithy/codegen/cpp-pagination/smithy-build.json new file mode 100644 index 000000000000..11f7416fb6a9 --- /dev/null +++ b/tools/code-generation/smithy/codegen/cpp-pagination/smithy-build.json @@ -0,0 +1,36 @@ +{ + "version": "1.0", + "projections": { + "ec2.2016-11-15": { + "imports": [ + "/Users/cailinn/Desktop/workspace/aws-sdk-cpp/tools/code-generation/smithy/api-descriptions/ec2.json" + ], + "plugins": { + "cpp-codegen-pagination-plugin": { + "c2jMap": "{\"api-gateway\": \"apigateway\", \"application-auto-scaling\": \"application-autoscaling\", \"app-mesh\": \"appmesh\", \"auto-scaling\": \"autoscaling\", \"auto-scaling-plans\": \"autoscaling-plans\", \"cloudhsm-v2\": \"cloudhsmv2\", \"cloudsearch-domain\": \"cloudsearchdomain\", \"config-service\": \"config\", \"cost-and-usage-report-service\": \"cur\", \"data-pipeline\": \"datapipeline\", \"device-farm\": \"devicefarm\", \"direct-connect\": \"directconnect\", \"dynamodb-streams\": \"dynamodbstreams\", \"elastic-beanstalk\": \"elasticbeanstalk\", \"elastic-load-balancing\": \"elasticloadbalancing\", \"elastic-load-balancing-v2\": \"elasticloadbalancingv2\", \"global-accelerator\": \"globalaccelerator\", \"iot-1click-devices-service\": \"iot1click-devices\", \"iot-1click-projects\": \"iot1click-projects\", \"iot-data-plane\": \"iot-data\", \"iot-events-data\": \"iotevents-data\", \"iot-events\": \"iotevents\", \"iot-jobs-data-plane\": \"iot-jobs-data\", \"iot-wireless\": \"iotwireless\", \"kinesis-analytics\": \"kinesisanalytics\", \"kinesis-analytics-v2\": \"kinesisanalyticsv2\", \"kinesis-video\": \"kinesisvideo\", \"lex-models-v2\": \"lexv2-models\", \"lex-runtime-service\": \"lex\", \"lex-runtime-v2\": \"lexv2-runtime\", \"machine-learning\": \"machinelearning\", \"marketplace-commerce-analytics\": \"marketplacecommerceanalytics\", \"marketplace-entitlement-service\": \"marketplace-entitlement\", \"marketplace-metering\": \"meteringmarketplace\", \"migration-hub\": \"AWSMigrationHub\", \"mturk\": \"mturk-requester\", \"pinpoint-sms-voice\": \"sms-voice\", \"resource-groups-tagging-api\": \"resourcegroupstaggingapi\", \"route-53-domains\": \"route53domains\", \"route-53\": \"route53\", \"s3-control\": \"s3control\", \"sagemaker-runtime\": \"sagemaker-runtime\", \"secrets-manager\": \"secretsmanager\", \"serverlessapplicationrepository\": \"serverlessrepo\", \"service-catalog-appregistry\": \"servicecatalog-appregistry\", \"service-catalog\": \"servicecatalog\", \"transfer\": \"awstransfer\", \"cloudwatch\": \"monitoring\", \"cloudwatch-events\": \"events\", \"storage-gateway\": \"storagegateway\", \"efs\": \"elasticfilesystem\", \"emr\": \"elasticmapreduce\", \"ses\": \"email\", \"cognito-identity-provider\": \"cognito-idp\", \"cost-explorer\": \"ce\", \"application-discovery-service\": \"discovery\", \"database-migration-service\": \"dms\", \"sfn\": \"states\", \"lex-model-building-service\": \"lex-models\", \"cloudwatch-logs\": \"logs\", \"directory-service\": \"ds\", \"elasticsearch-service\": \"es\", \"importexport\": \"importexport\", \"sdb\": \"sdb\", \"transcribe-streaming\": \"transcribestreaming\"}" + } + } + }, + "s3.2006-03-01": { + "imports": [ + "/Users/cailinn/Desktop/workspace/aws-sdk-cpp/tools/code-generation/smithy/api-descriptions/s3.json" + ], + "plugins": { + "cpp-codegen-pagination-plugin": { + "c2jMap": "{\"api-gateway\": \"apigateway\", \"application-auto-scaling\": \"application-autoscaling\", \"app-mesh\": \"appmesh\", \"auto-scaling\": \"autoscaling\", \"auto-scaling-plans\": \"autoscaling-plans\", \"cloudhsm-v2\": \"cloudhsmv2\", \"cloudsearch-domain\": \"cloudsearchdomain\", \"config-service\": \"config\", \"cost-and-usage-report-service\": \"cur\", \"data-pipeline\": \"datapipeline\", \"device-farm\": \"devicefarm\", \"direct-connect\": \"directconnect\", \"dynamodb-streams\": \"dynamodbstreams\", \"elastic-beanstalk\": \"elasticbeanstalk\", \"elastic-load-balancing\": \"elasticloadbalancing\", \"elastic-load-balancing-v2\": \"elasticloadbalancingv2\", \"global-accelerator\": \"globalaccelerator\", \"iot-1click-devices-service\": \"iot1click-devices\", \"iot-1click-projects\": \"iot1click-projects\", \"iot-data-plane\": \"iot-data\", \"iot-events-data\": \"iotevents-data\", \"iot-events\": \"iotevents\", \"iot-jobs-data-plane\": \"iot-jobs-data\", \"iot-wireless\": \"iotwireless\", \"kinesis-analytics\": \"kinesisanalytics\", \"kinesis-analytics-v2\": \"kinesisanalyticsv2\", \"kinesis-video\": \"kinesisvideo\", \"lex-models-v2\": \"lexv2-models\", \"lex-runtime-service\": \"lex\", \"lex-runtime-v2\": \"lexv2-runtime\", \"machine-learning\": \"machinelearning\", \"marketplace-commerce-analytics\": \"marketplacecommerceanalytics\", \"marketplace-entitlement-service\": \"marketplace-entitlement\", \"marketplace-metering\": \"meteringmarketplace\", \"migration-hub\": \"AWSMigrationHub\", \"mturk\": \"mturk-requester\", \"pinpoint-sms-voice\": \"sms-voice\", \"resource-groups-tagging-api\": \"resourcegroupstaggingapi\", \"route-53-domains\": \"route53domains\", \"route-53\": \"route53\", \"s3-control\": \"s3control\", \"sagemaker-runtime\": \"sagemaker-runtime\", \"secrets-manager\": \"secretsmanager\", \"serverlessapplicationrepository\": \"serverlessrepo\", \"service-catalog-appregistry\": \"servicecatalog-appregistry\", \"service-catalog\": \"servicecatalog\", \"transfer\": \"awstransfer\", \"cloudwatch\": \"monitoring\", \"cloudwatch-events\": \"events\", \"storage-gateway\": \"storagegateway\", \"efs\": \"elasticfilesystem\", \"emr\": \"elasticmapreduce\", \"ses\": \"email\", \"cognito-identity-provider\": \"cognito-idp\", \"cost-explorer\": \"ce\", \"application-discovery-service\": \"discovery\", \"database-migration-service\": \"dms\", \"sfn\": \"states\", \"lex-model-building-service\": \"lex-models\", \"cloudwatch-logs\": \"logs\", \"directory-service\": \"ds\", \"elasticsearch-service\": \"es\", \"importexport\": \"importexport\", \"sdb\": \"sdb\", \"transcribe-streaming\": \"transcribestreaming\"}" + } + } + }, + "dynamodb.2012-08-10": { + "imports": [ + "/Users/cailinn/Desktop/workspace/aws-sdk-cpp/tools/code-generation/smithy/api-descriptions/dynamodb.json" + ], + "plugins": { + "cpp-codegen-pagination-plugin": { + "c2jMap": "{\"api-gateway\": \"apigateway\", \"application-auto-scaling\": \"application-autoscaling\", \"app-mesh\": \"appmesh\", \"auto-scaling\": \"autoscaling\", \"auto-scaling-plans\": \"autoscaling-plans\", \"cloudhsm-v2\": \"cloudhsmv2\", \"cloudsearch-domain\": \"cloudsearchdomain\", \"config-service\": \"config\", \"cost-and-usage-report-service\": \"cur\", \"data-pipeline\": \"datapipeline\", \"device-farm\": \"devicefarm\", \"direct-connect\": \"directconnect\", \"dynamodb-streams\": \"dynamodbstreams\", \"elastic-beanstalk\": \"elasticbeanstalk\", \"elastic-load-balancing\": \"elasticloadbalancing\", \"elastic-load-balancing-v2\": \"elasticloadbalancingv2\", \"global-accelerator\": \"globalaccelerator\", \"iot-1click-devices-service\": \"iot1click-devices\", \"iot-1click-projects\": \"iot1click-projects\", \"iot-data-plane\": \"iot-data\", \"iot-events-data\": \"iotevents-data\", \"iot-events\": \"iotevents\", \"iot-jobs-data-plane\": \"iot-jobs-data\", \"iot-wireless\": \"iotwireless\", \"kinesis-analytics\": \"kinesisanalytics\", \"kinesis-analytics-v2\": \"kinesisanalyticsv2\", \"kinesis-video\": \"kinesisvideo\", \"lex-models-v2\": \"lexv2-models\", \"lex-runtime-service\": \"lex\", \"lex-runtime-v2\": \"lexv2-runtime\", \"machine-learning\": \"machinelearning\", \"marketplace-commerce-analytics\": \"marketplacecommerceanalytics\", \"marketplace-entitlement-service\": \"marketplace-entitlement\", \"marketplace-metering\": \"meteringmarketplace\", \"migration-hub\": \"AWSMigrationHub\", \"mturk\": \"mturk-requester\", \"pinpoint-sms-voice\": \"sms-voice\", \"resource-groups-tagging-api\": \"resourcegroupstaggingapi\", \"route-53-domains\": \"route53domains\", \"route-53\": \"route53\", \"s3-control\": \"s3control\", \"sagemaker-runtime\": \"sagemaker-runtime\", \"secrets-manager\": \"secretsmanager\", \"serverlessapplicationrepository\": \"serverlessrepo\", \"service-catalog-appregistry\": \"servicecatalog-appregistry\", \"service-catalog\": \"servicecatalog\", \"transfer\": \"awstransfer\", \"cloudwatch\": \"monitoring\", \"cloudwatch-events\": \"events\", \"storage-gateway\": \"storagegateway\", \"efs\": \"elasticfilesystem\", \"emr\": \"elasticmapreduce\", \"ses\": \"email\", \"cognito-identity-provider\": \"cognito-idp\", \"cost-explorer\": \"ce\", \"application-discovery-service\": \"discovery\", \"database-migration-service\": \"dms\", \"sfn\": \"states\", \"lex-model-building-service\": \"lex-models\", \"cloudwatch-logs\": \"logs\", \"directory-service\": \"ds\", \"elasticsearch-service\": \"es\", \"importexport\": \"importexport\", \"sdb\": \"sdb\", \"transcribe-streaming\": \"transcribestreaming\"}" + } + } + } + }, + "outputDirectory": "output" +} \ No newline at end of file diff --git a/tools/code-generation/smithy/codegen/settings.gradle.kts b/tools/code-generation/smithy/codegen/settings.gradle.kts index bc2b770a2730..e14d59a763f9 100644 --- a/tools/code-generation/smithy/codegen/settings.gradle.kts +++ b/tools/code-generation/smithy/codegen/settings.gradle.kts @@ -2,6 +2,8 @@ rootProject.name = "smithy_code_generation" include("cpp-smoke-tests") include("cpp-smoke-tests-codegen") +include("cpp-pagination-codegen") +include("cpp-pagination") pluginManagement { repositories { diff --git a/tools/code-generation/smithy/codegen/smithy2c2j_service_map.json b/tools/code-generation/smithy/codegen/smithy2c2j_service_map.json index d4865618ff4f..1ff0190e0acb 100644 --- a/tools/code-generation/smithy/codegen/smithy2c2j_service_map.json +++ b/tools/code-generation/smithy/codegen/smithy2c2j_service_map.json @@ -60,7 +60,7 @@ "lex-model-building-service":"lex-models", "cloudwatch-logs":"logs", "directory-service":"ds", - "elasticsearch-service ":"es", + "elasticsearch-service":"es", "importexport":"importexport", "sdb":"sdb", "transcribe-streaming":"transcribestreaming" diff --git a/tools/scripts/codegen/legacy_c2j_cpp_gen.py b/tools/scripts/codegen/legacy_c2j_cpp_gen.py index 7e1df6be35f1..ee77eaa90c4b 100644 --- a/tools/scripts/codegen/legacy_c2j_cpp_gen.py +++ b/tools/scripts/codegen/legacy_c2j_cpp_gen.py @@ -16,7 +16,6 @@ from concurrent.futures import ProcessPoolExecutor, wait, FIRST_COMPLETED, ALL_COMPLETED from pathlib import Path -from codegen.format_util import format_directories from codegen.include_tests_util import IncludeTestsUtil from codegen.model_utils import ServiceModel @@ -149,12 +148,6 @@ def generate(self, executor: ProcessPoolExecutor, max_workers: int, args: dict) print(f"Code generation done, (re)generated {len(done)} packages.") # Including defaults and partitions - # Format generated client code - generated_clients = [service for service in self.c2j_models.keys()] - if generated_clients: - client_dirs = [f"{self.output_location}/src/aws-cpp-sdk-{client}" for client in generated_clients] - format_directories(client_dirs) - return 0 def _init_common_java_cli(self, diff --git a/tools/scripts/codegen/pagination_gen.py b/tools/scripts/codegen/pagination_gen.py new file mode 100644 index 000000000000..67f34153327f --- /dev/null +++ b/tools/scripts/codegen/pagination_gen.py @@ -0,0 +1,126 @@ +#!/usr/bin/env python3 + +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: Apache-2.0. + +""" +Wrapper for Smithy pagination generator +""" +import json +import os +import shutil +import subprocess +from typing import List + +SMITHY_GENERATOR_LOCATION = "tools/code-generation/smithy/codegen" +SMITHY_TO_C2J_MAP_FILE = "tools/code-generation/smithy/codegen/smithy2c2j_service_map.json" + + +class PaginationGen(object): + """Wrapper for Smithy pagination generator for C++ SDK""" + + def __init__(self, debug: bool, **kwargs): + self.debug = debug + with open(os.path.abspath(SMITHY_TO_C2J_MAP_FILE), 'r') as file: + self.smithy_c2j_data = json.load(file) + self.c2j_smithy_data = {value: key for key, value in self.smithy_c2j_data.items()} + + def generate(self, clients_to_build: set): + """Generate pagination APIs for SDK clients""" + smithy_services = [self.c2j_smithy_data.get(service, service) for service in clients_to_build] + if self.debug: + print(f"Generating pagination for: {','.join(smithy_services)}") + + if self._generate_pagination(smithy_services, json.dumps(self.smithy_c2j_data)): + target_dir = os.path.abspath("generated/src") + self._copy_cpp_codegen_contents( + os.path.abspath("tools/code-generation/smithy/codegen"), + "cpp-codegen-pagination-plugin", + target_dir + ) + return 0 + return -1 + + def _generate_pagination(self, smithy_services: List[str], smithy_c2j_data: str): + smithy_codegen_command = [ + "./gradlew", + ":cpp-pagination:build", + "-PservicesFilter=" + ",".join(smithy_services), + "-Pc2jMap=" + smithy_c2j_data + ] + + try: + if self.debug: + print(f"RUNNING: {' '.join(smithy_codegen_command)}\nFROM: {SMITHY_GENERATOR_LOCATION}") + + process = subprocess.run( + smithy_codegen_command, + timeout=6*60, + check=True, + capture_output=True, + text=True, + cwd=SMITHY_GENERATOR_LOCATION + ) + print("Pagination codegen successful!") + if self.debug: + print(process.stdout) + print(f"Pagination generation done, (re)generated {len(smithy_services)} package(s).") + return True + + except subprocess.CalledProcessError as e: + print(f"Command failed: {e.returncode}\nError: {e.stderr}") + return False + + def _copy_cpp_codegen_contents(self, top_level_dir: str, plugin_name: str, target_dir: str): + # Walk only cpp-pagination subdirectory to avoid .git and gradle cache + cpp_pagination_dir = os.path.join(top_level_dir, "cpp-pagination") + # TODO: Verify if this check is still needed after Smithy generator always creates output + if not os.path.exists(cpp_pagination_dir): + if self.debug: + print(f"No cpp-pagination directory found at '{cpp_pagination_dir}'") + return + + for root, dirs, files in os.walk(cpp_pagination_dir): + if plugin_name in dirs: + source_dir = os.path.join(root, plugin_name) + + # Extract service name from the projection directory + projection_dir = os.path.basename(os.path.dirname(source_dir)) + smithy_service_name = projection_dir.split('.')[0] # e.g., "api-gateway.2017-11-27" -> "api-gateway" + + # Map to c2j service name + c2j_service_name = self.smithy_c2j_data.get(smithy_service_name, smithy_service_name) + + service_target_dir = os.path.join(target_dir, f"aws-cpp-sdk-{c2j_service_name}") + os.makedirs(service_target_dir, exist_ok=True) + + for item in os.listdir(source_dir): + source_item = os.path.join(source_dir, item) + + # Handle test directories separately - move to generated/tests + if item == "generated" and os.path.isdir(source_item): + generated_source = os.path.join(source_item, "tests") + if os.path.exists(generated_source): + test_target_dir = os.path.abspath("generated/tests") + os.makedirs(test_target_dir, exist_ok=True) + shutil.copytree(generated_source, test_target_dir, dirs_exist_ok=True) + if self.debug: + print(f"Copied tests from '{generated_source}' to '{test_target_dir}'") + continue + + target_item = os.path.join(service_target_dir, item) + if os.path.isdir(source_item): + shutil.copytree(source_item, target_item, dirs_exist_ok=True) + else: + shutil.copy2(source_item, target_item) + + if self.debug: + print(f"Copied from '{source_dir}' to '{service_target_dir}'") + + # Cleanup output directory + output_dir = os.path.join(top_level_dir, "cpp-pagination/output") + if os.path.exists(output_dir): + shutil.rmtree(output_dir) + if self.debug: + print(f"Cleaned up '{output_dir}'") + diff --git a/tools/scripts/codegen/smoke_tests_gen.py b/tools/scripts/codegen/smoke_tests_gen.py index 5d35da107c03..030df401e779 100644 --- a/tools/scripts/codegen/smoke_tests_gen.py +++ b/tools/scripts/codegen/smoke_tests_gen.py @@ -67,8 +67,8 @@ def generate(self, clients_to_build: set): def _generate_smoke_tests(self, smithy_services: List[str], smithy_c2j_data: str): smithy_codegen_command = [ "./gradlew", - "clean", - "build", + ":cpp-smoke-tests:clean", + ":cpp-smoke-tests:build", "-PoutputDirectory=" + SMITHY_OUTPUT_DIR, "-PservicesFilter=" + ",".join(smithy_services), "-Pc2jMap=" + smithy_c2j_data @@ -103,8 +103,16 @@ def _copy_cpp_codegen_contents(self, top_level_dir: str, plugin_name: str, targe if self.debug: print(f"_copy_cpp_codegen_contents: {target_dir}") - # Walk through the top-level directory and find all "cpp-codegen-smoke-tests-plugin" directories - for root, dirs, files in os.walk(top_level_dir): + # Walk only cpp-smoke-tests subdirectory to avoid .git and gradle cache + cpp_smoke_tests_dir = os.path.join(top_level_dir, "cpp-smoke-tests") + # TODO: Verify if this check is still needed after Smithy generator always creates output + if not os.path.exists(cpp_smoke_tests_dir): + if self.debug: + print(f"No cpp-smoke-tests directory found at '{cpp_smoke_tests_dir}'") + return + + # Walk through the cpp-smoke-tests directory and find all plugin directories + for root, dirs, files in os.walk(cpp_smoke_tests_dir): if plugin_name in dirs: source_dir = os.path.join(root, plugin_name) # recursively copy all contents from the source to the target folder diff --git a/tools/scripts/run_code_generation.py b/tools/scripts/run_code_generation.py index 014ee39ce3dc..b88ee081179e 100644 --- a/tools/scripts/run_code_generation.py +++ b/tools/scripts/run_code_generation.py @@ -13,6 +13,8 @@ from codegen.model_utils import ModelUtils from codegen.protocol_tests_gen import ProtocolTestsGen from codegen.smoke_tests_gen import SmokeTestsGen +from codegen.pagination_gen import PaginationGen +from codegen.format_util import format_directories def parse_arguments() -> dict: @@ -154,12 +156,26 @@ def main(): # generate code using smithy for all discoverable clients # clients_to_build check is present because user can generate only defaults or partitions or protocol-tests clients_to_build = model_utils.get_clients_to_build() + + if clients_to_build: + pagination_gen = PaginationGen(args["debug"]) + if pagination_gen.generate(clients_to_build) != 0: + print("ERROR: Failed to generate pagination!") + return -1 + if args["generate_smoke_tests"] and clients_to_build: smoke_tests_gen = SmokeTestsGen(args["debug"]) if smoke_tests_gen.generate(clients_to_build) != 0: print("ERROR: Failed to generate smoke test(s)!") return -1 + # Format all generated C++ code at the end + if clients_to_build: + client_dirs = [f"{args['output_location']}/src/aws-cpp-sdk-{client}" for client in clients_to_build] + existing_dirs = [d for d in client_dirs if os.path.exists(d)] + if existing_dirs: + format_directories(existing_dirs) + return 0 From 11c6a37457a091b1be95c47fa754feaaeebfb522 Mon Sep 17 00:00:00 2001 From: kai lin Date: Tue, 3 Feb 2026 14:07:15 -0500 Subject: [PATCH 2/5] added a new codegen project for cpp-codegen --- .gitignore | 3 + .../generators/CompilationTestParser.java | 45 ---- .../PaginationClientHeaderGenerator.java | 76 ------ .../PaginationCompilationTestGenerator.java | 107 -------- .../templates/PaginationTraitsGenerator.java | 207 -------------- .../codegen/cpp-pagination/smithy-build.json | 36 --- .../smithy/codegen/settings.gradle.kts | 2 - .../build.gradle.kts | 40 +-- .../smithy/cpp-codegen/gradle.properties | 11 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43583 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + .../smithy/cpp-codegen/gradlew | 252 ++++++++++++++++++ .../smithy/cpp-codegen/gradlew.bat | 94 +++++++ .../smithy/cpp-codegen/settings.gradle.kts | 10 + .../smithy-cpp-codegen}/build.gradle.kts | 13 +- .../BaseCompilationTestGenerator.java | 88 ++++++ .../generators/BaseHeaderGenerator.java | 58 ++++ .../generators/BaseTraitsGenerator.java | 56 ++++ .../generators/ClientCodegenSettings.java | 0 .../generators/CppImportContainer.java | 0 .../generators/CppWriter.java | 0 .../generators/CppWriterDelegator.java | 0 .../generators/FeatureParser.java | 0 .../generators/OperationData.java | 0 .../generators/ServiceNameUtil.java | 0 .../generators/ShapeUtil.java | 0 .../pagination}/PaginationBaseGenerator.java | 57 ++-- .../PaginationClientHeaderGenerator.java | 48 ++++ .../pagination}/PaginationCodegenPlugin.java | 69 +---- .../PaginationCompilationTestGenerator.java | 69 +++++ .../PaginationEmptyHeaderGenerator.java | 54 ++++ .../pagination/PaginationTraitsGenerator.java | 185 +++++++++++++ ...ware.amazon.smithy.build.SmithyBuildPlugin | 0 .../cpp-codegen/smithy2c2j_service_map.json | 68 +++++ tools/scripts/codegen/pagination_gen.py | 21 +- tools/scripts/codegen/smoke_tests_gen.py | 16 +- 36 files changed, 1059 insertions(+), 633 deletions(-) delete mode 100644 tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CompilationTestParser.java delete mode 100644 tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationClientHeaderGenerator.java delete mode 100644 tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationCompilationTestGenerator.java delete mode 100644 tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationTraitsGenerator.java delete mode 100644 tools/code-generation/smithy/codegen/cpp-pagination/smithy-build.json rename tools/code-generation/smithy/{codegen/cpp-pagination => cpp-codegen}/build.gradle.kts (65%) create mode 100644 tools/code-generation/smithy/cpp-codegen/gradle.properties create mode 100644 tools/code-generation/smithy/cpp-codegen/gradle/wrapper/gradle-wrapper.jar create mode 100644 tools/code-generation/smithy/cpp-codegen/gradle/wrapper/gradle-wrapper.properties create mode 100755 tools/code-generation/smithy/cpp-codegen/gradlew create mode 100644 tools/code-generation/smithy/cpp-codegen/gradlew.bat create mode 100644 tools/code-generation/smithy/cpp-codegen/settings.gradle.kts rename tools/code-generation/smithy/{codegen/cpp-pagination-codegen => cpp-codegen/smithy-cpp-codegen}/build.gradle.kts (50%) create mode 100644 tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/BaseCompilationTestGenerator.java create mode 100644 tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/BaseHeaderGenerator.java create mode 100644 tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/BaseTraitsGenerator.java rename tools/code-generation/smithy/{codegen/cpp-pagination-codegen => cpp-codegen/smithy-cpp-codegen}/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ClientCodegenSettings.java (100%) rename tools/code-generation/smithy/{codegen/cpp-pagination-codegen => cpp-codegen/smithy-cpp-codegen}/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CppImportContainer.java (100%) rename tools/code-generation/smithy/{codegen/cpp-pagination-codegen => cpp-codegen/smithy-cpp-codegen}/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CppWriter.java (100%) rename tools/code-generation/smithy/{codegen/cpp-pagination-codegen => cpp-codegen/smithy-cpp-codegen}/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CppWriterDelegator.java (100%) rename tools/code-generation/smithy/{codegen/cpp-pagination-codegen => cpp-codegen/smithy-cpp-codegen}/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/FeatureParser.java (100%) rename tools/code-generation/smithy/{codegen/cpp-pagination-codegen => cpp-codegen/smithy-cpp-codegen}/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/OperationData.java (100%) rename tools/code-generation/smithy/{codegen/cpp-pagination-codegen => cpp-codegen/smithy-cpp-codegen}/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ServiceNameUtil.java (100%) rename tools/code-generation/smithy/{codegen/cpp-pagination-codegen => cpp-codegen/smithy-cpp-codegen}/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ShapeUtil.java (100%) rename tools/code-generation/smithy/{codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates => cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination}/PaginationBaseGenerator.java (63%) create mode 100644 tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationClientHeaderGenerator.java rename tools/code-generation/smithy/{codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates => cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination}/PaginationCodegenPlugin.java (55%) create mode 100644 tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationCompilationTestGenerator.java create mode 100644 tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationEmptyHeaderGenerator.java create mode 100644 tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationTraitsGenerator.java rename tools/code-generation/smithy/{codegen/cpp-pagination-codegen => cpp-codegen/smithy-cpp-codegen}/src/main/resources/META-INF/services/software.amazon.smithy.build.SmithyBuildPlugin (100%) create mode 100644 tools/code-generation/smithy/cpp-codegen/smithy2c2j_service_map.json diff --git a/.gitignore b/.gitignore index 80c423082bb0..8c496b9064be 100644 --- a/.gitignore +++ b/.gitignore @@ -82,6 +82,9 @@ toolchains/android/ tools/code-generation/generator/target/ tools/code-generation/smithy/codegen/gradle/ tools/code-generation/smithy/codegen/.gradle/ +tools/code-generation/smithy/cpp-codegen/.gradle/ +tools/code-generation/smithy/cpp-codegen/output/ +tools/code-generation/smithy/cpp-codegen/smithy-build.json #config output aws-cpp-sdk-core/include/aws/core/SDKConfig.h diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CompilationTestParser.java b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CompilationTestParser.java deleted file mode 100644 index 7c8d4ed41312..000000000000 --- a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CompilationTestParser.java +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0. - */ -package com.amazonaws.util.awsclientsmithygenerator.generators; - -import software.amazon.smithy.build.PluginContext; -import software.amazon.smithy.model.shapes.*; -import software.amazon.smithy.aws.traits.ServiceTrait; -import com.amazonaws.util.awsclientsmithygenerator.generators.CppWriter; -import com.amazonaws.util.awsclientsmithygenerator.generators.ServiceNameUtil; -import java.util.*; -import java.util.function.Consumer; - -public class CompilationTestParser { - private final ServiceShape service; - private final CppWriterDelegator writerDelegator; - private final String testType; - private final Consumer renderFunction; - private final Map serviceMap; - - public CompilationTestParser(PluginContext context, ServiceShape service, List operations, - String testType, Consumer renderFunction, Map serviceMap) { - this.service = service; - this.writerDelegator = new CppWriterDelegator(context.getFileManifest()); - this.testType = testType; - this.renderFunction = renderFunction; - this.serviceMap = serviceMap; - } - - public void run() { - generateCompilationTest(); - writerDelegator.flushWriters(); - } - - private void generateCompilationTest() { - String serviceName = ServiceNameUtil.getServiceName(service); - String c2jServiceName = ServiceNameUtil.getSmithyServiceName(service, serviceMap); - - writerDelegator.useFileWriter( - "generated/tests/" + c2jServiceName + "-gen-tests/" + serviceName + testType + "CompilationTests.cpp", - renderFunction - ); - } -} \ No newline at end of file diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationClientHeaderGenerator.java b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationClientHeaderGenerator.java deleted file mode 100644 index cd6d3400e7db..000000000000 --- a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationClientHeaderGenerator.java +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0. - */ -package com.amazonaws.util.awsclientsmithygenerator.generators.templates; - -import com.amazonaws.util.awsclientsmithygenerator.generators.CppWriter; -import com.amazonaws.util.awsclientsmithygenerator.generators.OperationData; -import com.amazonaws.util.awsclientsmithygenerator.generators.ServiceNameUtil; -import com.amazonaws.util.awsclientsmithygenerator.generators.ShapeUtil; -import software.amazon.smithy.model.shapes.ServiceShape; -import software.amazon.smithy.aws.traits.ServiceTrait; -import software.amazon.smithy.model.traits.PaginatedTrait; -import com.amazonaws.util.awsclientsmithygenerator.generators.ServiceNameUtil; -import java.util.List; -import java.util.Map; - -public class PaginationClientHeaderGenerator { - private final ServiceShape service; - private final List> paginatedOps; - private final Map serviceMap; - private final String smithyServiceName; - - public PaginationClientHeaderGenerator(ServiceShape service, List> paginatedOps, Map serviceMap) { - this.service = service; - this.paginatedOps = paginatedOps; - this.serviceMap = serviceMap; - this.smithyServiceName = ServiceNameUtil.getSmithyServiceName(service, serviceMap); - } - - public void render(CppWriter writer) { - String serviceName = ServiceNameUtil.getServiceName(service); - String smithyServiceName = ServiceNameUtil.getSmithyServiceName(service, serviceMap); - - // Header and includes - writer.write("/**"); - writer.write(" * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved."); - writer.write(" * SPDX-License-Identifier: Apache-2.0."); - writer.write(" */"); - writer.write(""); - writer.write("#pragma once"); - - renderIncludes(writer, serviceName, smithyServiceName); - renderNamespaces(writer, serviceName); - } - - private void renderIncludes(CppWriter writer, String serviceName, String smithyServiceName) { - String classPrefix = ServiceNameUtil.getServiceNameUpperCamel(service); - writer.writeInclude("aws/" + smithyServiceName + "/" + classPrefix + "Client.h"); - writer.writeInclude("aws/core/utils/pagination/Paginator.h"); - - for (OperationData data : paginatedOps) { - String opName = data.getOperation().getId().getName(); - writer.writeInclude("aws/" + smithyServiceName + "/model/" + opName + "PaginationTraits.h"); - } - writer.write(""); - } - - private void renderNamespaces(CppWriter writer, String serviceName) { - String classPrefix = ServiceNameUtil.getServiceNameUpperCamel(service); - writer.writeNamespaceOpen("Aws"); - writer.writeNamespaceOpen(serviceName); - writer.write(""); - - for (OperationData data : paginatedOps) { - String opName = data.getOperation().getId().getName(); - String methodName = ShapeUtil.getOperationMethodName(opName, smithyServiceName); - writer.write("using $LPaginator = Aws::Utils::Pagination::PagePaginator<$LClient, Model::$LRequest, Pagination::$LPaginationTraits>;", - opName, classPrefix, methodName, opName); - } - - writer.write(""); - writer.writeNamespaceClose(serviceName); - writer.writeNamespaceClose("Aws"); - } -} \ No newline at end of file diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationCompilationTestGenerator.java b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationCompilationTestGenerator.java deleted file mode 100644 index fbda6b736615..000000000000 --- a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationCompilationTestGenerator.java +++ /dev/null @@ -1,107 +0,0 @@ -/** - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0. - */ -package com.amazonaws.util.awsclientsmithygenerator.generators.templates; - -import software.amazon.smithy.build.PluginContext; -import software.amazon.smithy.model.shapes.*; -import com.amazonaws.util.awsclientsmithygenerator.generators.CppWriter; -import com.amazonaws.util.awsclientsmithygenerator.generators.CompilationTestParser; -import com.amazonaws.util.awsclientsmithygenerator.generators.OperationData; -import com.amazonaws.util.awsclientsmithygenerator.generators.ServiceNameUtil; -import software.amazon.smithy.model.traits.PaginatedTrait; -import java.util.*; - -public class PaginationCompilationTestGenerator { - private final CompilationTestParser> parser; - private final List> allPaginatedOps; - private final Map serviceMap; - - public PaginationCompilationTestGenerator(PluginContext context, ServiceShape service, List> allPaginatedOps, Map serviceMap) { - this.allPaginatedOps = allPaginatedOps; - this.serviceMap = serviceMap; - this.parser = new CompilationTestParser<>( - context, - service, - allPaginatedOps, - "Pagination", - this::render, - serviceMap - ); - } - - public void run() { - parser.run(); - } - - public void render(CppWriter writer) { - // Get service from the first operation since all operations belong to the same service - ServiceShape service = allPaginatedOps.get(0).getService(); - String serviceName = ServiceNameUtil.getServiceName(service); - - writer.write("/**") - .write(" * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.") - .write(" * SPDX-License-Identifier: Apache-2.0.") - .write(" */") - .write("") - .write("// Header compilation test for " + serviceName + " pagination headers") - .write("// This test ensures all generated pagination headers compile successfully") - .write(""); - - // Include all service headers - writeIncludes(writer); - - writer.write("") - .write("#include ") - .write(""); - - writer.openBlock("class " + serviceName + "PaginationCompilationTest : public Aws::Testing::AwsCppSdkGTestSuite\n{", "};", () -> { - // Empty class body - }); - - writer.write(""); - - writer.openBlock("TEST_F(" + serviceName + "PaginationCompilationTest, " + serviceName + "PaginationHeadersCompile)\n{", "}", () -> { - writer.write(" // Test passes if compilation succeeds") - .write(" SUCCEED();"); - }); - } - - private void writeIncludes(CppWriter writer) { - Set clientHeaders = new HashSet<>(); - Set traitHeaders = new HashSet<>(); - Set mixinHeaders = new HashSet<>(); - - for (OperationData paginationData : allPaginatedOps) { - ServiceShape service = paginationData.getService(); - String serviceName = ServiceNameUtil.getServiceNameUpperCamel(service); - String smithyServiceName = ServiceNameUtil.getSmithyServiceName(service, serviceMap); - - // Collect unique client headers - clientHeaders.add("aws/" + smithyServiceName + "/" + serviceName + "ClientPagination.h"); - - // Collect unique mixin headers - mixinHeaders.add("aws/" + smithyServiceName + "/" + serviceName + "PaginationBase.h"); - - // Collect unique trait headers - String operationName = paginationData.getOperation().getId().getName(); - traitHeaders.add("aws/" + smithyServiceName + "/model/" + operationName + "PaginationTraits.h"); - } - - // Write unique client headers - for (String header : clientHeaders) { - writer.writeInclude(header); - } - - // Write unique mixin headers - for (String header : mixinHeaders) { - writer.writeInclude(header); - } - - // Write unique trait headers - for (String header : traitHeaders) { - writer.writeInclude(header); - } - } -} \ No newline at end of file diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationTraitsGenerator.java b/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationTraitsGenerator.java deleted file mode 100644 index cce819756f5c..000000000000 --- a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationTraitsGenerator.java +++ /dev/null @@ -1,207 +0,0 @@ -/** - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0. - */ -package com.amazonaws.util.awsclientsmithygenerator.generators.templates; - -import software.amazon.smithy.build.PluginContext; -import software.amazon.smithy.model.shapes.*; -import software.amazon.smithy.model.traits.PaginatedTrait; -import software.amazon.smithy.aws.traits.ServiceTrait; -import com.amazonaws.util.awsclientsmithygenerator.generators.OperationData; -import com.amazonaws.util.awsclientsmithygenerator.generators.CppWriter; -import com.amazonaws.util.awsclientsmithygenerator.generators.CppWriterDelegator; -import com.amazonaws.util.awsclientsmithygenerator.generators.ServiceNameUtil; -import com.amazonaws.util.awsclientsmithygenerator.generators.ShapeUtil; -import java.util.*; -import java.util.Arrays; - -public class PaginationTraitsGenerator { - private final PluginContext context; - private final ServiceShape service; - private final List> paginatedOps; - private final String smithyServiceName; - - private final CppWriterDelegator writerDelegator; - - public PaginationTraitsGenerator(PluginContext context, ServiceShape service, List> paginatedOps, String smithyServiceName) { - this.context = context; - this.service = service; - this.paginatedOps = paginatedOps; - this.smithyServiceName = smithyServiceName; - this.writerDelegator = new CppWriterDelegator(context.getFileManifest()); - } - - public void write() { - String serviceName = ServiceNameUtil.getServiceName(service); - - for (OperationData data : paginatedOps) { - String fileName = "include/aws/" + smithyServiceName + "/model/" + data.getOperation().getId().getName() + "PaginationTraits.h"; - - writerDelegator.useFileWriter(fileName, writer -> { - generateTraitsHeader(writer, data, serviceName); - }); - } - - writerDelegator.flushWriters(); - } - - private void generateTraitsHeader(CppWriter writer, OperationData data, String serviceName) { - OperationShape op = data.getOperation(); - PaginatedTrait trait = data.getTrait(); - String opName = op.getId().getName(); - - // Header comment - writer.write("/**") - .write(" * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.") - .write(" * SPDX-License-Identifier: Apache-2.0.") - .write(" */") - .write("") - .write("#pragma once"); - - // Includes - detect suffix like C2J renameShape logic - String resultSuffix = ShapeUtil.getResultSuffix(context.getModel(), op, smithyServiceName); - String capitalizedServiceName = ServiceNameUtil.getServiceNameUpperCamel(service); - String requestFileName = ShapeUtil.getOperationMethodName(opName, smithyServiceName) + "Request"; - String resultFileName = ShapeUtil.getOperationMethodName(opName, smithyServiceName) + resultSuffix; - String methodName = ShapeUtil.getOperationMethodName(opName, smithyServiceName); - - writer.writeInclude("aws/" + smithyServiceName + "/" + capitalizedServiceName + "_EXPORTS.h") - .writeInclude("aws/" + smithyServiceName + "/model/" + requestFileName + ".h") - .writeInclude("aws/" + smithyServiceName + "/model/" + resultFileName + ".h") - .writeInclude("aws/" + smithyServiceName + "/" + capitalizedServiceName + "ServiceClientModel.h") - .write(""); - - // Namespaces - writer.writeNamespaceOpen("Aws") - .writeNamespaceOpen(serviceName) - .write("class " + capitalizedServiceName + "Client;") - .writeNamespaceOpen("Pagination") - .write(""); - - // Struct definition - writer.openBlock("struct " + opName + "PaginationTraits\n{", "};", () -> { - // Use detected suffix to match C2J renameShape logic - writer.write(" using RequestType = Model::$LRequest;", methodName) - .write(" using ResultType = Model::$L$L;", methodName, resultSuffix) - .write(" using OutcomeType = Model::$LOutcome;", methodName) - .write(" using ClientType = $LClient;", capitalizedServiceName) - .write(""); - - // Invoke method - template to defer instantiation - writer.write(" template") - .openBlock(" static OutcomeType Invoke(Client& client, const RequestType& request)\n {", " }", () -> { - writer.write(" return client.$L(request);", methodName); - }); - - writer.write(""); - - // HasMoreResults method - writer.openBlock(" static bool HasMoreResults(const ResultType& result)\n {", " }", () -> { - if (trait.getOutputToken().isPresent()) { - String outToken = trait.getOutputToken().get(); - - // Pattern A: Explicit nested token like "EngineDefaults.Marker" - if (outToken.contains(".")) { - String[] parts = outToken.split("\\.", 2); - String memberName = parts[0]; - String nestedTokenName = parts[1]; - if (ShapeUtil.isNumericToken(context.getModel(), op, smithyServiceName, memberName, nestedTokenName)) { - writer.write(" return result.Get$L().Get$L() != 0;", ServiceNameUtil.capitalize(memberName), ServiceNameUtil.capitalize(nestedTokenName)); - } else { - writer.write(" return !result.Get$L().Get$L().empty();", ServiceNameUtil.capitalize(memberName), ServiceNameUtil.capitalize(nestedTokenName)); - } - } - // Pattern B: Check if token is on top-level output - else if (ShapeUtil.hasTopLevelMember(context.getModel(), op, outToken)) { - if (ShapeUtil.isNumericToken(context.getModel(), op, smithyServiceName, null, outToken)) { - writer.write(" return result.Get$L() != 0;", ServiceNameUtil.capitalize(outToken)); - } else { - writer.write(" return !result.Get$L().empty();", ServiceNameUtil.capitalize(outToken)); - } - } - // Pattern C: Find wrapper member containing the token - else { - String wrapperMember = ShapeUtil.findWrapperMemberContainingToken(context.getModel(), op, outToken); - if (wrapperMember != null) { - if (ShapeUtil.isNumericToken(context.getModel(), op, smithyServiceName, wrapperMember, outToken)) { - writer.write(" return result.Get$L().Get$L() != 0;", ServiceNameUtil.capitalize(wrapperMember), ServiceNameUtil.capitalize(outToken)); - } else { - writer.write(" return !result.Get$L().Get$L().empty();", ServiceNameUtil.capitalize(wrapperMember), ServiceNameUtil.capitalize(outToken)); - } - } else if (ShapeUtil.hasTopLevelMember(context.getModel(), op, "IsTruncated")) { - writer.write(" return result.GetIsTruncated();"); - } else { - writer.write(" return false;"); - } - } - } else { - // Fallback to service-level pagination configuration when operation-level traits are missing. - // Some services like AccessAnalyzer define pagination tokens at the service level rather than per-operation. - String serviceLevelOutputToken = ShapeUtil.getServiceLevelToken(service, software.amazon.smithy.model.traits.PaginatedTrait.class, t -> t.getOutputToken()); - if (serviceLevelOutputToken != null) { - if (ShapeUtil.isNumericToken(context.getModel(), op, smithyServiceName, null, serviceLevelOutputToken)) { - writer.write(" return result.Get$L() != 0;", ServiceNameUtil.capitalize(serviceLevelOutputToken)); - } else { - writer.write(" return !result.Get$L().empty();", ServiceNameUtil.capitalize(serviceLevelOutputToken)); - } - } else { - writer.write(" return result.GetIsTruncated();"); - } - } - }); - - writer.write(""); - - // SetNextRequest method - writer.openBlock(" static void SetNextRequest(const ResultType& result, RequestType& request)\n {", " }", () -> { - String inToken = null; - String outToken = null; - - if (trait.getInputToken().isPresent() && trait.getOutputToken().isPresent()) { - inToken = trait.getInputToken().get(); - outToken = trait.getOutputToken().get(); - } else { - // Fallback to service-level pagination configuration when operation-level traits are missing. - // Some services like AccessAnalyzer define pagination tokens at the service level rather than per-operation. - String serviceLevelInputToken = ShapeUtil.getServiceLevelToken(service, software.amazon.smithy.model.traits.PaginatedTrait.class, t -> t.getInputToken()); - String serviceLevelOutputToken = ShapeUtil.getServiceLevelToken(service, software.amazon.smithy.model.traits.PaginatedTrait.class, t -> t.getOutputToken()); - if (serviceLevelInputToken != null && serviceLevelOutputToken != null) { - inToken = serviceLevelInputToken; - outToken = serviceLevelOutputToken; - } - } - - if (inToken != null && outToken != null) { - // Pattern A: Explicit nested token like "EngineDefaults.Marker" - if (outToken.contains(".")) { - String[] parts = outToken.split("\\.", 2); - String memberName = parts[0]; - String nestedTokenName = parts[1]; - writer.write(" request.Set$L(result.Get$L().Get$L());", ServiceNameUtil.capitalize(inToken), ServiceNameUtil.capitalize(memberName), ServiceNameUtil.capitalize(nestedTokenName)); - } - // Pattern B: Check if token is on top-level output - else if (ShapeUtil.hasTopLevelMember(context.getModel(), op, outToken)) { - writer.write(" request.Set$L(result.Get$L());", ServiceNameUtil.capitalize(inToken), ServiceNameUtil.capitalize(outToken)); - } - // Pattern C: Find wrapper member containing the token - else { - String wrapperMember = ShapeUtil.findWrapperMemberContainingToken(context.getModel(), op, outToken); - if (wrapperMember != null) { - writer.write(" request.Set$L(result.Get$L().Get$L());", ServiceNameUtil.capitalize(inToken), ServiceNameUtil.capitalize(wrapperMember), ServiceNameUtil.capitalize(outToken)); - } else { - writer.write(" (void)result; (void)request; // Token not found"); - } - } - } else { - writer.write(" (void)result; (void)request; // Unused parameters"); - } - }); - }); - - writer.write("") - .writeNamespaceClose("Pagination") - .writeNamespaceClose(serviceName) - .writeNamespaceClose("Aws"); - } -} \ No newline at end of file diff --git a/tools/code-generation/smithy/codegen/cpp-pagination/smithy-build.json b/tools/code-generation/smithy/codegen/cpp-pagination/smithy-build.json deleted file mode 100644 index 11f7416fb6a9..000000000000 --- a/tools/code-generation/smithy/codegen/cpp-pagination/smithy-build.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "version": "1.0", - "projections": { - "ec2.2016-11-15": { - "imports": [ - "/Users/cailinn/Desktop/workspace/aws-sdk-cpp/tools/code-generation/smithy/api-descriptions/ec2.json" - ], - "plugins": { - "cpp-codegen-pagination-plugin": { - "c2jMap": "{\"api-gateway\": \"apigateway\", \"application-auto-scaling\": \"application-autoscaling\", \"app-mesh\": \"appmesh\", \"auto-scaling\": \"autoscaling\", \"auto-scaling-plans\": \"autoscaling-plans\", \"cloudhsm-v2\": \"cloudhsmv2\", \"cloudsearch-domain\": \"cloudsearchdomain\", \"config-service\": \"config\", \"cost-and-usage-report-service\": \"cur\", \"data-pipeline\": \"datapipeline\", \"device-farm\": \"devicefarm\", \"direct-connect\": \"directconnect\", \"dynamodb-streams\": \"dynamodbstreams\", \"elastic-beanstalk\": \"elasticbeanstalk\", \"elastic-load-balancing\": \"elasticloadbalancing\", \"elastic-load-balancing-v2\": \"elasticloadbalancingv2\", \"global-accelerator\": \"globalaccelerator\", \"iot-1click-devices-service\": \"iot1click-devices\", \"iot-1click-projects\": \"iot1click-projects\", \"iot-data-plane\": \"iot-data\", \"iot-events-data\": \"iotevents-data\", \"iot-events\": \"iotevents\", \"iot-jobs-data-plane\": \"iot-jobs-data\", \"iot-wireless\": \"iotwireless\", \"kinesis-analytics\": \"kinesisanalytics\", \"kinesis-analytics-v2\": \"kinesisanalyticsv2\", \"kinesis-video\": \"kinesisvideo\", \"lex-models-v2\": \"lexv2-models\", \"lex-runtime-service\": \"lex\", \"lex-runtime-v2\": \"lexv2-runtime\", \"machine-learning\": \"machinelearning\", \"marketplace-commerce-analytics\": \"marketplacecommerceanalytics\", \"marketplace-entitlement-service\": \"marketplace-entitlement\", \"marketplace-metering\": \"meteringmarketplace\", \"migration-hub\": \"AWSMigrationHub\", \"mturk\": \"mturk-requester\", \"pinpoint-sms-voice\": \"sms-voice\", \"resource-groups-tagging-api\": \"resourcegroupstaggingapi\", \"route-53-domains\": \"route53domains\", \"route-53\": \"route53\", \"s3-control\": \"s3control\", \"sagemaker-runtime\": \"sagemaker-runtime\", \"secrets-manager\": \"secretsmanager\", \"serverlessapplicationrepository\": \"serverlessrepo\", \"service-catalog-appregistry\": \"servicecatalog-appregistry\", \"service-catalog\": \"servicecatalog\", \"transfer\": \"awstransfer\", \"cloudwatch\": \"monitoring\", \"cloudwatch-events\": \"events\", \"storage-gateway\": \"storagegateway\", \"efs\": \"elasticfilesystem\", \"emr\": \"elasticmapreduce\", \"ses\": \"email\", \"cognito-identity-provider\": \"cognito-idp\", \"cost-explorer\": \"ce\", \"application-discovery-service\": \"discovery\", \"database-migration-service\": \"dms\", \"sfn\": \"states\", \"lex-model-building-service\": \"lex-models\", \"cloudwatch-logs\": \"logs\", \"directory-service\": \"ds\", \"elasticsearch-service\": \"es\", \"importexport\": \"importexport\", \"sdb\": \"sdb\", \"transcribe-streaming\": \"transcribestreaming\"}" - } - } - }, - "s3.2006-03-01": { - "imports": [ - "/Users/cailinn/Desktop/workspace/aws-sdk-cpp/tools/code-generation/smithy/api-descriptions/s3.json" - ], - "plugins": { - "cpp-codegen-pagination-plugin": { - "c2jMap": "{\"api-gateway\": \"apigateway\", \"application-auto-scaling\": \"application-autoscaling\", \"app-mesh\": \"appmesh\", \"auto-scaling\": \"autoscaling\", \"auto-scaling-plans\": \"autoscaling-plans\", \"cloudhsm-v2\": \"cloudhsmv2\", \"cloudsearch-domain\": \"cloudsearchdomain\", \"config-service\": \"config\", \"cost-and-usage-report-service\": \"cur\", \"data-pipeline\": \"datapipeline\", \"device-farm\": \"devicefarm\", \"direct-connect\": \"directconnect\", \"dynamodb-streams\": \"dynamodbstreams\", \"elastic-beanstalk\": \"elasticbeanstalk\", \"elastic-load-balancing\": \"elasticloadbalancing\", \"elastic-load-balancing-v2\": \"elasticloadbalancingv2\", \"global-accelerator\": \"globalaccelerator\", \"iot-1click-devices-service\": \"iot1click-devices\", \"iot-1click-projects\": \"iot1click-projects\", \"iot-data-plane\": \"iot-data\", \"iot-events-data\": \"iotevents-data\", \"iot-events\": \"iotevents\", \"iot-jobs-data-plane\": \"iot-jobs-data\", \"iot-wireless\": \"iotwireless\", \"kinesis-analytics\": \"kinesisanalytics\", \"kinesis-analytics-v2\": \"kinesisanalyticsv2\", \"kinesis-video\": \"kinesisvideo\", \"lex-models-v2\": \"lexv2-models\", \"lex-runtime-service\": \"lex\", \"lex-runtime-v2\": \"lexv2-runtime\", \"machine-learning\": \"machinelearning\", \"marketplace-commerce-analytics\": \"marketplacecommerceanalytics\", \"marketplace-entitlement-service\": \"marketplace-entitlement\", \"marketplace-metering\": \"meteringmarketplace\", \"migration-hub\": \"AWSMigrationHub\", \"mturk\": \"mturk-requester\", \"pinpoint-sms-voice\": \"sms-voice\", \"resource-groups-tagging-api\": \"resourcegroupstaggingapi\", \"route-53-domains\": \"route53domains\", \"route-53\": \"route53\", \"s3-control\": \"s3control\", \"sagemaker-runtime\": \"sagemaker-runtime\", \"secrets-manager\": \"secretsmanager\", \"serverlessapplicationrepository\": \"serverlessrepo\", \"service-catalog-appregistry\": \"servicecatalog-appregistry\", \"service-catalog\": \"servicecatalog\", \"transfer\": \"awstransfer\", \"cloudwatch\": \"monitoring\", \"cloudwatch-events\": \"events\", \"storage-gateway\": \"storagegateway\", \"efs\": \"elasticfilesystem\", \"emr\": \"elasticmapreduce\", \"ses\": \"email\", \"cognito-identity-provider\": \"cognito-idp\", \"cost-explorer\": \"ce\", \"application-discovery-service\": \"discovery\", \"database-migration-service\": \"dms\", \"sfn\": \"states\", \"lex-model-building-service\": \"lex-models\", \"cloudwatch-logs\": \"logs\", \"directory-service\": \"ds\", \"elasticsearch-service\": \"es\", \"importexport\": \"importexport\", \"sdb\": \"sdb\", \"transcribe-streaming\": \"transcribestreaming\"}" - } - } - }, - "dynamodb.2012-08-10": { - "imports": [ - "/Users/cailinn/Desktop/workspace/aws-sdk-cpp/tools/code-generation/smithy/api-descriptions/dynamodb.json" - ], - "plugins": { - "cpp-codegen-pagination-plugin": { - "c2jMap": "{\"api-gateway\": \"apigateway\", \"application-auto-scaling\": \"application-autoscaling\", \"app-mesh\": \"appmesh\", \"auto-scaling\": \"autoscaling\", \"auto-scaling-plans\": \"autoscaling-plans\", \"cloudhsm-v2\": \"cloudhsmv2\", \"cloudsearch-domain\": \"cloudsearchdomain\", \"config-service\": \"config\", \"cost-and-usage-report-service\": \"cur\", \"data-pipeline\": \"datapipeline\", \"device-farm\": \"devicefarm\", \"direct-connect\": \"directconnect\", \"dynamodb-streams\": \"dynamodbstreams\", \"elastic-beanstalk\": \"elasticbeanstalk\", \"elastic-load-balancing\": \"elasticloadbalancing\", \"elastic-load-balancing-v2\": \"elasticloadbalancingv2\", \"global-accelerator\": \"globalaccelerator\", \"iot-1click-devices-service\": \"iot1click-devices\", \"iot-1click-projects\": \"iot1click-projects\", \"iot-data-plane\": \"iot-data\", \"iot-events-data\": \"iotevents-data\", \"iot-events\": \"iotevents\", \"iot-jobs-data-plane\": \"iot-jobs-data\", \"iot-wireless\": \"iotwireless\", \"kinesis-analytics\": \"kinesisanalytics\", \"kinesis-analytics-v2\": \"kinesisanalyticsv2\", \"kinesis-video\": \"kinesisvideo\", \"lex-models-v2\": \"lexv2-models\", \"lex-runtime-service\": \"lex\", \"lex-runtime-v2\": \"lexv2-runtime\", \"machine-learning\": \"machinelearning\", \"marketplace-commerce-analytics\": \"marketplacecommerceanalytics\", \"marketplace-entitlement-service\": \"marketplace-entitlement\", \"marketplace-metering\": \"meteringmarketplace\", \"migration-hub\": \"AWSMigrationHub\", \"mturk\": \"mturk-requester\", \"pinpoint-sms-voice\": \"sms-voice\", \"resource-groups-tagging-api\": \"resourcegroupstaggingapi\", \"route-53-domains\": \"route53domains\", \"route-53\": \"route53\", \"s3-control\": \"s3control\", \"sagemaker-runtime\": \"sagemaker-runtime\", \"secrets-manager\": \"secretsmanager\", \"serverlessapplicationrepository\": \"serverlessrepo\", \"service-catalog-appregistry\": \"servicecatalog-appregistry\", \"service-catalog\": \"servicecatalog\", \"transfer\": \"awstransfer\", \"cloudwatch\": \"monitoring\", \"cloudwatch-events\": \"events\", \"storage-gateway\": \"storagegateway\", \"efs\": \"elasticfilesystem\", \"emr\": \"elasticmapreduce\", \"ses\": \"email\", \"cognito-identity-provider\": \"cognito-idp\", \"cost-explorer\": \"ce\", \"application-discovery-service\": \"discovery\", \"database-migration-service\": \"dms\", \"sfn\": \"states\", \"lex-model-building-service\": \"lex-models\", \"cloudwatch-logs\": \"logs\", \"directory-service\": \"ds\", \"elasticsearch-service\": \"es\", \"importexport\": \"importexport\", \"sdb\": \"sdb\", \"transcribe-streaming\": \"transcribestreaming\"}" - } - } - } - }, - "outputDirectory": "output" -} \ No newline at end of file diff --git a/tools/code-generation/smithy/codegen/settings.gradle.kts b/tools/code-generation/smithy/codegen/settings.gradle.kts index e14d59a763f9..bc2b770a2730 100644 --- a/tools/code-generation/smithy/codegen/settings.gradle.kts +++ b/tools/code-generation/smithy/codegen/settings.gradle.kts @@ -2,8 +2,6 @@ rootProject.name = "smithy_code_generation" include("cpp-smoke-tests") include("cpp-smoke-tests-codegen") -include("cpp-pagination-codegen") -include("cpp-pagination") pluginManagement { repositories { diff --git a/tools/code-generation/smithy/codegen/cpp-pagination/build.gradle.kts b/tools/code-generation/smithy/cpp-codegen/build.gradle.kts similarity index 65% rename from tools/code-generation/smithy/codegen/cpp-pagination/build.gradle.kts rename to tools/code-generation/smithy/cpp-codegen/build.gradle.kts index 29c1ca217b7b..879303470228 100644 --- a/tools/code-generation/smithy/codegen/cpp-pagination/build.gradle.kts +++ b/tools/code-generation/smithy/cpp-codegen/build.gradle.kts @@ -19,31 +19,21 @@ repositories { buildscript { dependencies { - classpath(codegen.model) - classpath(codegen.aws.traits) - classpath(codegen.rules.engine) + classpath("software.amazon.smithy:smithy-model:1.62.0") + classpath("software.amazon.smithy:smithy-aws-traits:1.62.0") + classpath("software.amazon.smithy:smithy-rules-engine:1.62.0") } } dependencies { - implementation(project(":cpp-pagination-codegen")) - implementation(codegen.aws.traits) - implementation(codegen.aws.cloudformation.traits) - implementation(codegen.aws.iam.traits) - implementation(codegen.aws.endpoints) - implementation(codegen.smoke.test.traits) - implementation(codegen.aws.smoke.test.model) - implementation(codegen.waiters) -} - -tasks.jar { - enabled = false + implementation(project(":smithy-cpp-codegen")) + implementation("software.amazon.smithy:smithy-aws-traits:1.62.0") } tasks.register("generate-smithy-build") { doLast { val projectionsBuilder = Node.objectNodeBuilder() - val models = project.file("../../api-descriptions") + val models = project.file("../api-descriptions") val filteredServices: String = project.findProperty("servicesFilter")?.toString() ?: "" val filteredServiceList = filteredServices.split(",").map { it.trim() }.filter { it.isNotEmpty() } val c2jMapStr: String = project.findProperty("c2jMap")?.toString() ?: "" @@ -51,12 +41,9 @@ tasks.register("generate-smithy-build") { fileTree(models).filter { it.isFile }.files.forEach eachFile@{ file -> val model = Model.assembler() .addImport(file.absolutePath) - // Grab the result directly rather than worrying about checking for errors via unwrap. - // All we care about here is the service shape, any unchecked errors will be exposed - // as part of the actual build task done by the smithy gradle plugin. .assemble().result.get() - val services = model.shapes(ServiceShape::class.java).sorted().toList() - if (services.size != 1) return@eachFile + val services = model.shapes(ServiceShape::class.java).sorted().toList() + if (services.size != 1) return@eachFile val service = services[0] val serviceTrait = service.getTrait(ServiceTrait::class.java).get() @@ -67,7 +54,7 @@ tasks.register("generate-smithy-build") { val projectionContents = Node.objectNodeBuilder() .withMember("imports", Node.fromStrings("${models.absolutePath}${File.separator}${file.name}")) .withMember("plugins", Node.objectNode() - .withMember("cpp-codegen-pagination-plugin", Node.objectNodeBuilder() + .withMember("smithy-cpp-codegen", Node.objectNodeBuilder() .withMember("c2jMap", Node.from(c2jMapStr)) .build())) .build() @@ -75,16 +62,13 @@ tasks.register("generate-smithy-build") { projectionsBuilder.withMember("$sdkId.${service.version.lowercase()}", projectionContents) } - // TODO: Remove this workaround - legacy services should have proper Smithy model files - // instead of hardcoding service names in both Gradle and Java - // Currently only needed for importexport, sdb (SimpleDB), and s3-crt - // Add mock projections for legacy C2J-only services + // Legacy services without full Smithy models - generate mock projections for base classes val legacyServices = mapOf("importexport" to "ImportExport", "sdb" to "SimpleDB", "s3-crt" to "S3Crt") - legacyServices.forEach { (c2jName, pascalName) -> + legacyServices.forEach { (c2jName, serviceName) -> if (filteredServiceList.isEmpty() || c2jName in filteredServiceList) { val mockProjectionContents = Node.objectNodeBuilder() .withMember("plugins", Node.objectNode() - .withMember("cpp-codegen-pagination-plugin", Node.objectNodeBuilder() + .withMember("smithy-cpp-codegen", Node.objectNodeBuilder() .withMember("c2jMap", Node.from(c2jMapStr)) .build())) .build() diff --git a/tools/code-generation/smithy/cpp-codegen/gradle.properties b/tools/code-generation/smithy/cpp-codegen/gradle.properties new file mode 100644 index 000000000000..5167bec761d5 --- /dev/null +++ b/tools/code-generation/smithy/cpp-codegen/gradle.properties @@ -0,0 +1,11 @@ +org.gradle.jvmargs=-Xmx6g + +# Set the socket timeout to 5 minutes +systemProp.org.gradle.internal.http.connectionTimeout=120000 +systemProp.org.gradle.internal.http.socketTimeout=120000 + +# the number of retries (initial included) (default 3) +systemProp.org.gradle.internal.repository.max.tentative=10 + +# the initial time before retrying, in milliseconds (default 125) +systemProp.org.gradle.internal.repository.initial.backoff=500 diff --git a/tools/code-generation/smithy/cpp-codegen/gradle/wrapper/gradle-wrapper.jar b/tools/code-generation/smithy/cpp-codegen/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..a4b76b9530d66f5e68d973ea569d8e19de379189 GIT binary patch literal 43583 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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 GZ~q4|mN%#X literal 0 HcmV?d00001 diff --git a/tools/code-generation/smithy/cpp-codegen/gradle/wrapper/gradle-wrapper.properties b/tools/code-generation/smithy/cpp-codegen/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000000..4e7678544a65 --- /dev/null +++ b/tools/code-generation/smithy/cpp-codegen/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=file:///opt/gradle-install.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/tools/code-generation/smithy/cpp-codegen/gradlew b/tools/code-generation/smithy/cpp-codegen/gradlew new file mode 100755 index 000000000000..f5feea6d6b11 --- /dev/null +++ b/tools/code-generation/smithy/cpp-codegen/gradlew @@ -0,0 +1,252 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/tools/code-generation/smithy/cpp-codegen/gradlew.bat b/tools/code-generation/smithy/cpp-codegen/gradlew.bat new file mode 100644 index 000000000000..9b42019c7915 --- /dev/null +++ b/tools/code-generation/smithy/cpp-codegen/gradlew.bat @@ -0,0 +1,94 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/tools/code-generation/smithy/cpp-codegen/settings.gradle.kts b/tools/code-generation/smithy/cpp-codegen/settings.gradle.kts new file mode 100644 index 000000000000..b77ed8dbf8f3 --- /dev/null +++ b/tools/code-generation/smithy/cpp-codegen/settings.gradle.kts @@ -0,0 +1,10 @@ +rootProject.name = "smithy-cpp-codegen" + +include("smithy-cpp-codegen") + +pluginManagement { + repositories { + mavenLocal() + gradlePluginPortal() + } +} diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/build.gradle.kts b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/build.gradle.kts similarity index 50% rename from tools/code-generation/smithy/codegen/cpp-pagination-codegen/build.gradle.kts rename to tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/build.gradle.kts index d929cca7cbb1..1cfaf7ea4964 100644 --- a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/build.gradle.kts +++ b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/build.gradle.kts @@ -8,11 +8,10 @@ repositories { } dependencies { - implementation("software.amazon.smithy:smithy-model:1.51.0") - implementation("software.amazon.smithy:smithy-codegen-core:1.51.0") - implementation("software.amazon.smithy:smithy-aws-traits:1.51.0") - implementation("software.amazon.smithy:smithy-waiters:1.51.0") - implementation("software.amazon.smithy:smithy-rules-engine:1.51.0") - implementation("software.amazon.smithy:smithy-aws-endpoints:1.51.0") - implementation("software.amazon.smithy:smithy-aws-iam-traits:1.51.0") + implementation("software.amazon.smithy:smithy-model:1.62.0") + implementation("software.amazon.smithy:smithy-codegen-core:1.62.0") + implementation("software.amazon.smithy:smithy-aws-traits:1.62.0") + implementation("software.amazon.smithy:smithy-waiters:1.62.0") + implementation("software.amazon.smithy:smithy-rules-engine:1.62.0") + implementation("software.amazon.smithy:smithy-aws-endpoints:1.62.0") } diff --git a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/BaseCompilationTestGenerator.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/BaseCompilationTestGenerator.java new file mode 100644 index 000000000000..d5f9eb0163da --- /dev/null +++ b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/BaseCompilationTestGenerator.java @@ -0,0 +1,88 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ +package com.amazonaws.util.awsclientsmithygenerator.generators; + +import software.amazon.smithy.build.PluginContext; +import software.amazon.smithy.model.shapes.ServiceShape; +import com.amazonaws.util.awsclientsmithygenerator.generators.CppWriter; +import com.amazonaws.util.awsclientsmithygenerator.generators.ServiceNameUtil; +import java.util.List; +import java.util.Map; + +public abstract class BaseCompilationTestGenerator { + protected final PluginContext context; + protected final ServiceShape service; + protected final List operations; + protected final Map serviceMap; + private final CppWriterDelegator writerDelegator; + + public BaseCompilationTestGenerator(PluginContext context, ServiceShape service, List operations, Map serviceMap) { + this.context = context; + this.service = service; + this.operations = operations; + this.serviceMap = serviceMap; + this.writerDelegator = new CppWriterDelegator(context.getFileManifest()); + } + + protected abstract String getTestType(); + protected abstract String getTestDescription(); + protected abstract void writeTestSpecificIncludes(CppWriter writer); + + public final void run() { + generateCompilationTest(); + writerDelegator.flushWriters(); + } + + private void generateCompilationTest() { + String serviceName = ServiceNameUtil.getServiceName(service); + String c2jServiceName = ServiceNameUtil.getSmithyServiceName(service, serviceMap); + + writerDelegator.useFileWriter( + "generated/tests/" + c2jServiceName + "-gen-tests/" + serviceName + getTestType() + "CompilationTests.cpp", + this::render + ); + } + + private void render(CppWriter writer) { + String serviceName = ServiceNameUtil.getServiceName(service); + + writeHeader(writer, serviceName); + writeTestSpecificIncludes(writer); + writeCommonIncludes(writer); + writeTestClass(writer, serviceName); + writeTestMethod(writer, serviceName); + } + + private void writeHeader(CppWriter writer, String serviceName) { + writer.write("/**") + .write(" * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.") + .write(" * SPDX-License-Identifier: Apache-2.0.") + .write(" */") + .write("") + .write("// Header compilation test for " + serviceName + " " + getTestType().toLowerCase() + " headers") + .write("// " + getTestDescription()) + .write(""); + } + + private void writeCommonIncludes(CppWriter writer) { + writer.write("") + .write("#include ") + .write(""); + } + + private void writeTestClass(CppWriter writer, String serviceName) { + writer.openBlock("class " + serviceName + getTestType() + "CompilationTest : public Aws::Testing::AwsCppSdkGTestSuite\n{", "};", () -> { + // Empty class body + }); + writer.write(""); + } + + private void writeTestMethod(CppWriter writer, String serviceName) { + writer.openBlock("TEST_F(" + serviceName + getTestType() + "CompilationTest, " + serviceName + getTestType() + "HeadersCompile)\n{", "}", () -> { + writer.write(" // Test passes if compilation succeeds") + .write(" SUCCEED();"); + }); + } +} \ No newline at end of file diff --git a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/BaseHeaderGenerator.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/BaseHeaderGenerator.java new file mode 100644 index 000000000000..ebbb6a235c78 --- /dev/null +++ b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/BaseHeaderGenerator.java @@ -0,0 +1,58 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ +package com.amazonaws.util.awsclientsmithygenerator.generators; + +import software.amazon.smithy.model.shapes.ServiceShape; +import com.amazonaws.util.awsclientsmithygenerator.generators.CppWriter; +import com.amazonaws.util.awsclientsmithygenerator.generators.ServiceNameUtil; +import java.util.List; +import java.util.Map; + +public abstract class BaseHeaderGenerator { + protected final ServiceShape service; + protected final List operations; + protected final Map serviceMap; + protected final String smithyServiceName; + + public BaseHeaderGenerator(ServiceShape service, List operations, Map serviceMap) { + this.service = service; + this.operations = operations; + this.serviceMap = serviceMap; + this.smithyServiceName = ServiceNameUtil.getSmithyServiceName(service, serviceMap); + } + + protected abstract void writeSpecificIncludes(CppWriter writer, String serviceName, String smithyServiceName); + protected abstract void writeSpecificContent(CppWriter writer, String serviceName); + + public final void render(CppWriter writer) { + String serviceName = ServiceNameUtil.getServiceName(service); + + writeHeader(writer); + writeSpecificIncludes(writer, serviceName, smithyServiceName); + writeNamespaceOpen(writer, serviceName); + writeSpecificContent(writer, serviceName); + writeNamespaceClose(writer, serviceName); + } + + private void writeHeader(CppWriter writer) { + writer.write("/**") + .write(" * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.") + .write(" * SPDX-License-Identifier: Apache-2.0.") + .write(" */") + .write("") + .write("#pragma once"); + } + + private void writeNamespaceOpen(CppWriter writer, String serviceName) { + writer.writeNamespaceOpen("Aws"); + writer.writeNamespaceOpen(serviceName); + writer.write(""); + } + + private void writeNamespaceClose(CppWriter writer, String serviceName) { + writer.writeNamespaceClose(serviceName); + writer.writeNamespaceClose("Aws"); + } +} \ No newline at end of file diff --git a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/BaseTraitsGenerator.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/BaseTraitsGenerator.java new file mode 100644 index 000000000000..7dfc99f9ae69 --- /dev/null +++ b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/BaseTraitsGenerator.java @@ -0,0 +1,56 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ +package com.amazonaws.util.awsclientsmithygenerator.generators; + +import software.amazon.smithy.build.PluginContext; +import software.amazon.smithy.model.shapes.ServiceShape; +import com.amazonaws.util.awsclientsmithygenerator.generators.CppWriter; +import com.amazonaws.util.awsclientsmithygenerator.generators.CppWriterDelegator; +import com.amazonaws.util.awsclientsmithygenerator.generators.ServiceNameUtil; +import java.util.List; +import java.util.Map; + +public abstract class BaseTraitsGenerator { + protected final PluginContext context; + protected final ServiceShape service; + protected final List operations; + protected final String smithyServiceName; + private final CppWriterDelegator writerDelegator; + + public BaseTraitsGenerator(PluginContext context, ServiceShape service, List operations, String smithyServiceName) { + this.context = context; + this.service = service; + this.operations = operations; + this.smithyServiceName = smithyServiceName; + this.writerDelegator = new CppWriterDelegator(context.getFileManifest()); + } + + protected abstract String getFileNameForOperation(T operationData); + protected abstract void generateOperationContent(CppWriter writer, T operationData, String serviceName); + + public final void write() { + String serviceName = ServiceNameUtil.getServiceName(service); + + for (T operationData : operations) { + String fileName = getFileNameForOperation(operationData); + + writerDelegator.useFileWriter(fileName, writer -> { + writeHeader(writer); + generateOperationContent(writer, operationData, serviceName); + }); + } + + writerDelegator.flushWriters(); + } + + private void writeHeader(CppWriter writer) { + writer.write("/**") + .write(" * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.") + .write(" * SPDX-License-Identifier: Apache-2.0.") + .write(" */") + .write("") + .write("#pragma once"); + } +} diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ClientCodegenSettings.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ClientCodegenSettings.java similarity index 100% rename from tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ClientCodegenSettings.java rename to tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ClientCodegenSettings.java diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CppImportContainer.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CppImportContainer.java similarity index 100% rename from tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CppImportContainer.java rename to tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CppImportContainer.java diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CppWriter.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CppWriter.java similarity index 100% rename from tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CppWriter.java rename to tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CppWriter.java diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CppWriterDelegator.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CppWriterDelegator.java similarity index 100% rename from tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CppWriterDelegator.java rename to tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/CppWriterDelegator.java diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/FeatureParser.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/FeatureParser.java similarity index 100% rename from tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/FeatureParser.java rename to tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/FeatureParser.java diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/OperationData.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/OperationData.java similarity index 100% rename from tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/OperationData.java rename to tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/OperationData.java diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ServiceNameUtil.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ServiceNameUtil.java similarity index 100% rename from tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ServiceNameUtil.java rename to tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ServiceNameUtil.java diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ShapeUtil.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ShapeUtil.java similarity index 100% rename from tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ShapeUtil.java rename to tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ShapeUtil.java diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationBaseGenerator.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationBaseGenerator.java similarity index 63% rename from tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationBaseGenerator.java rename to tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationBaseGenerator.java index ea40a4c5d442..2d485ccfa065 100644 --- a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationBaseGenerator.java +++ b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationBaseGenerator.java @@ -2,8 +2,9 @@ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0. */ -package com.amazonaws.util.awsclientsmithygenerator.generators.templates; +package com.amazonaws.util.awsclientsmithygenerator.generators.pagination; +import com.amazonaws.util.awsclientsmithygenerator.generators.BaseHeaderGenerator; import com.amazonaws.util.awsclientsmithygenerator.generators.CppWriter; import com.amazonaws.util.awsclientsmithygenerator.generators.OperationData; import com.amazonaws.util.awsclientsmithygenerator.generators.ServiceNameUtil; @@ -13,54 +14,30 @@ import java.util.List; import java.util.Map; -public class PaginationBaseGenerator { - private final ServiceShape service; - private final List> paginatedOps; - private final Map serviceMap; +public class PaginationBaseGenerator extends BaseHeaderGenerator> { public PaginationBaseGenerator(ServiceShape service, List> paginatedOps, Map serviceMap) { - this.service = service; - this.paginatedOps = paginatedOps; - this.serviceMap = serviceMap; + super(service, paginatedOps, serviceMap); } - public void render(CppWriter writer) { - String serviceName = ServiceNameUtil.getServiceName(service); - String smithyServiceName = ServiceNameUtil.getSmithyServiceName(service, serviceMap); - String classPrefix = ServiceNameUtil.getServiceNameUpperCamel(service); - - renderHeader(writer); - renderIncludes(writer, serviceName, smithyServiceName); - renderBaseClass(writer, serviceName, smithyServiceName, classPrefix); - } - - private void renderHeader(CppWriter writer) { - writer.write("/**") - .write(" * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.") - .write(" * SPDX-License-Identifier: Apache-2.0.") - .write(" */") - .write("") - .write("#pragma once") - .write(""); - } - - private void renderIncludes(CppWriter writer, String serviceName, String smithyServiceName) { - writer.writeInclude("memory"); + @Override + protected void writeSpecificIncludes(CppWriter writer, String serviceName, String smithyServiceName) { + writer.write(""); + writer.writeInclude("aws/core/utils/pagination/Paginator.h"); // Include paginator headers - for (OperationData data : paginatedOps) { + for (OperationData data : operations) { String opName = data.getOperation().getId().getName(); writer.writeInclude("aws/" + smithyServiceName + "/model/" + opName + "PaginationTraits.h"); } - writer.writeInclude("aws/core/utils/pagination/Paginator.h"); + writer.writeInclude("memory"); writer.write(""); } - private void renderBaseClass(CppWriter writer, String serviceName, String smithyServiceName, String classPrefix) { - writer.writeNamespaceOpen("Aws"); - writer.writeNamespaceOpen(serviceName); - writer.write(""); + @Override + protected void writeSpecificContent(CppWriter writer, String serviceName) { + String classPrefix = ServiceNameUtil.getServiceNameUpperCamel(service); // Forward declare the client writer.write("class " + classPrefix + "Client;"); @@ -69,13 +46,13 @@ private void renderBaseClass(CppWriter writer, String serviceName, String smithy // CRTP base class writer.write("template"); writer.openBlock("class " + classPrefix + "PaginationBase {\npublic:", "};", () -> { - if (paginatedOps.isEmpty()) { + if (operations.isEmpty()) { // Empty base class for services without pagination // Required because legacy C2J generator always includes PaginationBase inheritance in client headers writer.write("virtual ~" + classPrefix + "PaginationBase() = default;"); } else { // Generate paginator methods - for (OperationData data : paginatedOps) { + for (OperationData data : operations) { String opName = data.getOperation().getId().getName(); String methodName = ShapeUtil.getOperationMethodName(opName, smithyServiceName); @@ -94,9 +71,5 @@ private void renderBaseClass(CppWriter writer, String serviceName, String smithy } } }); - - writer.writeNamespaceClose(serviceName); - writer.writeNamespaceClose("Aws"); - } } \ No newline at end of file diff --git a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationClientHeaderGenerator.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationClientHeaderGenerator.java new file mode 100644 index 000000000000..2fbf36c20f30 --- /dev/null +++ b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationClientHeaderGenerator.java @@ -0,0 +1,48 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ +package com.amazonaws.util.awsclientsmithygenerator.generators.pagination; + +import com.amazonaws.util.awsclientsmithygenerator.generators.BaseHeaderGenerator; +import com.amazonaws.util.awsclientsmithygenerator.generators.CppWriter; +import com.amazonaws.util.awsclientsmithygenerator.generators.OperationData; +import com.amazonaws.util.awsclientsmithygenerator.generators.ServiceNameUtil; +import com.amazonaws.util.awsclientsmithygenerator.generators.ShapeUtil; +import software.amazon.smithy.model.shapes.ServiceShape; +import software.amazon.smithy.model.traits.PaginatedTrait; +import java.util.List; +import java.util.Map; + +public class PaginationClientHeaderGenerator extends BaseHeaderGenerator> { + + public PaginationClientHeaderGenerator(ServiceShape service, List> paginatedOps, Map serviceMap) { + super(service, paginatedOps, serviceMap); + } + + @Override + protected void writeSpecificIncludes(CppWriter writer, String serviceName, String smithyServiceName) { + String classPrefix = ServiceNameUtil.getServiceNameUpperCamel(service); + writer.writeInclude("aws/" + smithyServiceName + "/" + classPrefix + "Client.h"); + writer.writeInclude("aws/core/utils/pagination/Paginator.h"); + + for (OperationData data : operations) { + String opName = data.getOperation().getId().getName(); + writer.writeInclude("aws/" + smithyServiceName + "/model/" + opName + "PaginationTraits.h"); + } + writer.write(""); + } + + @Override + protected void writeSpecificContent(CppWriter writer, String serviceName) { + String classPrefix = ServiceNameUtil.getServiceNameUpperCamel(service); + + for (OperationData data : operations) { + String opName = data.getOperation().getId().getName(); + String methodName = ShapeUtil.getOperationMethodName(opName, smithyServiceName); + writer.write("using $LPaginator = Aws::Utils::Pagination::PagePaginator<$LClient, Model::$LRequest, Pagination::$LPaginationTraits>;", + opName, classPrefix, methodName, opName); + } + writer.write(""); + } +} \ No newline at end of file diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationCodegenPlugin.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationCodegenPlugin.java similarity index 55% rename from tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationCodegenPlugin.java rename to tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationCodegenPlugin.java index 6371f4d606eb..47975e5886f1 100644 --- a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/templates/PaginationCodegenPlugin.java +++ b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationCodegenPlugin.java @@ -12,13 +12,13 @@ import software.amazon.smithy.model.shapes.*; import com.amazonaws.util.awsclientsmithygenerator.generators.OperationData; import com.amazonaws.util.awsclientsmithygenerator.generators.FeatureParser; -import com.amazonaws.util.awsclientsmithygenerator.generators.templates.PaginationTraitsGenerator; -import com.amazonaws.util.awsclientsmithygenerator.generators.templates.PaginationClientHeaderGenerator; -import com.amazonaws.util.awsclientsmithygenerator.generators.templates.PaginationCompilationTestGenerator; -import com.amazonaws.util.awsclientsmithygenerator.generators.templates.PaginationBaseGenerator; +import com.amazonaws.util.awsclientsmithygenerator.generators.pagination.PaginationTraitsGenerator; +import com.amazonaws.util.awsclientsmithygenerator.generators.pagination.PaginationClientHeaderGenerator; +import com.amazonaws.util.awsclientsmithygenerator.generators.pagination.PaginationCompilationTestGenerator; +import com.amazonaws.util.awsclientsmithygenerator.generators.pagination.PaginationBaseGenerator; +import com.amazonaws.util.awsclientsmithygenerator.generators.pagination.PaginationEmptyHeaderGenerator; import java.util.List; import java.util.Map; -import java.util.HashMap; import java.util.stream.Collectors; import java.nio.file.Files; import java.nio.file.Path; @@ -28,20 +28,16 @@ public class PaginationCodegenPlugin implements SmithyBuildPlugin { @Override public String getName() { - return "cpp-codegen-pagination-plugin"; + return "smithy-cpp-codegen"; } @Override public void execute(PluginContext context) { var model = context.getModel(); - // TODO: Remove this workaround - mock projections should use proper Smithy model generation - // instead of manually writing files in the plugin - // Currently only needed for importexport, sdb (SimpleDB), and s3-crt - // Check if this is a legacy service mock projection - String projectionName = context.getProjectionName(); - if (projectionName.endsWith(".mock")) { - generateLegacyServiceFile(context); + // Handle legacy services without Smithy models + if (context.getProjectionName().endsWith(".mock")) { + PaginationEmptyHeaderGenerator.generate(context); return; } @@ -90,51 +86,4 @@ public void execute(PluginContext context) { } } } - - private void generateLegacyServiceFile(PluginContext context) { - Map legacyServices = new HashMap<>(); - legacyServices.put("importexport", "ImportExport"); - legacyServices.put("sdb", "SimpleDB"); - legacyServices.put("s3-crt", "S3Crt"); - - String projectionName = context.getProjectionName(); - String c2jName = projectionName.replace(".mock", ""); - String pascalName = legacyServices.get(c2jName); - - if (pascalName == null) { - return; - } - - try { - Path baseDir = context.getFileManifest().getBaseDir(); - Path includeDir = baseDir.resolve("include").resolve("aws").resolve(c2jName); - Files.createDirectories(includeDir); - - // Generate empty pagination base header - Path headerFile = includeDir.resolve(pascalName + "PaginationBase.h"); - String content = String.format( - "/**\n" + - " * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n" + - " * SPDX-License-Identifier: Apache-2.0.\n" + - " */\n\n" + - "#pragma once\n\n" + - "namespace Aws\n" + - "{\n" + - " namespace %s\n" + - " {\n" + - " template\n" + - " class %sPaginationBase\n" + - " {\n" + - " public:\n" + - " virtual ~%sPaginationBase() = default;\n" + - " };\n" + - " } // namespace %s\n" + - "} // namespace Aws\n", - pascalName, pascalName, pascalName, pascalName - ); - Files.writeString(headerFile, content); - } catch (Exception e) { - System.err.println("Failed to generate legacy service " + c2jName + ": " + e.getMessage()); - } - } } diff --git a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationCompilationTestGenerator.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationCompilationTestGenerator.java new file mode 100644 index 000000000000..5956ba37b350 --- /dev/null +++ b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationCompilationTestGenerator.java @@ -0,0 +1,69 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ +package com.amazonaws.util.awsclientsmithygenerator.generators.pagination; + +import software.amazon.smithy.build.PluginContext; +import software.amazon.smithy.model.shapes.*; +import com.amazonaws.util.awsclientsmithygenerator.generators.BaseCompilationTestGenerator; +import com.amazonaws.util.awsclientsmithygenerator.generators.CppWriter; +import com.amazonaws.util.awsclientsmithygenerator.generators.OperationData; +import com.amazonaws.util.awsclientsmithygenerator.generators.ServiceNameUtil; +import software.amazon.smithy.model.traits.PaginatedTrait; +import java.util.*; + +public class PaginationCompilationTestGenerator extends BaseCompilationTestGenerator> { + + public PaginationCompilationTestGenerator(PluginContext context, ServiceShape service, List> allPaginatedOps, Map serviceMap) { + super(context, service, allPaginatedOps, serviceMap); + } + + @Override + protected String getTestType() { + return "Pagination"; + } + + @Override + protected String getTestDescription() { + return "This test ensures all generated pagination headers compile successfully"; + } + + @Override + protected void writeTestSpecificIncludes(CppWriter writer) { + Set clientHeaders = new HashSet<>(); + Set traitHeaders = new HashSet<>(); + Set serviceHeaders = new HashSet<>(); + + for (OperationData paginationData : operations) { + ServiceShape service = paginationData.getService(); + String serviceName = ServiceNameUtil.getServiceNameUpperCamel(service); + String smithyServiceName = ServiceNameUtil.getSmithyServiceName(service, serviceMap); + + // Collect unique client headers + clientHeaders.add("aws/" + smithyServiceName + "/" + serviceName + "ClientPagination.h"); + + // Collect unique service headers + serviceHeaders.add("aws/" + smithyServiceName + "/" + serviceName + "PaginationBase.h"); + + // Collect unique trait headers + String operationName = paginationData.getOperation().getId().getName(); + traitHeaders.add("aws/" + smithyServiceName + "/model/" + operationName + "PaginationTraits.h"); + } + + // Write unique client headers + for (String header : clientHeaders) { + writer.writeInclude(header); + } + + // Write unique service headers + for (String header : serviceHeaders) { + writer.writeInclude(header); + } + + // Write unique trait headers + for (String header : traitHeaders) { + writer.writeInclude(header); + } + } +} \ No newline at end of file diff --git a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationEmptyHeaderGenerator.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationEmptyHeaderGenerator.java new file mode 100644 index 000000000000..ab66e86e1e8a --- /dev/null +++ b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationEmptyHeaderGenerator.java @@ -0,0 +1,54 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ +package com.amazonaws.util.awsclientsmithygenerator.generators.pagination; + +import software.amazon.smithy.build.PluginContext; +import com.amazonaws.util.awsclientsmithygenerator.generators.CppWriterDelegator; +import java.util.Map; +import java.util.HashMap; + +/** + * Generates empty pagination base headers for legacy services that don't have Smithy pagination models. + * TODO: Remove this workaround once all services have proper Smithy models. + */ +public class PaginationEmptyHeaderGenerator { + // Legacy services without Smithy models that still need pagination base headers + // TODO: Remove once all services have proper Smithy models + private static final Map LEGACY_SERVICES = Map.of( + "importexport", "ImportExport", + "sdb", "SimpleDB", + "s3-crt", "S3Crt" + ); + + public static void generate(PluginContext context) { + String projectionName = context.getProjectionName(); + if (!projectionName.endsWith(".mock")) { + return; + } + + String c2jName = projectionName.replace(".mock", ""); + String serviceName = LEGACY_SERVICES.get(c2jName); + + if (serviceName == null) { + return; + } + + CppWriterDelegator writers = new CppWriterDelegator(context.getFileManifest()); + + writers.useFileWriter("include/aws/" + c2jName + "/" + serviceName + "PaginationBase.h", writer -> { + writer.write("#pragma once"); + writer.write(""); + writer.writeNamespaceOpen("Aws"); + writer.writeNamespaceOpen(serviceName); + writer.openBlock("template \nclass $LPaginationBase {\n public:", "};", serviceName, () -> { + writer.write(" virtual ~$LPaginationBase() = default;", serviceName); + }); + writer.writeNamespaceClose(serviceName); + writer.writeNamespaceClose("Aws"); + }); + + writers.flushWriters(); + } +} diff --git a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationTraitsGenerator.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationTraitsGenerator.java new file mode 100644 index 000000000000..686ad0b5592d --- /dev/null +++ b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationTraitsGenerator.java @@ -0,0 +1,185 @@ +/** + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0. + */ +package com.amazonaws.util.awsclientsmithygenerator.generators.pagination; + +import software.amazon.smithy.build.PluginContext; +import software.amazon.smithy.model.shapes.*; +import software.amazon.smithy.model.traits.PaginatedTrait; +import com.amazonaws.util.awsclientsmithygenerator.generators.BaseTraitsGenerator; +import com.amazonaws.util.awsclientsmithygenerator.generators.OperationData; +import com.amazonaws.util.awsclientsmithygenerator.generators.CppWriter; +import com.amazonaws.util.awsclientsmithygenerator.generators.ServiceNameUtil; +import com.amazonaws.util.awsclientsmithygenerator.generators.ShapeUtil; +import java.util.List; + +public class PaginationTraitsGenerator extends BaseTraitsGenerator> { + + public PaginationTraitsGenerator(PluginContext context, ServiceShape service, List> paginatedOps, String smithyServiceName) { + super(context, service, paginatedOps, smithyServiceName); + } + + @Override + protected String getFileNameForOperation(OperationData operationData) { + return "include/aws/" + smithyServiceName + "/model/" + operationData.getOperation().getId().getName() + "PaginationTraits.h"; + } + + @Override + protected void generateOperationContent(CppWriter writer, OperationData data, String serviceName) { + OperationShape op = data.getOperation(); + PaginatedTrait trait = data.getTrait(); + String opName = op.getId().getName(); + + // Includes - detect suffix like C2J renameShape logic + String resultSuffix = ShapeUtil.getResultSuffix(context.getModel(), op, smithyServiceName); + String capitalizedServiceName = ServiceNameUtil.getServiceNameUpperCamel(service); + String requestFileName = ShapeUtil.getOperationMethodName(opName, smithyServiceName) + "Request"; + String resultFileName = ShapeUtil.getOperationMethodName(opName, smithyServiceName) + resultSuffix; + String methodName = ShapeUtil.getOperationMethodName(opName, smithyServiceName); + + writer.writeInclude("aws/" + smithyServiceName + "/" + capitalizedServiceName + "_EXPORTS.h") + .writeInclude("aws/" + smithyServiceName + "/model/" + requestFileName + ".h") + .writeInclude("aws/" + smithyServiceName + "/model/" + resultFileName + ".h") + .writeInclude("aws/" + smithyServiceName + "/" + capitalizedServiceName + "ServiceClientModel.h") + .write(""); + + // Namespaces + writer.writeNamespaceOpen("Aws") + .writeNamespaceOpen(serviceName) + .write("class " + capitalizedServiceName + "Client;") + .writeNamespaceOpen("Pagination") + .write(""); + + // Struct definition + writer.openBlock("struct " + opName + "PaginationTraits\n{", "};", () -> { + // Use detected suffix to match C2J renameShape logic + writer.write(" using RequestType = Model::$LRequest;", methodName) + .write(" using ResultType = Model::$L$L;", methodName, resultSuffix) + .write(" using OutcomeType = Model::$LOutcome;", methodName) + .write(" using ClientType = $LClient;", capitalizedServiceName) + .write(""); + + // Invoke method - template to defer instantiation + writer.write(" template") + .openBlock(" static OutcomeType Invoke(Client& client, const RequestType& request)\n {", " }", () -> { + writer.write(" return client.$L(request);", methodName); + }); + + writer.write(""); + + // HasMoreResults method + writer.openBlock(" static bool HasMoreResults(const ResultType& result)\n {", " }", () -> { + generateHasMoreResultsLogic(writer, trait, op); + }); + + writer.write(""); + + // SetNextRequest method + writer.openBlock(" static void SetNextRequest(const ResultType& result, RequestType& request)\n {", " }", () -> { + generateSetNextRequestLogic(writer, trait, op); + }); + }); + + writer.write(""); + writer.writeNamespaceClose("Pagination"); + writer.writeNamespaceClose(serviceName); + writer.writeNamespaceClose("Aws"); + } + + private void generateHasMoreResultsLogic(CppWriter writer, PaginatedTrait trait, OperationShape op) { + if (trait.getOutputToken().isPresent()) { + String outToken = trait.getOutputToken().get(); + + // Pattern A: Explicit nested token like "EngineDefaults.Marker" + if (outToken.contains(".")) { + String[] parts = outToken.split("\\.", 2); + String memberName = parts[0]; + String nestedTokenName = parts[1]; + if (ShapeUtil.isNumericToken(context.getModel(), op, smithyServiceName, memberName, nestedTokenName)) { + writer.write(" return result.Get$L().Get$L() != 0;", ServiceNameUtil.capitalize(memberName), ServiceNameUtil.capitalize(nestedTokenName)); + } else { + writer.write(" return !result.Get$L().Get$L().empty();", ServiceNameUtil.capitalize(memberName), ServiceNameUtil.capitalize(nestedTokenName)); + } + } + // Pattern B: Check if token is on top-level output + else if (ShapeUtil.hasTopLevelMember(context.getModel(), op, outToken)) { + if (ShapeUtil.isNumericToken(context.getModel(), op, smithyServiceName, null, outToken)) { + writer.write(" return result.Get$L() != 0;", ServiceNameUtil.capitalize(outToken)); + } else { + writer.write(" return !result.Get$L().empty();", ServiceNameUtil.capitalize(outToken)); + } + } + // Pattern C: Find wrapper member containing the token + else { + String wrapperMember = ShapeUtil.findWrapperMemberContainingToken(context.getModel(), op, outToken); + if (wrapperMember != null) { + if (ShapeUtil.isNumericToken(context.getModel(), op, smithyServiceName, wrapperMember, outToken)) { + writer.write(" return result.Get$L().Get$L() != 0;", ServiceNameUtil.capitalize(wrapperMember), ServiceNameUtil.capitalize(outToken)); + } else { + writer.write(" return !result.Get$L().Get$L().empty();", ServiceNameUtil.capitalize(wrapperMember), ServiceNameUtil.capitalize(outToken)); + } + } else if (ShapeUtil.hasTopLevelMember(context.getModel(), op, "IsTruncated")) { + writer.write(" return result.GetIsTruncated();"); + } else { + writer.write(" return false;"); + } + } + } else { + // Fallback to service-level pagination configuration + String serviceLevelOutputToken = ShapeUtil.getServiceLevelToken(service, software.amazon.smithy.model.traits.PaginatedTrait.class, t -> t.getOutputToken()); + if (serviceLevelOutputToken != null) { + if (ShapeUtil.isNumericToken(context.getModel(), op, smithyServiceName, null, serviceLevelOutputToken)) { + writer.write(" return result.Get$L() != 0;", ServiceNameUtil.capitalize(serviceLevelOutputToken)); + } else { + writer.write(" return !result.Get$L().empty();", ServiceNameUtil.capitalize(serviceLevelOutputToken)); + } + } else { + writer.write(" return result.GetIsTruncated();"); + } + } + } + + private void generateSetNextRequestLogic(CppWriter writer, PaginatedTrait trait, OperationShape op) { + String inToken = null; + String outToken = null; + + if (trait.getInputToken().isPresent() && trait.getOutputToken().isPresent()) { + inToken = trait.getInputToken().get(); + outToken = trait.getOutputToken().get(); + } else { + // Fallback to service-level pagination configuration + String serviceLevelInputToken = ShapeUtil.getServiceLevelToken(service, software.amazon.smithy.model.traits.PaginatedTrait.class, t -> t.getInputToken()); + String serviceLevelOutputToken = ShapeUtil.getServiceLevelToken(service, software.amazon.smithy.model.traits.PaginatedTrait.class, t -> t.getOutputToken()); + if (serviceLevelInputToken != null && serviceLevelOutputToken != null) { + inToken = serviceLevelInputToken; + outToken = serviceLevelOutputToken; + } + } + + if (inToken != null && outToken != null) { + // Pattern A: Explicit nested token like "EngineDefaults.Marker" + if (outToken.contains(".")) { + String[] parts = outToken.split("\\.", 2); + String memberName = parts[0]; + String nestedTokenName = parts[1]; + writer.write(" request.Set$L(result.Get$L().Get$L());", ServiceNameUtil.capitalize(inToken), ServiceNameUtil.capitalize(memberName), ServiceNameUtil.capitalize(nestedTokenName)); + } + // Pattern B: Check if token is on top-level output + else if (ShapeUtil.hasTopLevelMember(context.getModel(), op, outToken)) { + writer.write(" request.Set$L(result.Get$L());", ServiceNameUtil.capitalize(inToken), ServiceNameUtil.capitalize(outToken)); + } + // Pattern C: Find wrapper member containing the token + else { + String wrapperMember = ShapeUtil.findWrapperMemberContainingToken(context.getModel(), op, outToken); + if (wrapperMember != null) { + writer.write(" request.Set$L(result.Get$L().Get$L());", ServiceNameUtil.capitalize(inToken), ServiceNameUtil.capitalize(wrapperMember), ServiceNameUtil.capitalize(outToken)); + } else { + writer.write(" (void)result; (void)request; // Token not found"); + } + } + } else { + writer.write(" (void)result; (void)request; // Unused parameters"); + } + } +} \ No newline at end of file diff --git a/tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/resources/META-INF/services/software.amazon.smithy.build.SmithyBuildPlugin b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/resources/META-INF/services/software.amazon.smithy.build.SmithyBuildPlugin similarity index 100% rename from tools/code-generation/smithy/codegen/cpp-pagination-codegen/src/main/resources/META-INF/services/software.amazon.smithy.build.SmithyBuildPlugin rename to tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/resources/META-INF/services/software.amazon.smithy.build.SmithyBuildPlugin diff --git a/tools/code-generation/smithy/cpp-codegen/smithy2c2j_service_map.json b/tools/code-generation/smithy/cpp-codegen/smithy2c2j_service_map.json new file mode 100644 index 000000000000..1ff0190e0acb --- /dev/null +++ b/tools/code-generation/smithy/cpp-codegen/smithy2c2j_service_map.json @@ -0,0 +1,68 @@ +{ + "api-gateway": "apigateway", + "application-auto-scaling": "application-autoscaling", + "app-mesh": "appmesh", + "auto-scaling": "autoscaling", + "auto-scaling-plans": "autoscaling-plans", + "cloudhsm-v2": "cloudhsmv2", + "cloudsearch-domain": "cloudsearchdomain", + "config-service": "config", + "cost-and-usage-report-service": "cur", + "data-pipeline": "datapipeline", + "device-farm": "devicefarm", + "direct-connect": "directconnect", + "dynamodb-streams": "dynamodbstreams", + "elastic-beanstalk": "elasticbeanstalk", + "elastic-load-balancing": "elasticloadbalancing", + "elastic-load-balancing-v2": "elasticloadbalancingv2", + "global-accelerator": "globalaccelerator", + "iot-1click-devices-service": "iot1click-devices", + "iot-1click-projects": "iot1click-projects", + "iot-data-plane": "iot-data", + "iot-events-data": "iotevents-data", + "iot-events": "iotevents", + "iot-jobs-data-plane": "iot-jobs-data", + "iot-wireless": "iotwireless", + "kinesis-analytics": "kinesisanalytics", + "kinesis-analytics-v2": "kinesisanalyticsv2", + "kinesis-video": "kinesisvideo", + "lex-models-v2": "lexv2-models", + "lex-runtime-service": "lex", + "lex-runtime-v2": "lexv2-runtime", + "machine-learning": "machinelearning", + "marketplace-commerce-analytics": "marketplacecommerceanalytics", + "marketplace-entitlement-service": "marketplace-entitlement", + "marketplace-metering": "meteringmarketplace", + "migration-hub": "AWSMigrationHub", + "mturk": "mturk-requester", + "pinpoint-sms-voice": "sms-voice", + "resource-groups-tagging-api": "resourcegroupstaggingapi", + "route-53-domains": "route53domains", + "route-53": "route53", + "s3-control": "s3control", + "sagemaker-runtime": "sagemaker-runtime", + "secrets-manager": "secretsmanager", + "serverlessapplicationrepository": "serverlessrepo", + "service-catalog-appregistry": "servicecatalog-appregistry", + "service-catalog": "servicecatalog", + "transfer": "awstransfer", + "cloudwatch": "monitoring", + "cloudwatch-events": "events", + "storage-gateway":"storagegateway", + "efs":"elasticfilesystem", + "emr":"elasticmapreduce", + "ses":"email", + "cognito-identity-provider":"cognito-idp", + "cost-explorer":"ce", + "application-discovery-service":"discovery", + "database-migration-service":"dms", + "sfn":"states", + "lex-model-building-service":"lex-models", + "cloudwatch-logs":"logs", + "directory-service":"ds", + "elasticsearch-service":"es", + "importexport":"importexport", + "sdb":"sdb", + "transcribe-streaming":"transcribestreaming" + } + \ No newline at end of file diff --git a/tools/scripts/codegen/pagination_gen.py b/tools/scripts/codegen/pagination_gen.py index 67f34153327f..9bfb444c9baa 100644 --- a/tools/scripts/codegen/pagination_gen.py +++ b/tools/scripts/codegen/pagination_gen.py @@ -12,8 +12,8 @@ import subprocess from typing import List -SMITHY_GENERATOR_LOCATION = "tools/code-generation/smithy/codegen" -SMITHY_TO_C2J_MAP_FILE = "tools/code-generation/smithy/codegen/smithy2c2j_service_map.json" +SMITHY_GENERATOR_LOCATION = "tools/code-generation/smithy/cpp-codegen" +SMITHY_TO_C2J_MAP_FILE = "tools/code-generation/smithy/cpp-codegen/smithy2c2j_service_map.json" class PaginationGen(object): @@ -34,8 +34,8 @@ def generate(self, clients_to_build: set): if self._generate_pagination(smithy_services, json.dumps(self.smithy_c2j_data)): target_dir = os.path.abspath("generated/src") self._copy_cpp_codegen_contents( - os.path.abspath("tools/code-generation/smithy/codegen"), - "cpp-codegen-pagination-plugin", + os.path.abspath("tools/code-generation/smithy/cpp-codegen"), + "smithy-cpp-codegen", target_dir ) return 0 @@ -44,7 +44,7 @@ def generate(self, clients_to_build: set): def _generate_pagination(self, smithy_services: List[str], smithy_c2j_data: str): smithy_codegen_command = [ "./gradlew", - ":cpp-pagination:build", + "build", "-PservicesFilter=" + ",".join(smithy_services), "-Pc2jMap=" + smithy_c2j_data ] @@ -72,15 +72,15 @@ def _generate_pagination(self, smithy_services: List[str], smithy_c2j_data: str) return False def _copy_cpp_codegen_contents(self, top_level_dir: str, plugin_name: str, target_dir: str): - # Walk only cpp-pagination subdirectory to avoid .git and gradle cache - cpp_pagination_dir = os.path.join(top_level_dir, "cpp-pagination") + # Walk output directory to find generated code + output_dir = os.path.join(top_level_dir, "output") # TODO: Verify if this check is still needed after Smithy generator always creates output - if not os.path.exists(cpp_pagination_dir): + if not os.path.exists(output_dir): if self.debug: - print(f"No cpp-pagination directory found at '{cpp_pagination_dir}'") + print(f"No output directory found at '{output_dir}'") return - for root, dirs, files in os.walk(cpp_pagination_dir): + for root, dirs, files in os.walk(output_dir): if plugin_name in dirs: source_dir = os.path.join(root, plugin_name) @@ -118,7 +118,6 @@ def _copy_cpp_codegen_contents(self, top_level_dir: str, plugin_name: str, targe print(f"Copied from '{source_dir}' to '{service_target_dir}'") # Cleanup output directory - output_dir = os.path.join(top_level_dir, "cpp-pagination/output") if os.path.exists(output_dir): shutil.rmtree(output_dir) if self.debug: diff --git a/tools/scripts/codegen/smoke_tests_gen.py b/tools/scripts/codegen/smoke_tests_gen.py index 030df401e779..5d35da107c03 100644 --- a/tools/scripts/codegen/smoke_tests_gen.py +++ b/tools/scripts/codegen/smoke_tests_gen.py @@ -67,8 +67,8 @@ def generate(self, clients_to_build: set): def _generate_smoke_tests(self, smithy_services: List[str], smithy_c2j_data: str): smithy_codegen_command = [ "./gradlew", - ":cpp-smoke-tests:clean", - ":cpp-smoke-tests:build", + "clean", + "build", "-PoutputDirectory=" + SMITHY_OUTPUT_DIR, "-PservicesFilter=" + ",".join(smithy_services), "-Pc2jMap=" + smithy_c2j_data @@ -103,16 +103,8 @@ def _copy_cpp_codegen_contents(self, top_level_dir: str, plugin_name: str, targe if self.debug: print(f"_copy_cpp_codegen_contents: {target_dir}") - # Walk only cpp-smoke-tests subdirectory to avoid .git and gradle cache - cpp_smoke_tests_dir = os.path.join(top_level_dir, "cpp-smoke-tests") - # TODO: Verify if this check is still needed after Smithy generator always creates output - if not os.path.exists(cpp_smoke_tests_dir): - if self.debug: - print(f"No cpp-smoke-tests directory found at '{cpp_smoke_tests_dir}'") - return - - # Walk through the cpp-smoke-tests directory and find all plugin directories - for root, dirs, files in os.walk(cpp_smoke_tests_dir): + # Walk through the top-level directory and find all "cpp-codegen-smoke-tests-plugin" directories + for root, dirs, files in os.walk(top_level_dir): if plugin_name in dirs: source_dir = os.path.join(root, plugin_name) # recursively copy all contents from the source to the target folder From 75609a1678c72c61465d30cc66ed2938329e07d3 Mon Sep 17 00:00:00 2001 From: kai lin Date: Wed, 4 Feb 2026 14:03:19 -0500 Subject: [PATCH 3/5] adding back removed dependencies and fixed integration test --- .../include/aws/ec2/EC2ClientPagination.h | 3 + .../include/aws/ec2/EC2PaginationBase.h | 12 + .../EC2PaginationCompilationTests.cpp | 1 + .../ScanPaginationIntegrationTest.cpp | 105 +------- .../EC2PaginationIntegrationTest.cpp | 128 +-------- ...ListObjectsV2PaginationIntegrationTest.cpp | 243 +++++------------- .../smithy/cpp-codegen/build.gradle.kts | 6 + .../smithy-cpp-codegen/build.gradle.kts | 1 + .../pagination/PaginationCodegenPlugin.java | 2 +- 9 files changed, 112 insertions(+), 389 deletions(-) diff --git a/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/EC2ClientPagination.h b/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/EC2ClientPagination.h index a108d6a661d3..ee78a16a2279 100644 --- a/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/EC2ClientPagination.h +++ b/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/EC2ClientPagination.h @@ -169,6 +169,7 @@ #include #include #include +#include namespace Aws { namespace EC2 { @@ -587,6 +588,8 @@ using SearchLocalGatewayRoutesPaginator = Aws::Utils::Pagination::PagePaginator< using SearchTransitGatewayMulticastGroupsPaginator = Aws::Utils::Pagination::PagePaginator; +using SearchTransitGatewayRoutesPaginator = Aws::Utils::Pagination::PagePaginator; } // namespace EC2 } // namespace Aws diff --git a/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/EC2PaginationBase.h b/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/EC2PaginationBase.h index da4d9f967f4f..de1a43d06996 100644 --- a/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/EC2PaginationBase.h +++ b/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/EC2PaginationBase.h @@ -169,6 +169,7 @@ #include #include #include +#include #include @@ -1939,6 +1940,17 @@ class EC2PaginationBase { Pagination::SearchTransitGatewayMulticastGroupsPaginationTraits>{ std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; } + + /** + * Create a paginator for SearchTransitGatewayRoutes operation + */ + Aws::Utils::Pagination::PagePaginator + SearchTransitGatewayRoutesPaginator(const Model::SearchTransitGatewayRoutesRequest& request) { + return Aws::Utils::Pagination::PagePaginator{ + std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + } }; } // namespace EC2 } // namespace Aws diff --git a/generated/tests/ec2-gen-tests/EC2PaginationCompilationTests.cpp b/generated/tests/ec2-gen-tests/EC2PaginationCompilationTests.cpp index 9a477cb17b1a..c89ea3be4780 100644 --- a/generated/tests/ec2-gen-tests/EC2PaginationCompilationTests.cpp +++ b/generated/tests/ec2-gen-tests/EC2PaginationCompilationTests.cpp @@ -105,6 +105,7 @@ #include #include #include +#include #include #include #include diff --git a/tests/aws-cpp-sdk-dynamodb-integration-tests/ScanPaginationIntegrationTest.cpp b/tests/aws-cpp-sdk-dynamodb-integration-tests/ScanPaginationIntegrationTest.cpp index e5c5bd86dcab..97fb11767b3f 100644 --- a/tests/aws-cpp-sdk-dynamodb-integration-tests/ScanPaginationIntegrationTest.cpp +++ b/tests/aws-cpp-sdk-dynamodb-integration-tests/ScanPaginationIntegrationTest.cpp @@ -3,8 +3,6 @@ * SPDX-License-Identifier: Apache-2.0. */ -// TODO: Uncomment and test to identify which integration test is the bottleneck -/* #include #include #include @@ -109,106 +107,19 @@ class ScanPaginationTest : public Aws::Testing::AwsCppSdkGTestSuite { } }; -TEST_F(ScanPaginationTest, TestMultipleIterationOnResponses) { +TEST_F(ScanPaginationTest, TestPaginationTraits) { ScanRequest request; request.SetTableName(tableName); - request.SetConsistentRead(true); - request.SetLimit(2); - - size_t count = 0; - auto outcome = dynamoClient->Scan(request); - - // First iteration - while (outcome.IsSuccess()) { - const auto& result = outcome.GetResult(); - count += result.GetCount(); - - if (!Aws::DynamoDB::Pagination::ScanPaginationTraits::HasMoreResults(result)) { - break; - } - - Aws::DynamoDB::Pagination::ScanPaginationTraits::SetNextRequest(result, request); - outcome = dynamoClient->Scan(request); - } - - EXPECT_EQ(ITEM_COUNT, count); - - // Reset for second iteration - request = ScanRequest(); - request.SetTableName(tableName); - request.SetConsistentRead(true); - request.SetLimit(2); + request.SetLimit(1); // Force pagination - count = 0; - outcome = dynamoClient->Scan(request); - - // Second iteration - while (outcome.IsSuccess()) { - const auto& result = outcome.GetResult(); - count += result.GetCount(); - - if (!Aws::DynamoDB::Pagination::ScanPaginationTraits::HasMoreResults(result)) { - break; - } - - Aws::DynamoDB::Pagination::ScanPaginationTraits::SetNextRequest(result, request); - outcome = dynamoClient->Scan(request); - } - - EXPECT_EQ(ITEM_COUNT, count); -} - -TEST_F(ScanPaginationTest, TestPaginationWithLimit) { - ScanRequest request; - request.SetTableName(tableName); - request.SetConsistentRead(true); - request.SetLimit(3); - - size_t totalItems = 0; size_t pageCount = 0; - auto outcome = dynamoClient->Scan(request); + auto paginator = dynamoClient->ScanPaginator(request); - while (outcome.IsSuccess()) { - const auto& result = outcome.GetResult(); - totalItems += result.GetCount(); + for (auto pageIter = paginator.begin(); pageIter != paginator.end(); ++pageIter) { + const auto& outcome = *pageIter; + AWS_ASSERT_SUCCESS(outcome); pageCount++; - - if (!Aws::DynamoDB::Pagination::ScanPaginationTraits::HasMoreResults(result)) { - break; - } - - Aws::DynamoDB::Pagination::ScanPaginationTraits::SetNextRequest(result, request); - outcome = dynamoClient->Scan(request); } - EXPECT_EQ(ITEM_COUNT, totalItems); - EXPECT_GT(pageCount, 1u); // Should have multiple pages with limit=3 -} - -TEST_F(ScanPaginationTest, TestManualPaginationWithExclusiveStartKey) { - ScanRequest request; - request.SetTableName(tableName); - request.SetConsistentRead(true); - request.SetLimit(5); - - Aws::Vector> allItems; - - do { - auto outcome = dynamoClient->Scan(request); - ASSERT_TRUE(outcome.IsSuccess()); - - const auto& result = outcome.GetResult(); - for (const auto& item : result.GetItems()) { - allItems.push_back(item); - } - - if (!result.GetLastEvaluatedKey().empty()) { - request.SetExclusiveStartKey(result.GetLastEvaluatedKey()); - } else { - break; - } - } while (true); - - EXPECT_EQ(ITEM_COUNT, allItems.size()); -} -*/ \ No newline at end of file + EXPECT_GT(pageCount, 1u); // Should have multiple pages with Limit=1 +} \ No newline at end of file diff --git a/tests/aws-cpp-sdk-ec2-integration-tests/EC2PaginationIntegrationTest.cpp b/tests/aws-cpp-sdk-ec2-integration-tests/EC2PaginationIntegrationTest.cpp index 142ccde5a1d2..ac15fa287ffb 100644 --- a/tests/aws-cpp-sdk-ec2-integration-tests/EC2PaginationIntegrationTest.cpp +++ b/tests/aws-cpp-sdk-ec2-integration-tests/EC2PaginationIntegrationTest.cpp @@ -3,13 +3,7 @@ * SPDX-License-Identifier: Apache-2.0. */ -// TODO: Update these tests to use the new paginator API directly: -// For example: for (const auto& outcome : ec2Client->DescribeSpotPriceHistoryPaginator(request)) { ... } -// instead of manual pagination with traits - #include -#include -#include #include #include #include @@ -29,128 +23,28 @@ class EC2PaginationTest : public Aws::Testing::AwsCppSdkGTestSuite { std::shared_ptr ec2Client; void SetUp() override { - Aws::SDKOptions options; - Aws::InitAPI(options); - - Aws::Client::ClientConfiguration config; - config.region = "us-east-1"; - ec2Client = Aws::MakeShared(ALLOCATION_TAG, config); + ec2Client = Aws::MakeShared(ALLOCATION_TAG); } void TearDown() override { - Aws::SDKOptions options; - Aws::ShutdownAPI(options); } }; -TEST_F(EC2PaginationTest, TestSpotPriceHistoryPagination) { +TEST_F(EC2PaginationTest, TestPaginationTraits) { DescribeSpotPriceHistoryRequest request; - request.SetAvailabilityZone("us-east-1a"); request.AddProductDescriptions("Linux/UNIX (Amazon VPC)"); request.AddInstanceTypes(InstanceType::t1_micro); - request.SetStartTime(Aws::Utils::DateTime::Now() - std::chrono::milliseconds(1)); - request.SetMaxResults(10); + request.SetStartTime(Aws::Utils::DateTime::Now() - std::chrono::hours(1)); + request.SetMaxResults(1); // Force pagination - size_t totalSpotPrices = 0; - auto outcome = ec2Client->DescribeSpotPriceHistory(request); + size_t pageCount = 0; + auto paginator = ec2Client->DescribeSpotPriceHistoryPaginator(request); - while (outcome.IsSuccess()) { - const auto& result = outcome.GetResult(); - totalSpotPrices += result.GetSpotPriceHistory().size(); - - if (!Aws::EC2::Pagination::DescribeSpotPriceHistoryPaginationTraits::HasMoreResults(result)) { - break; - } - - Aws::EC2::Pagination::DescribeSpotPriceHistoryPaginationTraits::SetNextRequest(result, request); - outcome = ec2Client->DescribeSpotPriceHistory(request); + for (auto pageIter = paginator.begin(); pageIter != paginator.end(); ++pageIter) { + const auto& outcome = *pageIter; + AWS_ASSERT_SUCCESS(outcome); + pageCount++; } - ASSERT_TRUE(outcome.IsSuccess()); - // Should have at least one spot price entry - EXPECT_GE(totalSpotPrices, 1u); -} - -TEST_F(EC2PaginationTest, TestSpotPriceHistoryMultipleIteration) { - DescribeSpotPriceHistoryRequest request; - request.SetAvailabilityZone("us-east-1a"); - request.AddProductDescriptions("Linux/UNIX (Amazon VPC)"); - request.AddInstanceTypes(InstanceType::t1_micro); - request.SetStartTime(Aws::Utils::DateTime::Now() - std::chrono::milliseconds(1)); - request.SetMaxResults(5); - - // First iteration - size_t firstCount = 0; - auto outcome = ec2Client->DescribeSpotPriceHistory(request); - - while (outcome.IsSuccess()) { - const auto& result = outcome.GetResult(); - firstCount += result.GetSpotPriceHistory().size(); - - if (!Aws::EC2::Pagination::DescribeSpotPriceHistoryPaginationTraits::HasMoreResults(result)) { - break; - } - - Aws::EC2::Pagination::DescribeSpotPriceHistoryPaginationTraits::SetNextRequest(result, request); - outcome = ec2Client->DescribeSpotPriceHistory(request); - } - - ASSERT_TRUE(outcome.IsSuccess()); - - // Reset for second iteration - request = DescribeSpotPriceHistoryRequest(); - request.SetAvailabilityZone("us-east-1a"); - request.AddProductDescriptions("Linux/UNIX (Amazon VPC)"); - request.AddInstanceTypes(InstanceType::t1_micro); - request.SetStartTime(Aws::Utils::DateTime::Now() - std::chrono::milliseconds(1)); - request.SetMaxResults(5); - - // Second iteration - size_t secondCount = 0; - outcome = ec2Client->DescribeSpotPriceHistory(request); - - while (outcome.IsSuccess()) { - const auto& result = outcome.GetResult(); - secondCount += result.GetSpotPriceHistory().size(); - - if (!Aws::EC2::Pagination::DescribeSpotPriceHistoryPaginationTraits::HasMoreResults(result)) { - break; - } - - Aws::EC2::Pagination::DescribeSpotPriceHistoryPaginationTraits::SetNextRequest(result, request); - outcome = ec2Client->DescribeSpotPriceHistory(request); - } - - ASSERT_TRUE(outcome.IsSuccess()); - EXPECT_EQ(firstCount, secondCount); // Should get same results -} - -TEST_F(EC2PaginationTest, TestManualPaginationWithNextToken) { - DescribeSpotPriceHistoryRequest request; - request.SetAvailabilityZone("us-east-1a"); - request.AddProductDescriptions("Linux/UNIX (Amazon VPC)"); - request.AddInstanceTypes(InstanceType::t1_micro); - request.SetStartTime(Aws::Utils::DateTime::Now() - std::chrono::hours(24)); // Last 24 hours for more data - request.SetMaxResults(3); - - Aws::Vector allSpotPrices; - - do { - auto outcome = ec2Client->DescribeSpotPriceHistory(request); - ASSERT_TRUE(outcome.IsSuccess()); - - const auto& result = outcome.GetResult(); - for (const auto& spotPrice : result.GetSpotPriceHistory()) { - allSpotPrices.push_back(spotPrice); - } - - if (!result.GetNextToken().empty()) { - request.SetNextToken(result.GetNextToken()); - } else { - break; - } - } while (true); - - // Should have at least some spot price data - EXPECT_GE(allSpotPrices.size(), 1u); + EXPECT_GE(pageCount, 1u); // Should have at least one page } \ No newline at end of file diff --git a/tests/aws-cpp-sdk-s3-integration-tests/ListObjectsV2PaginationIntegrationTest.cpp b/tests/aws-cpp-sdk-s3-integration-tests/ListObjectsV2PaginationIntegrationTest.cpp index da829edc337f..8a0711a7494e 100644 --- a/tests/aws-cpp-sdk-s3-integration-tests/ListObjectsV2PaginationIntegrationTest.cpp +++ b/tests/aws-cpp-sdk-s3-integration-tests/ListObjectsV2PaginationIntegrationTest.cpp @@ -3,22 +3,18 @@ * SPDX-License-Identifier: Apache-2.0. */ -// TODO: Uncomment and test to identify which integration test is the bottleneck -/* #include #include -#include -#include -#include #include #include #include -#include #include #include #include #include #include +#include +#include #include using namespace Aws; @@ -28,149 +24,79 @@ using namespace Aws::S3::Model; namespace { static const char* ALLOCATION_TAG = "ListObjectsV2PaginationTest"; static const char* TEST_BUCKET_TAG = "IntegrationTestResource"; - static const int TIMEOUT_MAX = 20; - const size_t OBJECT_COUNT = 15; - const size_t MAX_KEYS = 3; + static const int TIMEOUT_MAX = 5; + const size_t OBJECT_COUNT = 3; + + Aws::String CalculateBucketName(const Aws::String& bucketPrefix) { + return Aws::Testing::GetAwsResourcePrefix() + bucketPrefix; + } } class ListObjectsV2PaginationTest : public Aws::Testing::AwsCppSdkGTestSuite { protected: std::shared_ptr Client; Aws::String bucketName; - Aws::String emptyBucketName; void SetUp() override { Aws::Client::ClientConfiguration config; config.region = Aws::Region::US_EAST_1; - config.scheme = Aws::Http::Scheme::HTTPS; - config.connectTimeoutMs = 30000; - config.requestTimeoutMs = 30000; - Client = Aws::MakeShared(ALLOCATION_TAG, config); - + bucketName = CalculateBucketName("listobjectsv2paginationtest"); - emptyBucketName = CalculateBucketName("listobjectsv2emptytest"); + // Create bucket CreateBucketRequest createRequest; createRequest.SetBucket(bucketName); createRequest.SetACL(BucketCannedACL::private_); auto createOutcome = Client->CreateBucket(createRequest); AWS_ASSERT_SUCCESS(createOutcome); - createRequest.SetBucket(emptyBucketName); - createOutcome = Client->CreateBucket(createRequest); - AWS_ASSERT_SUCCESS(createOutcome); - - ASSERT_TRUE(WaitForBucketToPropagate(bucketName)); - ASSERT_TRUE(WaitForBucketToPropagate(emptyBucketName)); - TagTestBucket(bucketName); - TagTestBucket(emptyBucketName); + ASSERT_TRUE(WaitForBucketToPropagate()); + TagTestBucket(); - // Create test objects + // Create a few test objects for (size_t i = 1; i <= OBJECT_COUNT; ++i) { - Aws::StringStream ss; - ss << "key-" << std::setfill('0') << std::setw(2) << i; - CreateTestObject(ss.str()); + CreateTestObject("key-" + Aws::Utils::StringUtils::to_string(i)); } } void TearDown() override { - DeleteBucket(bucketName); - DeleteBucket(emptyBucketName); + if (Client && !bucketName.empty()) { + EmptyBucket(); + + DeleteBucketRequest deleteRequest; + deleteRequest.SetBucket(bucketName); + Client->DeleteBucket(deleteRequest); + } Client = nullptr; } - - static void TagTestBucket(const Aws::String& bucketName, const std::shared_ptr& client) { - ASSERT_TRUE(!bucketName.empty()); - ASSERT_TRUE(client); - - PutBucketTaggingRequest taggingRequest; - taggingRequest.SetBucket(bucketName); - Tag tag; - tag.SetKey(TEST_BUCKET_TAG); - tag.SetValue(TEST_BUCKET_TAG); - Tagging tagging; - tagging.AddTagSet(tag); - taggingRequest.SetTagging(tagging); - - auto taggingOutcome = client->PutBucketTagging(taggingRequest); - AWS_ASSERT_SUCCESS(taggingOutcome); - } - - void TagTestBucket(const Aws::String& bucketNameParam) { - TagTestBucket(bucketNameParam, Client); - } - - bool WaitForBucketToPropagate(const Aws::String& bucketNameParam) { + + bool WaitForBucketToPropagate() { unsigned timeoutCount = 0; while (timeoutCount++ < TIMEOUT_MAX) { ListObjectsV2Request listRequest; - listRequest.SetBucket(bucketNameParam); + listRequest.SetBucket(bucketName); auto listOutcome = Client->ListObjectsV2(listRequest); if (listOutcome.IsSuccess()) { return true; } - std::this_thread::sleep_for(std::chrono::seconds(10)); + std::this_thread::sleep_for(std::chrono::seconds(2)); } return false; } - - void EmptyBucket(const Aws::String& bucketNameParam) { - ListObjectsV2Request listObjectsRequest; - listObjectsRequest.SetBucket(bucketNameParam); - - ListObjectsV2Outcome listObjectsOutcome = Client->ListObjectsV2(listObjectsRequest); - - if (!listObjectsOutcome.IsSuccess()) - return; - - for (const auto& object : listObjectsOutcome.GetResult().GetContents()) { - DeleteObjectRequest deleteObjectRequest; - deleteObjectRequest.SetBucket(bucketNameParam); - deleteObjectRequest.SetKey(object.GetKey()); - auto deleteObjectOutcome = Client->DeleteObject(deleteObjectRequest); - AWS_ASSERT_SUCCESS(deleteObjectOutcome); - } - } - - void WaitForBucketToEmpty(const Aws::String& bucketNameParam) { - ListObjectsV2Request listObjectsRequest; - listObjectsRequest.SetBucket(bucketNameParam); - - unsigned checkForObjectsCount = 0; - while (checkForObjectsCount++ < TIMEOUT_MAX) { - ListObjectsV2Outcome listObjectsOutcome = Client->ListObjectsV2(listObjectsRequest); - AWS_EXPECT_SUCCESS(listObjectsOutcome); - - if (listObjectsOutcome.GetResult().GetContents().size() > 0) { - std::this_thread::sleep_for(std::chrono::seconds(5)); - } else { - break; - } - } - } - - void DeleteBucket(const Aws::String& bucketNameParam) { - HeadBucketRequest headBucketRequest; - headBucketRequest.SetBucket(bucketNameParam); - HeadBucketOutcome bucketOutcome = Client->HeadBucket(headBucketRequest); - - if (bucketOutcome.IsSuccess()) { - EmptyBucket(bucketNameParam); - WaitForBucketToEmpty(bucketNameParam); - - DeleteBucketRequest deleteBucketRequest; - deleteBucketRequest.SetBucket(bucketNameParam); - - DeleteBucketOutcome deleteBucketOutcome = Client->DeleteBucket(deleteBucketRequest); - AWS_EXPECT_SUCCESS(deleteBucketOutcome); - } - } - - static Aws::String CalculateBucketName(const Aws::String& bucketPrefix) { - return Aws::Testing::GetAwsResourcePrefix() + bucketPrefix; + + void TagTestBucket() { + PutBucketTaggingRequest taggingRequest; + taggingRequest.SetBucket(bucketName); + Tag tag; + tag.SetKey(TEST_BUCKET_TAG); + tag.SetValue(TEST_BUCKET_TAG); + Tagging tagging; + tagging.AddTagSet(tag); + taggingRequest.SetTagging(tagging); + Client->PutBucketTagging(taggingRequest); } - + void CreateTestObject(const Aws::String& key) { PutObjectRequest putRequest; putRequest.SetBucket(bucketName); @@ -180,85 +106,54 @@ class ListObjectsV2PaginationTest : public Aws::Testing::AwsCppSdkGTestSuite { *data << "Test data for " << key; putRequest.SetBody(data); - auto putOutcome = Client->PutObject(putRequest); - AWS_ASSERT_SUCCESS(putOutcome); + Client->PutObject(putRequest); } -}; - -TEST_F(ListObjectsV2PaginationTest, TestPaginationOnEmptyBucket) { - ListObjectsV2Request request; - request.SetBucket(emptyBucketName); - request.SetMaxKeys(MAX_KEYS); - size_t objectCount = 0; - auto outcome = Client->ListObjectsV2(request); - - while (outcome.IsSuccess()) { - const auto& result = outcome.GetResult(); - objectCount += result.GetContents().size(); + void EmptyBucket() { + ListObjectsV2Request listRequest; + listRequest.SetBucket(bucketName); + auto listOutcome = Client->ListObjectsV2(listRequest); - if (!Aws::S3::Pagination::ListObjectsV2PaginationTraits::HasMoreResults(result)) { - break; + if (listOutcome.IsSuccess()) { + for (const auto& object : listOutcome.GetResult().GetContents()) { + DeleteObjectRequest deleteRequest; + deleteRequest.SetBucket(bucketName); + deleteRequest.SetKey(object.GetKey()); + Client->DeleteObject(deleteRequest); + } } - - Aws::S3::Pagination::ListObjectsV2PaginationTraits::SetNextRequest(result, request); - outcome = Client->ListObjectsV2(request); } - - AWS_ASSERT_SUCCESS(outcome); - EXPECT_EQ(0u, objectCount); -} +}; -TEST_F(ListObjectsV2PaginationTest, TestPaginationOnNonEmptyBucket) { +TEST_F(ListObjectsV2PaginationTest, TestPaginationTraits) { ListObjectsV2Request request; request.SetBucket(bucketName); - request.SetMaxKeys(MAX_KEYS); + request.SetMaxKeys(1); // Force pagination - size_t objectCount = 0; size_t pageCount = 0; - auto outcome = Client->ListObjectsV2(request); + auto paginator = Client->ListObjectsV2Paginator(request); - while (outcome.IsSuccess()) { - const auto& result = outcome.GetResult(); - objectCount += result.GetContents().size(); + for (auto pageIter = paginator.begin(); pageIter != paginator.end(); ++pageIter) { + const auto& outcome = *pageIter; + AWS_ASSERT_SUCCESS(outcome); pageCount++; - - if (!Aws::S3::Pagination::ListObjectsV2PaginationTraits::HasMoreResults(result)) { - break; - } - - Aws::S3::Pagination::ListObjectsV2PaginationTraits::SetNextRequest(result, request); - outcome = Client->ListObjectsV2(request); } - AWS_ASSERT_SUCCESS(outcome); - EXPECT_EQ(OBJECT_COUNT, objectCount); - EXPECT_GT(pageCount, 1u); // Should have multiple pages with MaxKeys=3 + EXPECT_GT(pageCount, 1u); // Should have multiple pages with MaxKeys=1 } -TEST_F(ListObjectsV2PaginationTest, TestManualPaginationLoop) { - ListObjectsV2Request request; - request.SetBucket(bucketName); - request.SetMaxKeys(MAX_KEYS); +TEST_F(ListObjectsV2PaginationTest, TestPaginationOnEmptyBucket) { + // Empty the bucket first + EmptyBucket(); - Aws::Vector allKeys; + ListObjectsV2Request emptyRequest; + emptyRequest.SetBucket(bucketName); + emptyRequest.SetMaxKeys(1); - do { - auto outcome = Client->ListObjectsV2(request); - AWS_ASSERT_SUCCESS(outcome); - - const auto& result = outcome.GetResult(); - for (const auto& object : result.GetContents()) { - allKeys.push_back(object.GetKey()); - } - - if (!result.GetIsTruncated()) { - break; - } - - request.SetContinuationToken(result.GetNextContinuationToken()); - } while (true); + auto emptyOutcome = Client->ListObjectsV2(emptyRequest); + AWS_ASSERT_SUCCESS(emptyOutcome); - EXPECT_EQ(OBJECT_COUNT, allKeys.size()); -} -*/ \ No newline at end of file + const auto& emptyResult = emptyOutcome.GetResult(); + EXPECT_EQ(0u, emptyResult.GetContents().size()); + EXPECT_FALSE(Aws::S3::Pagination::ListObjectsV2PaginationTraits::HasMoreResults(emptyResult)); +} \ No newline at end of file diff --git a/tools/code-generation/smithy/cpp-codegen/build.gradle.kts b/tools/code-generation/smithy/cpp-codegen/build.gradle.kts index 879303470228..2ad7ae705566 100644 --- a/tools/code-generation/smithy/cpp-codegen/build.gradle.kts +++ b/tools/code-generation/smithy/cpp-codegen/build.gradle.kts @@ -28,6 +28,12 @@ buildscript { dependencies { implementation(project(":smithy-cpp-codegen")) implementation("software.amazon.smithy:smithy-aws-traits:1.62.0") + implementation("software.amazon.smithy:smithy-aws-cloudformation-traits:1.62.0") + implementation("software.amazon.smithy:smithy-aws-iam-traits:1.62.0") + implementation("software.amazon.smithy:smithy-aws-endpoints:1.62.0") + implementation("software.amazon.smithy:smithy-smoke-test-traits:1.62.0") + implementation("software.amazon.smithy:smithy-aws-smoke-test-model:1.62.0") + implementation("software.amazon.smithy:smithy-waiters:1.62.0") } tasks.register("generate-smithy-build") { diff --git a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/build.gradle.kts b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/build.gradle.kts index 1cfaf7ea4964..759dc9e8be00 100644 --- a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/build.gradle.kts +++ b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/build.gradle.kts @@ -14,4 +14,5 @@ dependencies { implementation("software.amazon.smithy:smithy-waiters:1.62.0") implementation("software.amazon.smithy:smithy-rules-engine:1.62.0") implementation("software.amazon.smithy:smithy-aws-endpoints:1.62.0") + implementation("software.amazon.smithy:smithy-aws-iam-traits:1.62.0") } diff --git a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationCodegenPlugin.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationCodegenPlugin.java index 47975e5886f1..a33ac367ab24 100644 --- a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationCodegenPlugin.java +++ b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationCodegenPlugin.java @@ -55,7 +55,7 @@ public void execute(PluginContext context) { parser.run(featureParser -> { String serviceName = ServiceNameUtil.getServiceNameUpperCamel(featureParser.getService()); - // Generate CRTP pagination mixin (always, even if empty) + // Generate CRTP pagination (always, even if empty) featureParser.generateClientHeader( serviceName + "PaginationBase.h", writer -> new PaginationBaseGenerator(featureParser.getService(), featureParser.getOperations(), featureParser.getServiceMap()).render(writer) From 36e8b9b25b91dbc194688e5dc3fe93fc4345509a Mon Sep 17 00:00:00 2001 From: kai lin Date: Mon, 9 Feb 2026 13:28:09 -0500 Subject: [PATCH 4/5] fixed some comments on PR. Resolved unused mehtods and classes and addessed some nits change codegen to create templated pagination traits instead of forward declaring addressed comment on making paginators with references instead of pointers change pagepaginator to paginator --- .../aws/dynamodb/DynamoDBClientPagination.h | 17 +- .../aws/dynamodb/DynamoDBPaginationBase.h | 43 +- .../aws/dynamodb/model/ScanPaginationTraits.h | 9 +- .../include/aws/ec2/EC2ClientPagination.h | 656 +++---- .../include/aws/ec2/EC2PaginationBase.h | 1600 +++++++++-------- ...DescribeSpotPriceHistoryPaginationTraits.h | 9 +- .../include/aws/s3/S3ClientPagination.h | 11 +- .../include/aws/s3/S3PaginationBase.h | 31 +- .../s3/model/ListBucketsPaginationTraits.h | 9 +- .../ListDirectoryBucketsPaginationTraits.h | 9 +- .../s3/model/ListObjectsV2PaginationTraits.h | 9 +- .../aws/s3/model/ListPartsPaginationTraits.h | 9 +- .../aws/core/utils/pagination/Paginator.h | 28 +- .../utils/pagination/PaginatorTest.cpp | 15 +- .../ScanPaginationIntegrationTest.cpp | 16 +- .../EC2PaginationIntegrationTest.cpp | 15 +- ...ListObjectsV2PaginationIntegrationTest.cpp | 39 +- .../generators/ClientCodegenSettings.java | 20 - .../generators/ShapeUtil.java | 12 - .../pagination/PaginationBaseGenerator.java | 6 +- .../PaginationClientHeaderGenerator.java | 4 +- .../pagination/PaginationCodegenPlugin.java | 9 +- .../pagination/PaginationTraitsGenerator.java | 43 +- ...ware.amazon.smithy.build.SmithyBuildPlugin | 2 +- 24 files changed, 1304 insertions(+), 1317 deletions(-) delete mode 100644 tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ClientCodegenSettings.java diff --git a/generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/DynamoDBClientPagination.h b/generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/DynamoDBClientPagination.h index 41e75132dbc4..c421f85b0335 100644 --- a/generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/DynamoDBClientPagination.h +++ b/generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/DynamoDBClientPagination.h @@ -16,16 +16,19 @@ namespace Aws { namespace DynamoDB { -using ListContributorInsightsPaginator = Aws::Utils::Pagination::PagePaginator; +using ListContributorInsightsPaginator = + Aws::Utils::Pagination::Paginator>; using ListExportsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using ListImportsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using ListTablesPaginator = - Aws::Utils::Pagination::PagePaginator; -using QueryPaginator = Aws::Utils::Pagination::PagePaginator; -using ScanPaginator = Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using QueryPaginator = + Aws::Utils::Pagination::Paginator>; +using ScanPaginator = + Aws::Utils::Pagination::Paginator>; } // namespace DynamoDB } // namespace Aws diff --git a/generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/DynamoDBPaginationBase.h b/generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/DynamoDBPaginationBase.h index 739b15e86c26..03daba9e5fdc 100644 --- a/generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/DynamoDBPaginationBase.h +++ b/generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/DynamoDBPaginationBase.h @@ -26,57 +26,60 @@ class DynamoDBPaginationBase { /** * Create a paginator for ListContributorInsights operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> ListContributorInsightsPaginator(const Model::ListContributorInsightsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for ListExports operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> ListExportsPaginator(const Model::ListExportsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{*static_cast(this), + request}; } /** * Create a paginator for ListImports operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> ListImportsPaginator(const Model::ListImportsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{*static_cast(this), + request}; } /** * Create a paginator for ListTables operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> ListTablesPaginator(const Model::ListTablesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{*static_cast(this), + request}; } /** * Create a paginator for Query operation */ - Aws::Utils::Pagination::PagePaginator QueryPaginator( + Aws::Utils::Pagination::Paginator> QueryPaginator( const Model::QueryRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for Scan operation */ - Aws::Utils::Pagination::PagePaginator ScanPaginator( + Aws::Utils::Pagination::Paginator> ScanPaginator( const Model::ScanRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } }; } // namespace DynamoDB diff --git a/generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/model/ScanPaginationTraits.h b/generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/model/ScanPaginationTraits.h index 988cf65a5828..41f64ab4cca4 100644 --- a/generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/model/ScanPaginationTraits.h +++ b/generated/src/aws-cpp-sdk-dynamodb/include/aws/dynamodb/model/ScanPaginationTraits.h @@ -11,19 +11,16 @@ namespace Aws { namespace DynamoDB { -class DynamoDBClient; namespace Pagination { +template struct ScanPaginationTraits { using RequestType = Model::ScanRequest; using ResultType = Model::ScanResult; using OutcomeType = Model::ScanOutcome; - using ClientType = DynamoDBClient; + using ClientType = Client; - template - static OutcomeType Invoke(Client& client, const RequestType& request) { - return client.Scan(request); - } + static OutcomeType Invoke(Client& client, const RequestType& request) { return client.Scan(request); } static bool HasMoreResults(const ResultType& result) { return !result.GetLastEvaluatedKey().empty(); } diff --git a/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/EC2ClientPagination.h b/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/EC2ClientPagination.h index ee78a16a2279..8832ec884292 100644 --- a/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/EC2ClientPagination.h +++ b/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/EC2ClientPagination.h @@ -174,422 +174,452 @@ namespace Aws { namespace EC2 { -using DescribeAddressesAttributePaginator = Aws::Utils::Pagination::PagePaginator; -using DescribeAddressTransfersPaginator = Aws::Utils::Pagination::PagePaginator; +using DescribeAddressesAttributePaginator = + Aws::Utils::Pagination::Paginator>; +using DescribeAddressTransfersPaginator = + Aws::Utils::Pagination::Paginator>; using DescribeAwsNetworkPerformanceMetricSubscriptionsPaginator = - Aws::Utils::Pagination::PagePaginator; -using DescribeByoipCidrsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using DescribeByoipCidrsPaginator = Aws::Utils::Pagination::Paginator>; using DescribeCapacityBlockExtensionHistoryPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeCapacityBlockExtensionOfferingsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeCapacityBlockOfferingsPaginator = - Aws::Utils::Pagination::PagePaginator; -using DescribeCapacityBlocksPaginator = Aws::Utils::Pagination::PagePaginator; -using DescribeCapacityBlockStatusPaginator = Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using DescribeCapacityBlocksPaginator = Aws::Utils::Pagination::Paginator>; +using DescribeCapacityBlockStatusPaginator = + Aws::Utils::Pagination::Paginator>; using DescribeCapacityManagerDataExportsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeCapacityReservationBillingRequestsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeCapacityReservationFleetsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeCapacityReservationsPaginator = - Aws::Utils::Pagination::PagePaginator; -using DescribeCarrierGatewaysPaginator = Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using DescribeCarrierGatewaysPaginator = Aws::Utils::Pagination::Paginator>; using DescribeClassicLinkInstancesPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeClientVpnAuthorizationRulesPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeClientVpnConnectionsPaginator = - Aws::Utils::Pagination::PagePaginator; -using DescribeClientVpnEndpointsPaginator = Aws::Utils::Pagination::PagePaginator; -using DescribeClientVpnRoutesPaginator = Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using DescribeClientVpnEndpointsPaginator = + Aws::Utils::Pagination::Paginator>; +using DescribeClientVpnRoutesPaginator = Aws::Utils::Pagination::Paginator>; using DescribeClientVpnTargetNetworksPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeCoipPoolsPaginator = - Aws::Utils::Pagination::PagePaginator; -using DescribeDhcpOptionsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using DescribeDhcpOptionsPaginator = Aws::Utils::Pagination::Paginator>; using DescribeEgressOnlyInternetGatewaysPaginator = - Aws::Utils::Pagination::PagePaginator; -using DescribeExportImageTasksPaginator = Aws::Utils::Pagination::PagePaginator; -using DescribeFastLaunchImagesPaginator = Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using DescribeExportImageTasksPaginator = + Aws::Utils::Pagination::Paginator>; +using DescribeFastLaunchImagesPaginator = + Aws::Utils::Pagination::Paginator>; using DescribeFastSnapshotRestoresPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeFleetsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeFlowLogsPaginator = - Aws::Utils::Pagination::PagePaginator; -using DescribeFpgaImagesPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using DescribeFpgaImagesPaginator = Aws::Utils::Pagination::Paginator>; using DescribeHostReservationOfferingsPaginator = - Aws::Utils::Pagination::PagePaginator; -using DescribeHostReservationsPaginator = Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using DescribeHostReservationsPaginator = + Aws::Utils::Pagination::Paginator>; using DescribeHostsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeIamInstanceProfileAssociationsPaginator = - Aws::Utils::Pagination::PagePaginator; -using DescribeImageReferencesPaginator = Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using DescribeImageReferencesPaginator = Aws::Utils::Pagination::Paginator>; using DescribeImagesPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeImageUsageReportEntriesPaginator = - Aws::Utils::Pagination::PagePaginator; -using DescribeImageUsageReportsPaginator = Aws::Utils::Pagination::PagePaginator; -using DescribeImportImageTasksPaginator = Aws::Utils::Pagination::PagePaginator; -using DescribeImportSnapshotTasksPaginator = Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using DescribeImageUsageReportsPaginator = + Aws::Utils::Pagination::Paginator>; +using DescribeImportImageTasksPaginator = + Aws::Utils::Pagination::Paginator>; +using DescribeImportSnapshotTasksPaginator = + Aws::Utils::Pagination::Paginator>; using DescribeInstanceConnectEndpointsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeInstanceCreditSpecificationsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeInstanceEventWindowsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeInstanceImageMetadataPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeInstancesPaginator = - Aws::Utils::Pagination::PagePaginator; -using DescribeInstanceStatusPaginator = Aws::Utils::Pagination::PagePaginator; -using DescribeInstanceTopologyPaginator = Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using DescribeInstanceStatusPaginator = Aws::Utils::Pagination::Paginator>; +using DescribeInstanceTopologyPaginator = + Aws::Utils::Pagination::Paginator>; using DescribeInstanceTypeOfferingsPaginator = - Aws::Utils::Pagination::PagePaginator; -using DescribeInstanceTypesPaginator = Aws::Utils::Pagination::PagePaginator; -using DescribeInternetGatewaysPaginator = Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using DescribeInstanceTypesPaginator = Aws::Utils::Pagination::Paginator>; +using DescribeInternetGatewaysPaginator = + Aws::Utils::Pagination::Paginator>; using DescribeIpamPoolsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeIpamPrefixListResolversPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeIpamPrefixListResolverTargetsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeIpamResourceDiscoveriesPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeIpamResourceDiscoveryAssociationsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeIpamsPaginator = - Aws::Utils::Pagination::PagePaginator; -using DescribeIpamScopesPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using DescribeIpamScopesPaginator = Aws::Utils::Pagination::Paginator>; using DescribeIpv6PoolsPaginator = - Aws::Utils::Pagination::PagePaginator; -using DescribeLaunchTemplatesPaginator = Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using DescribeLaunchTemplatesPaginator = Aws::Utils::Pagination::Paginator>; using DescribeLaunchTemplateVersionsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeLocalGatewayRouteTablesPaginator = - Aws::Utils::Pagination::PagePaginator; -using DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsPaginator = Aws::Utils::Pagination::Paginator< + EC2Client, Model::DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsRequest, + Pagination::DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsPaginationTraits>; using DescribeLocalGatewayRouteTableVpcAssociationsPaginator = - Aws::Utils::Pagination::PagePaginator; -using DescribeLocalGatewaysPaginator = Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using DescribeLocalGatewaysPaginator = Aws::Utils::Pagination::Paginator>; using DescribeLocalGatewayVirtualInterfaceGroupsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeLocalGatewayVirtualInterfacesPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeMacHostsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeMacModificationTasksPaginator = - Aws::Utils::Pagination::PagePaginator; -using DescribeManagedPrefixListsPaginator = Aws::Utils::Pagination::PagePaginator; -using DescribeMovingAddressesPaginator = Aws::Utils::Pagination::PagePaginator; -using DescribeNatGatewaysPaginator = - Aws::Utils::Pagination::PagePaginator; -using DescribeNetworkAclsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using DescribeManagedPrefixListsPaginator = + Aws::Utils::Pagination::Paginator>; +using DescribeMovingAddressesPaginator = Aws::Utils::Pagination::Paginator>; +using DescribeNatGatewaysPaginator = Aws::Utils::Pagination::Paginator>; +using DescribeNetworkAclsPaginator = Aws::Utils::Pagination::Paginator>; using DescribeNetworkInsightsAccessScopeAnalysesPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeNetworkInsightsAccessScopesPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeNetworkInsightsAnalysesPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeNetworkInsightsPathsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeNetworkInterfacePermissionsPaginator = - Aws::Utils::Pagination::PagePaginator; -using DescribeNetworkInterfacesPaginator = Aws::Utils::Pagination::PagePaginator; -using DescribePrefixListsPaginator = - Aws::Utils::Pagination::PagePaginator; -using DescribePrincipalIdFormatPaginator = Aws::Utils::Pagination::PagePaginator; -using DescribePublicIpv4PoolsPaginator = Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using DescribeNetworkInterfacesPaginator = + Aws::Utils::Pagination::Paginator>; +using DescribePrefixListsPaginator = Aws::Utils::Pagination::Paginator>; +using DescribePrincipalIdFormatPaginator = + Aws::Utils::Pagination::Paginator>; +using DescribePublicIpv4PoolsPaginator = Aws::Utils::Pagination::Paginator>; using DescribeReplaceRootVolumeTasksPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeReservedInstancesModificationsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeReservedInstancesOfferingsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeRouteServerEndpointsPaginator = - Aws::Utils::Pagination::PagePaginator; -using DescribeRouteServerPeersPaginator = Aws::Utils::Pagination::PagePaginator; -using DescribeRouteServersPaginator = - Aws::Utils::Pagination::PagePaginator; -using DescribeRouteTablesPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using DescribeRouteServerPeersPaginator = + Aws::Utils::Pagination::Paginator>; +using DescribeRouteServersPaginator = Aws::Utils::Pagination::Paginator>; +using DescribeRouteTablesPaginator = Aws::Utils::Pagination::Paginator>; using DescribeScheduledInstanceAvailabilityPaginator = - Aws::Utils::Pagination::PagePaginator; -using DescribeScheduledInstancesPaginator = Aws::Utils::Pagination::PagePaginator; -using DescribeSecurityGroupRulesPaginator = Aws::Utils::Pagination::PagePaginator; -using DescribeSecurityGroupsPaginator = Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using DescribeScheduledInstancesPaginator = + Aws::Utils::Pagination::Paginator>; +using DescribeSecurityGroupRulesPaginator = + Aws::Utils::Pagination::Paginator>; +using DescribeSecurityGroupsPaginator = Aws::Utils::Pagination::Paginator>; using DescribeSecurityGroupVpcAssociationsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeSnapshotsPaginator = - Aws::Utils::Pagination::PagePaginator; -using DescribeSnapshotTierStatusPaginator = Aws::Utils::Pagination::PagePaginator; -using DescribeSpotFleetRequestsPaginator = Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using DescribeSnapshotTierStatusPaginator = + Aws::Utils::Pagination::Paginator>; +using DescribeSpotFleetRequestsPaginator = + Aws::Utils::Pagination::Paginator>; using DescribeSpotInstanceRequestsPaginator = - Aws::Utils::Pagination::PagePaginator; -using DescribeSpotPriceHistoryPaginator = Aws::Utils::Pagination::PagePaginator; -using DescribeStaleSecurityGroupsPaginator = Aws::Utils::Pagination::PagePaginator; -using DescribeStoreImageTasksPaginator = Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using DescribeSpotPriceHistoryPaginator = + Aws::Utils::Pagination::Paginator>; +using DescribeStaleSecurityGroupsPaginator = + Aws::Utils::Pagination::Paginator>; +using DescribeStoreImageTasksPaginator = Aws::Utils::Pagination::Paginator>; using DescribeSubnetsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeTagsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeTrafficMirrorFiltersPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeTrafficMirrorSessionsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeTrafficMirrorTargetsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeTransitGatewayAttachmentsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeTransitGatewayConnectPeersPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeTransitGatewayConnectsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeTransitGatewayMulticastDomainsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeTransitGatewayPeeringAttachmentsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeTransitGatewayPolicyTablesPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeTransitGatewayRouteTableAnnouncementsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeTransitGatewayRouteTablesPaginator = - Aws::Utils::Pagination::PagePaginator; -using DescribeTransitGatewaysPaginator = Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using DescribeTransitGatewaysPaginator = Aws::Utils::Pagination::Paginator>; using DescribeTransitGatewayVpcAttachmentsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeTrunkInterfaceAssociationsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeVerifiedAccessEndpointsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeVerifiedAccessGroupsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeVerifiedAccessInstanceLoggingConfigurationsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeVerifiedAccessInstancesPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeVerifiedAccessTrustProvidersPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeVolumesPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeVolumesModificationsPaginator = - Aws::Utils::Pagination::PagePaginator; -using DescribeVolumeStatusPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using DescribeVolumeStatusPaginator = Aws::Utils::Pagination::Paginator>; using DescribeVpcClassicLinkDnsSupportPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeVpcEndpointConnectionNotificationsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeVpcEndpointConnectionsPaginator = - Aws::Utils::Pagination::PagePaginator; -using DescribeVpcEndpointsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using DescribeVpcEndpointsPaginator = Aws::Utils::Pagination::Paginator>; using DescribeVpcEndpointServiceConfigurationsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeVpcEndpointServicePermissionsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeVpcPeeringConnectionsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using DescribeVpcsPaginator = - Aws::Utils::Pagination::PagePaginator; -using DescribeVpnConcentratorsPaginator = Aws::Utils::Pagination::PagePaginator; -using GetAssociatedIpv6PoolCidrsPaginator = Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using DescribeVpnConcentratorsPaginator = + Aws::Utils::Pagination::Paginator>; +using GetAssociatedIpv6PoolCidrsPaginator = + Aws::Utils::Pagination::Paginator>; using GetAwsNetworkPerformanceDataPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using GetCapacityManagerMetricDataPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using GetCapacityManagerMetricDimensionsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using GetGroupsForCapacityReservationPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using GetInstanceTypesFromInstanceRequirementsPaginator = - Aws::Utils::Pagination::PagePaginator; -using GetIpamAddressHistoryPaginator = Aws::Utils::Pagination::PagePaginator; -using GetIpamDiscoveredAccountsPaginator = Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using GetIpamAddressHistoryPaginator = Aws::Utils::Pagination::Paginator>; +using GetIpamDiscoveredAccountsPaginator = + Aws::Utils::Pagination::Paginator>; using GetIpamDiscoveredResourceCidrsPaginator = - Aws::Utils::Pagination::PagePaginator; -using GetIpamPoolAllocationsPaginator = Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using GetIpamPoolAllocationsPaginator = Aws::Utils::Pagination::Paginator>; using GetIpamPoolCidrsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using GetIpamPrefixListResolverRulesPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using GetIpamPrefixListResolverVersionEntriesPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using GetIpamPrefixListResolverVersionsPaginator = - Aws::Utils::Pagination::PagePaginator; -using GetIpamResourceCidrsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using GetIpamResourceCidrsPaginator = Aws::Utils::Pagination::Paginator>; using GetManagedPrefixListAssociationsPaginator = - Aws::Utils::Pagination::PagePaginator; -using GetManagedPrefixListEntriesPaginator = Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using GetManagedPrefixListEntriesPaginator = + Aws::Utils::Pagination::Paginator>; using GetNetworkInsightsAccessScopeAnalysisFindingsPaginator = - Aws::Utils::Pagination::PagePaginator; -using GetSecurityGroupsForVpcPaginator = Aws::Utils::Pagination::PagePaginator; -using GetSpotPlacementScoresPaginator = Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using GetSecurityGroupsForVpcPaginator = Aws::Utils::Pagination::Paginator>; +using GetSpotPlacementScoresPaginator = Aws::Utils::Pagination::Paginator>; using GetTransitGatewayAttachmentPropagationsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using GetTransitGatewayMulticastDomainAssociationsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using GetTransitGatewayPolicyTableAssociationsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using GetTransitGatewayPrefixListReferencesPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using GetTransitGatewayRouteTableAssociationsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; using GetTransitGatewayRouteTablePropagationsPaginator = - Aws::Utils::Pagination::PagePaginator; -using GetVpnConnectionDeviceTypesPaginator = Aws::Utils::Pagination::PagePaginator; -using ListImagesInRecycleBinPaginator = Aws::Utils::Pagination::PagePaginator; -using ListSnapshotsInRecycleBinPaginator = Aws::Utils::Pagination::PagePaginator; -using SearchLocalGatewayRoutesPaginator = Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using GetVpnConnectionDeviceTypesPaginator = + Aws::Utils::Pagination::Paginator>; +using ListImagesInRecycleBinPaginator = Aws::Utils::Pagination::Paginator>; +using ListSnapshotsInRecycleBinPaginator = + Aws::Utils::Pagination::Paginator>; +using SearchLocalGatewayRoutesPaginator = + Aws::Utils::Pagination::Paginator>; using SearchTransitGatewayMulticastGroupsPaginator = - Aws::Utils::Pagination::PagePaginator; -using SearchTransitGatewayRoutesPaginator = Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using SearchTransitGatewayRoutesPaginator = + Aws::Utils::Pagination::Paginator>; } // namespace EC2 } // namespace Aws diff --git a/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/EC2PaginationBase.h b/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/EC2PaginationBase.h index de1a43d06996..144b80fa08ef 100644 --- a/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/EC2PaginationBase.h +++ b/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/EC2PaginationBase.h @@ -184,1772 +184,1804 @@ class EC2PaginationBase { /** * Create a paginator for DescribeAddressesAttribute operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeAddressesAttributePaginator(const Model::DescribeAddressesAttributeRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeAddressTransfers operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeAddressTransfersPaginator(const Model::DescribeAddressTransfersRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeAwsNetworkPerformanceMetricSubscriptions operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeAwsNetworkPerformanceMetricSubscriptionsPaginator(const Model::DescribeAwsNetworkPerformanceMetricSubscriptionsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeByoipCidrs operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeByoipCidrsPaginator(const Model::DescribeByoipCidrsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeCapacityBlockExtensionHistory operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeCapacityBlockExtensionHistoryPaginator(const Model::DescribeCapacityBlockExtensionHistoryRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeCapacityBlockExtensionOfferings operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeCapacityBlockExtensionOfferingsPaginator(const Model::DescribeCapacityBlockExtensionOfferingsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeCapacityBlockOfferings operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeCapacityBlockOfferingsPaginator(const Model::DescribeCapacityBlockOfferingsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeCapacityBlocks operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeCapacityBlocksPaginator(const Model::DescribeCapacityBlocksRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeCapacityBlockStatus operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeCapacityBlockStatusPaginator(const Model::DescribeCapacityBlockStatusRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeCapacityManagerDataExports operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeCapacityManagerDataExportsPaginator(const Model::DescribeCapacityManagerDataExportsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeCapacityReservationBillingRequests operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeCapacityReservationBillingRequestsPaginator(const Model::DescribeCapacityReservationBillingRequestsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeCapacityReservationFleets operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeCapacityReservationFleetsPaginator(const Model::DescribeCapacityReservationFleetsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeCapacityReservations operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeCapacityReservationsPaginator(const Model::DescribeCapacityReservationsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeCarrierGateways operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeCarrierGatewaysPaginator(const Model::DescribeCarrierGatewaysRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeClassicLinkInstances operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeClassicLinkInstancesPaginator(const Model::DescribeClassicLinkInstancesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeClientVpnAuthorizationRules operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeClientVpnAuthorizationRulesPaginator(const Model::DescribeClientVpnAuthorizationRulesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeClientVpnConnections operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeClientVpnConnectionsPaginator(const Model::DescribeClientVpnConnectionsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeClientVpnEndpoints operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeClientVpnEndpointsPaginator(const Model::DescribeClientVpnEndpointsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeClientVpnRoutes operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeClientVpnRoutesPaginator(const Model::DescribeClientVpnRoutesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeClientVpnTargetNetworks operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeClientVpnTargetNetworksPaginator(const Model::DescribeClientVpnTargetNetworksRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeCoipPools operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeCoipPoolsPaginator(const Model::DescribeCoipPoolsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeDhcpOptions operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeDhcpOptionsPaginator(const Model::DescribeDhcpOptionsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeEgressOnlyInternetGateways operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeEgressOnlyInternetGatewaysPaginator(const Model::DescribeEgressOnlyInternetGatewaysRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeExportImageTasks operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeExportImageTasksPaginator(const Model::DescribeExportImageTasksRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeFastLaunchImages operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeFastLaunchImagesPaginator(const Model::DescribeFastLaunchImagesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeFastSnapshotRestores operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeFastSnapshotRestoresPaginator(const Model::DescribeFastSnapshotRestoresRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeFleets operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeFleetsPaginator(const Model::DescribeFleetsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{*static_cast(this), + request}; } /** * Create a paginator for DescribeFlowLogs operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeFlowLogsPaginator(const Model::DescribeFlowLogsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeFpgaImages operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeFpgaImagesPaginator(const Model::DescribeFpgaImagesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeHostReservationOfferings operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeHostReservationOfferingsPaginator(const Model::DescribeHostReservationOfferingsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeHostReservations operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeHostReservationsPaginator(const Model::DescribeHostReservationsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeHosts operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeHostsPaginator(const Model::DescribeHostsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{*static_cast(this), + request}; } /** * Create a paginator for DescribeIamInstanceProfileAssociations operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeIamInstanceProfileAssociationsPaginator(const Model::DescribeIamInstanceProfileAssociationsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeImageReferences operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeImageReferencesPaginator(const Model::DescribeImageReferencesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeImages operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeImagesPaginator(const Model::DescribeImagesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{*static_cast(this), + request}; } /** * Create a paginator for DescribeImageUsageReportEntries operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeImageUsageReportEntriesPaginator(const Model::DescribeImageUsageReportEntriesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeImageUsageReports operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeImageUsageReportsPaginator(const Model::DescribeImageUsageReportsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeImportImageTasks operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeImportImageTasksPaginator(const Model::DescribeImportImageTasksRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeImportSnapshotTasks operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeImportSnapshotTasksPaginator(const Model::DescribeImportSnapshotTasksRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeInstanceConnectEndpoints operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeInstanceConnectEndpointsPaginator(const Model::DescribeInstanceConnectEndpointsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeInstanceCreditSpecifications operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeInstanceCreditSpecificationsPaginator(const Model::DescribeInstanceCreditSpecificationsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeInstanceEventWindows operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeInstanceEventWindowsPaginator(const Model::DescribeInstanceEventWindowsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeInstanceImageMetadata operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeInstanceImageMetadataPaginator(const Model::DescribeInstanceImageMetadataRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeInstances operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeInstancesPaginator(const Model::DescribeInstancesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeInstanceStatus operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeInstanceStatusPaginator(const Model::DescribeInstanceStatusRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeInstanceTopology operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeInstanceTopologyPaginator(const Model::DescribeInstanceTopologyRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeInstanceTypeOfferings operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeInstanceTypeOfferingsPaginator(const Model::DescribeInstanceTypeOfferingsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeInstanceTypes operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeInstanceTypesPaginator(const Model::DescribeInstanceTypesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeInternetGateways operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeInternetGatewaysPaginator(const Model::DescribeInternetGatewaysRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeIpamPools operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeIpamPoolsPaginator(const Model::DescribeIpamPoolsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeIpamPrefixListResolvers operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeIpamPrefixListResolversPaginator(const Model::DescribeIpamPrefixListResolversRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeIpamPrefixListResolverTargets operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeIpamPrefixListResolverTargetsPaginator(const Model::DescribeIpamPrefixListResolverTargetsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeIpamResourceDiscoveries operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeIpamResourceDiscoveriesPaginator(const Model::DescribeIpamResourceDiscoveriesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeIpamResourceDiscoveryAssociations operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeIpamResourceDiscoveryAssociationsPaginator(const Model::DescribeIpamResourceDiscoveryAssociationsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeIpams operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeIpamsPaginator(const Model::DescribeIpamsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{*static_cast(this), + request}; } /** * Create a paginator for DescribeIpamScopes operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeIpamScopesPaginator(const Model::DescribeIpamScopesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeIpv6Pools operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeIpv6PoolsPaginator(const Model::DescribeIpv6PoolsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeLaunchTemplates operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeLaunchTemplatesPaginator(const Model::DescribeLaunchTemplatesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeLaunchTemplateVersions operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeLaunchTemplateVersionsPaginator(const Model::DescribeLaunchTemplateVersionsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeLocalGatewayRouteTables operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeLocalGatewayRouteTablesPaginator(const Model::DescribeLocalGatewayRouteTablesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociations operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator< + DerivedClient, Model::DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsRequest, + Pagination::DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsPaginationTraits> DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsPaginator( const Model::DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsRequest& request) { - return Aws::Utils::Pagination::PagePaginator< + return Aws::Utils::Pagination::Paginator< DerivedClient, Model::DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsRequest, - Pagination::DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsPaginationTraits>{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + Pagination::DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsPaginationTraits>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeLocalGatewayRouteTableVpcAssociations operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeLocalGatewayRouteTableVpcAssociationsPaginator(const Model::DescribeLocalGatewayRouteTableVpcAssociationsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeLocalGateways operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeLocalGatewaysPaginator(const Model::DescribeLocalGatewaysRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeLocalGatewayVirtualInterfaceGroups operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeLocalGatewayVirtualInterfaceGroupsPaginator(const Model::DescribeLocalGatewayVirtualInterfaceGroupsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeLocalGatewayVirtualInterfaces operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeLocalGatewayVirtualInterfacesPaginator(const Model::DescribeLocalGatewayVirtualInterfacesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeMacHosts operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeMacHostsPaginator(const Model::DescribeMacHostsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeMacModificationTasks operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeMacModificationTasksPaginator(const Model::DescribeMacModificationTasksRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeManagedPrefixLists operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeManagedPrefixListsPaginator(const Model::DescribeManagedPrefixListsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeMovingAddresses operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeMovingAddressesPaginator(const Model::DescribeMovingAddressesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeNatGateways operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeNatGatewaysPaginator(const Model::DescribeNatGatewaysRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeNetworkAcls operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeNetworkAclsPaginator(const Model::DescribeNetworkAclsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeNetworkInsightsAccessScopeAnalyses operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeNetworkInsightsAccessScopeAnalysesPaginator(const Model::DescribeNetworkInsightsAccessScopeAnalysesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeNetworkInsightsAccessScopes operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeNetworkInsightsAccessScopesPaginator(const Model::DescribeNetworkInsightsAccessScopesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeNetworkInsightsAnalyses operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeNetworkInsightsAnalysesPaginator(const Model::DescribeNetworkInsightsAnalysesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeNetworkInsightsPaths operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeNetworkInsightsPathsPaginator(const Model::DescribeNetworkInsightsPathsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeNetworkInterfacePermissions operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeNetworkInterfacePermissionsPaginator(const Model::DescribeNetworkInterfacePermissionsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeNetworkInterfaces operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeNetworkInterfacesPaginator(const Model::DescribeNetworkInterfacesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribePrefixLists operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribePrefixListsPaginator(const Model::DescribePrefixListsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribePrincipalIdFormat operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribePrincipalIdFormatPaginator(const Model::DescribePrincipalIdFormatRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribePublicIpv4Pools operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribePublicIpv4PoolsPaginator(const Model::DescribePublicIpv4PoolsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeReplaceRootVolumeTasks operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeReplaceRootVolumeTasksPaginator(const Model::DescribeReplaceRootVolumeTasksRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeReservedInstancesModifications operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeReservedInstancesModificationsPaginator(const Model::DescribeReservedInstancesModificationsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeReservedInstancesOfferings operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeReservedInstancesOfferingsPaginator(const Model::DescribeReservedInstancesOfferingsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeRouteServerEndpoints operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeRouteServerEndpointsPaginator(const Model::DescribeRouteServerEndpointsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeRouteServerPeers operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeRouteServerPeersPaginator(const Model::DescribeRouteServerPeersRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeRouteServers operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeRouteServersPaginator(const Model::DescribeRouteServersRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeRouteTables operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeRouteTablesPaginator(const Model::DescribeRouteTablesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeScheduledInstanceAvailability operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeScheduledInstanceAvailabilityPaginator(const Model::DescribeScheduledInstanceAvailabilityRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeScheduledInstances operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeScheduledInstancesPaginator(const Model::DescribeScheduledInstancesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeSecurityGroupRules operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeSecurityGroupRulesPaginator(const Model::DescribeSecurityGroupRulesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeSecurityGroups operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeSecurityGroupsPaginator(const Model::DescribeSecurityGroupsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeSecurityGroupVpcAssociations operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeSecurityGroupVpcAssociationsPaginator(const Model::DescribeSecurityGroupVpcAssociationsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeSnapshots operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeSnapshotsPaginator(const Model::DescribeSnapshotsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeSnapshotTierStatus operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeSnapshotTierStatusPaginator(const Model::DescribeSnapshotTierStatusRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeSpotFleetRequests operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeSpotFleetRequestsPaginator(const Model::DescribeSpotFleetRequestsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeSpotInstanceRequests operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeSpotInstanceRequestsPaginator(const Model::DescribeSpotInstanceRequestsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeSpotPriceHistory operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeSpotPriceHistoryPaginator(const Model::DescribeSpotPriceHistoryRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeStaleSecurityGroups operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeStaleSecurityGroupsPaginator(const Model::DescribeStaleSecurityGroupsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeStoreImageTasks operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeStoreImageTasksPaginator(const Model::DescribeStoreImageTasksRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeSubnets operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeSubnetsPaginator(const Model::DescribeSubnetsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{*static_cast(this), + request}; } /** * Create a paginator for DescribeTags operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeTagsPaginator(const Model::DescribeTagsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{*static_cast(this), + request}; } /** * Create a paginator for DescribeTrafficMirrorFilters operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeTrafficMirrorFiltersPaginator(const Model::DescribeTrafficMirrorFiltersRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeTrafficMirrorSessions operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeTrafficMirrorSessionsPaginator(const Model::DescribeTrafficMirrorSessionsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeTrafficMirrorTargets operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeTrafficMirrorTargetsPaginator(const Model::DescribeTrafficMirrorTargetsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeTransitGatewayAttachments operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeTransitGatewayAttachmentsPaginator(const Model::DescribeTransitGatewayAttachmentsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeTransitGatewayConnectPeers operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeTransitGatewayConnectPeersPaginator(const Model::DescribeTransitGatewayConnectPeersRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeTransitGatewayConnects operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeTransitGatewayConnectsPaginator(const Model::DescribeTransitGatewayConnectsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeTransitGatewayMulticastDomains operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeTransitGatewayMulticastDomainsPaginator(const Model::DescribeTransitGatewayMulticastDomainsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeTransitGatewayPeeringAttachments operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeTransitGatewayPeeringAttachmentsPaginator(const Model::DescribeTransitGatewayPeeringAttachmentsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeTransitGatewayPolicyTables operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeTransitGatewayPolicyTablesPaginator(const Model::DescribeTransitGatewayPolicyTablesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeTransitGatewayRouteTableAnnouncements operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeTransitGatewayRouteTableAnnouncementsPaginator(const Model::DescribeTransitGatewayRouteTableAnnouncementsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeTransitGatewayRouteTables operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeTransitGatewayRouteTablesPaginator(const Model::DescribeTransitGatewayRouteTablesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeTransitGateways operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeTransitGatewaysPaginator(const Model::DescribeTransitGatewaysRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeTransitGatewayVpcAttachments operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeTransitGatewayVpcAttachmentsPaginator(const Model::DescribeTransitGatewayVpcAttachmentsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeTrunkInterfaceAssociations operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeTrunkInterfaceAssociationsPaginator(const Model::DescribeTrunkInterfaceAssociationsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeVerifiedAccessEndpoints operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeVerifiedAccessEndpointsPaginator(const Model::DescribeVerifiedAccessEndpointsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeVerifiedAccessGroups operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeVerifiedAccessGroupsPaginator(const Model::DescribeVerifiedAccessGroupsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeVerifiedAccessInstanceLoggingConfigurations operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeVerifiedAccessInstanceLoggingConfigurationsPaginator( const Model::DescribeVerifiedAccessInstanceLoggingConfigurationsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator< + DerivedClient, Model::DescribeVerifiedAccessInstanceLoggingConfigurationsRequest, + Pagination::DescribeVerifiedAccessInstanceLoggingConfigurationsPaginationTraits>{*static_cast(this), + request}; } /** * Create a paginator for DescribeVerifiedAccessInstances operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeVerifiedAccessInstancesPaginator(const Model::DescribeVerifiedAccessInstancesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeVerifiedAccessTrustProviders operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeVerifiedAccessTrustProvidersPaginator(const Model::DescribeVerifiedAccessTrustProvidersRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeVolumes operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeVolumesPaginator(const Model::DescribeVolumesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{*static_cast(this), + request}; } /** * Create a paginator for DescribeVolumesModifications operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeVolumesModificationsPaginator(const Model::DescribeVolumesModificationsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeVolumeStatus operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeVolumeStatusPaginator(const Model::DescribeVolumeStatusRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeVpcClassicLinkDnsSupport operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeVpcClassicLinkDnsSupportPaginator(const Model::DescribeVpcClassicLinkDnsSupportRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeVpcEndpointConnectionNotifications operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeVpcEndpointConnectionNotificationsPaginator(const Model::DescribeVpcEndpointConnectionNotificationsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeVpcEndpointConnections operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeVpcEndpointConnectionsPaginator(const Model::DescribeVpcEndpointConnectionsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeVpcEndpoints operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeVpcEndpointsPaginator(const Model::DescribeVpcEndpointsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeVpcEndpointServiceConfigurations operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeVpcEndpointServiceConfigurationsPaginator(const Model::DescribeVpcEndpointServiceConfigurationsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeVpcEndpointServicePermissions operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeVpcEndpointServicePermissionsPaginator(const Model::DescribeVpcEndpointServicePermissionsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeVpcPeeringConnections operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeVpcPeeringConnectionsPaginator(const Model::DescribeVpcPeeringConnectionsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for DescribeVpcs operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeVpcsPaginator(const Model::DescribeVpcsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{*static_cast(this), + request}; } /** * Create a paginator for DescribeVpnConcentrators operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> DescribeVpnConcentratorsPaginator(const Model::DescribeVpnConcentratorsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for GetAssociatedIpv6PoolCidrs operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> GetAssociatedIpv6PoolCidrsPaginator(const Model::GetAssociatedIpv6PoolCidrsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for GetAwsNetworkPerformanceData operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> GetAwsNetworkPerformanceDataPaginator(const Model::GetAwsNetworkPerformanceDataRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for GetCapacityManagerMetricData operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> GetCapacityManagerMetricDataPaginator(const Model::GetCapacityManagerMetricDataRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for GetCapacityManagerMetricDimensions operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> GetCapacityManagerMetricDimensionsPaginator(const Model::GetCapacityManagerMetricDimensionsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for GetGroupsForCapacityReservation operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> GetGroupsForCapacityReservationPaginator(const Model::GetGroupsForCapacityReservationRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for GetInstanceTypesFromInstanceRequirements operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> GetInstanceTypesFromInstanceRequirementsPaginator(const Model::GetInstanceTypesFromInstanceRequirementsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for GetIpamAddressHistory operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> GetIpamAddressHistoryPaginator(const Model::GetIpamAddressHistoryRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for GetIpamDiscoveredAccounts operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> GetIpamDiscoveredAccountsPaginator(const Model::GetIpamDiscoveredAccountsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for GetIpamDiscoveredResourceCidrs operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> GetIpamDiscoveredResourceCidrsPaginator(const Model::GetIpamDiscoveredResourceCidrsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for GetIpamPoolAllocations operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> GetIpamPoolAllocationsPaginator(const Model::GetIpamPoolAllocationsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for GetIpamPoolCidrs operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> GetIpamPoolCidrsPaginator(const Model::GetIpamPoolCidrsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for GetIpamPrefixListResolverRules operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> GetIpamPrefixListResolverRulesPaginator(const Model::GetIpamPrefixListResolverRulesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for GetIpamPrefixListResolverVersionEntries operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> GetIpamPrefixListResolverVersionEntriesPaginator(const Model::GetIpamPrefixListResolverVersionEntriesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for GetIpamPrefixListResolverVersions operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> GetIpamPrefixListResolverVersionsPaginator(const Model::GetIpamPrefixListResolverVersionsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for GetIpamResourceCidrs operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> GetIpamResourceCidrsPaginator(const Model::GetIpamResourceCidrsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for GetManagedPrefixListAssociations operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> GetManagedPrefixListAssociationsPaginator(const Model::GetManagedPrefixListAssociationsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for GetManagedPrefixListEntries operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> GetManagedPrefixListEntriesPaginator(const Model::GetManagedPrefixListEntriesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for GetNetworkInsightsAccessScopeAnalysisFindings operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> GetNetworkInsightsAccessScopeAnalysisFindingsPaginator(const Model::GetNetworkInsightsAccessScopeAnalysisFindingsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for GetSecurityGroupsForVpc operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> GetSecurityGroupsForVpcPaginator(const Model::GetSecurityGroupsForVpcRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for GetSpotPlacementScores operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> GetSpotPlacementScoresPaginator(const Model::GetSpotPlacementScoresRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for GetTransitGatewayAttachmentPropagations operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> GetTransitGatewayAttachmentPropagationsPaginator(const Model::GetTransitGatewayAttachmentPropagationsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for GetTransitGatewayMulticastDomainAssociations operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> GetTransitGatewayMulticastDomainAssociationsPaginator(const Model::GetTransitGatewayMulticastDomainAssociationsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for GetTransitGatewayPolicyTableAssociations operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> GetTransitGatewayPolicyTableAssociationsPaginator(const Model::GetTransitGatewayPolicyTableAssociationsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for GetTransitGatewayPrefixListReferences operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> GetTransitGatewayPrefixListReferencesPaginator(const Model::GetTransitGatewayPrefixListReferencesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for GetTransitGatewayRouteTableAssociations operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> GetTransitGatewayRouteTableAssociationsPaginator(const Model::GetTransitGatewayRouteTableAssociationsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for GetTransitGatewayRouteTablePropagations operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> GetTransitGatewayRouteTablePropagationsPaginator(const Model::GetTransitGatewayRouteTablePropagationsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for GetVpnConnectionDeviceTypes operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> GetVpnConnectionDeviceTypesPaginator(const Model::GetVpnConnectionDeviceTypesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for ListImagesInRecycleBin operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> ListImagesInRecycleBinPaginator(const Model::ListImagesInRecycleBinRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for ListSnapshotsInRecycleBin operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> ListSnapshotsInRecycleBinPaginator(const Model::ListSnapshotsInRecycleBinRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for SearchLocalGatewayRoutes operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> SearchLocalGatewayRoutesPaginator(const Model::SearchLocalGatewayRoutesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for SearchTransitGatewayMulticastGroups operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> SearchTransitGatewayMulticastGroupsPaginator(const Model::SearchTransitGatewayMulticastGroupsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for SearchTransitGatewayRoutes operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> SearchTransitGatewayRoutesPaginator(const Model::SearchTransitGatewayRoutesRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } }; } // namespace EC2 diff --git a/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/model/DescribeSpotPriceHistoryPaginationTraits.h b/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/model/DescribeSpotPriceHistoryPaginationTraits.h index b46693ff9250..1b905d94a799 100644 --- a/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/model/DescribeSpotPriceHistoryPaginationTraits.h +++ b/generated/src/aws-cpp-sdk-ec2/include/aws/ec2/model/DescribeSpotPriceHistoryPaginationTraits.h @@ -11,19 +11,16 @@ namespace Aws { namespace EC2 { -class EC2Client; namespace Pagination { +template struct DescribeSpotPriceHistoryPaginationTraits { using RequestType = Model::DescribeSpotPriceHistoryRequest; using ResultType = Model::DescribeSpotPriceHistoryResponse; using OutcomeType = Model::DescribeSpotPriceHistoryOutcome; - using ClientType = EC2Client; + using ClientType = Client; - template - static OutcomeType Invoke(Client& client, const RequestType& request) { - return client.DescribeSpotPriceHistory(request); - } + static OutcomeType Invoke(Client& client, const RequestType& request) { return client.DescribeSpotPriceHistory(request); } static bool HasMoreResults(const ResultType& result) { return !result.GetNextToken().empty(); } diff --git a/generated/src/aws-cpp-sdk-s3/include/aws/s3/S3ClientPagination.h b/generated/src/aws-cpp-sdk-s3/include/aws/s3/S3ClientPagination.h index c2853b35f652..cdac59ee9497 100644 --- a/generated/src/aws-cpp-sdk-s3/include/aws/s3/S3ClientPagination.h +++ b/generated/src/aws-cpp-sdk-s3/include/aws/s3/S3ClientPagination.h @@ -15,12 +15,13 @@ namespace Aws { namespace S3 { using ListBucketsPaginator = - Aws::Utils::Pagination::PagePaginator; -using ListDirectoryBucketsPaginator = - Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using ListDirectoryBucketsPaginator = Aws::Utils::Pagination::Paginator>; using ListObjectsV2Paginator = - Aws::Utils::Pagination::PagePaginator; -using ListPartsPaginator = Aws::Utils::Pagination::PagePaginator; + Aws::Utils::Pagination::Paginator>; +using ListPartsPaginator = + Aws::Utils::Pagination::Paginator>; } // namespace S3 } // namespace Aws diff --git a/generated/src/aws-cpp-sdk-s3/include/aws/s3/S3PaginationBase.h b/generated/src/aws-cpp-sdk-s3/include/aws/s3/S3PaginationBase.h index d7156cc705e7..5b22027cf57b 100644 --- a/generated/src/aws-cpp-sdk-s3/include/aws/s3/S3PaginationBase.h +++ b/generated/src/aws-cpp-sdk-s3/include/aws/s3/S3PaginationBase.h @@ -24,38 +24,41 @@ class S3PaginationBase { /** * Create a paginator for ListBuckets operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> ListBucketsPaginator(const Model::ListBucketsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{*static_cast(this), + request}; } /** * Create a paginator for ListDirectoryBuckets operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> ListDirectoryBucketsPaginator(const Model::ListDirectoryBucketsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } /** * Create a paginator for ListObjectsV2 operation */ - Aws::Utils::Pagination::PagePaginator + Aws::Utils::Pagination::Paginator> ListObjectsV2Paginator(const Model::ListObjectsV2Request& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + return Aws::Utils::Pagination::Paginator>{*static_cast(this), + request}; } /** * Create a paginator for ListParts operation */ - Aws::Utils::Pagination::PagePaginator ListPartsPaginator( - const Model::ListPartsRequest& request) { - return Aws::Utils::Pagination::PagePaginator{ - std::shared_ptr(static_cast(this), [](DerivedClient*) {}), request}; + Aws::Utils::Pagination::Paginator> + ListPartsPaginator(const Model::ListPartsRequest& request) { + return Aws::Utils::Pagination::Paginator>{ + *static_cast(this), request}; } }; } // namespace S3 diff --git a/generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListBucketsPaginationTraits.h b/generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListBucketsPaginationTraits.h index 272aabe4e831..72b61a8bee02 100644 --- a/generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListBucketsPaginationTraits.h +++ b/generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListBucketsPaginationTraits.h @@ -11,19 +11,16 @@ namespace Aws { namespace S3 { -class S3Client; namespace Pagination { +template struct ListBucketsPaginationTraits { using RequestType = Model::ListBucketsRequest; using ResultType = Model::ListBucketsResult; using OutcomeType = Model::ListBucketsOutcome; - using ClientType = S3Client; + using ClientType = Client; - template - static OutcomeType Invoke(Client& client, const RequestType& request) { - return client.ListBuckets(request); - } + static OutcomeType Invoke(Client& client, const RequestType& request) { return client.ListBuckets(request); } static bool HasMoreResults(const ResultType& result) { return !result.GetContinuationToken().empty(); } diff --git a/generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListDirectoryBucketsPaginationTraits.h b/generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListDirectoryBucketsPaginationTraits.h index 558e26aa71c8..180ccb8c4582 100644 --- a/generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListDirectoryBucketsPaginationTraits.h +++ b/generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListDirectoryBucketsPaginationTraits.h @@ -11,19 +11,16 @@ namespace Aws { namespace S3 { -class S3Client; namespace Pagination { +template struct ListDirectoryBucketsPaginationTraits { using RequestType = Model::ListDirectoryBucketsRequest; using ResultType = Model::ListDirectoryBucketsResult; using OutcomeType = Model::ListDirectoryBucketsOutcome; - using ClientType = S3Client; + using ClientType = Client; - template - static OutcomeType Invoke(Client& client, const RequestType& request) { - return client.ListDirectoryBuckets(request); - } + static OutcomeType Invoke(Client& client, const RequestType& request) { return client.ListDirectoryBuckets(request); } static bool HasMoreResults(const ResultType& result) { return !result.GetContinuationToken().empty(); } diff --git a/generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListObjectsV2PaginationTraits.h b/generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListObjectsV2PaginationTraits.h index a8968e1a0d03..e06a96f64371 100644 --- a/generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListObjectsV2PaginationTraits.h +++ b/generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListObjectsV2PaginationTraits.h @@ -11,19 +11,16 @@ namespace Aws { namespace S3 { -class S3Client; namespace Pagination { +template struct ListObjectsV2PaginationTraits { using RequestType = Model::ListObjectsV2Request; using ResultType = Model::ListObjectsV2Result; using OutcomeType = Model::ListObjectsV2Outcome; - using ClientType = S3Client; + using ClientType = Client; - template - static OutcomeType Invoke(Client& client, const RequestType& request) { - return client.ListObjectsV2(request); - } + static OutcomeType Invoke(Client& client, const RequestType& request) { return client.ListObjectsV2(request); } static bool HasMoreResults(const ResultType& result) { return !result.GetNextContinuationToken().empty(); } diff --git a/generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListPartsPaginationTraits.h b/generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListPartsPaginationTraits.h index 78ce1d6b4b1f..2bda2cfde5d9 100644 --- a/generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListPartsPaginationTraits.h +++ b/generated/src/aws-cpp-sdk-s3/include/aws/s3/model/ListPartsPaginationTraits.h @@ -11,19 +11,16 @@ namespace Aws { namespace S3 { -class S3Client; namespace Pagination { +template struct ListPartsPaginationTraits { using RequestType = Model::ListPartsRequest; using ResultType = Model::ListPartsResult; using OutcomeType = Model::ListPartsOutcome; - using ClientType = S3Client; + using ClientType = Client; - template - static OutcomeType Invoke(Client& client, const RequestType& request) { - return client.ListParts(request); - } + static OutcomeType Invoke(Client& client, const RequestType& request) { return client.ListParts(request); } static bool HasMoreResults(const ResultType& result) { return result.GetNextPartNumberMarker() != 0; } diff --git a/src/aws-cpp-sdk-core/include/aws/core/utils/pagination/Paginator.h b/src/aws-cpp-sdk-core/include/aws/core/utils/pagination/Paginator.h index fe671c26d7af..c188d418a391 100644 --- a/src/aws-cpp-sdk-core/include/aws/core/utils/pagination/Paginator.h +++ b/src/aws-cpp-sdk-core/include/aws/core/utils/pagination/Paginator.h @@ -17,7 +17,7 @@ namespace Pagination { template -class PagePaginator +class Paginator { private: struct EndSentinel {}; @@ -25,7 +25,7 @@ class PagePaginator using OutcomeType = typename OperationTraits::OutcomeType; using ResultType = typename OperationTraits::ResultType; - class PageIterator + class Iterator { public: using iterator_category = std::input_iterator_tag; @@ -34,15 +34,15 @@ class PagePaginator using pointer = const OutcomeType*; using reference = const OutcomeType&; - PageIterator(std::shared_ptr client, const OperationRequest& firstReq) + Iterator(ServiceClient& client, const OperationRequest& firstReq) : m_client(client), m_request(firstReq), - m_currentOutcome{OperationTraits::Invoke(*m_client, m_request)} + m_currentOutcome{OperationTraits::Invoke(m_client, m_request)} {} const OutcomeType& operator*() const { return m_currentOutcome; } - PageIterator& operator++() + Iterator& operator++() { if (m_atEnd) return *this; @@ -59,40 +59,40 @@ class PagePaginator } OperationTraits::SetNextRequest(m_currentOutcome.GetResult(), m_request); - FetchPage(); + Fetch(); return *this; } - friend bool operator==(const PageIterator& lhs, const EndSentinel&) { + friend bool operator==(const Iterator& lhs, const EndSentinel&) { return lhs.m_atEnd; } - friend bool operator!=(const PageIterator& lhs, const EndSentinel& rhs) { + friend bool operator!=(const Iterator& lhs, const EndSentinel& rhs) { return !(lhs == rhs); } private: - void FetchPage() + void Fetch() { - m_currentOutcome = OperationTraits::Invoke(*m_client, m_request); + m_currentOutcome = OperationTraits::Invoke(m_client, m_request); } - std::shared_ptr m_client; + ServiceClient& m_client; OperationRequest m_request{}; OutcomeType m_currentOutcome{}; bool m_atEnd{false}; }; - PagePaginator(std::shared_ptr client, const OperationRequest& firstReq) + Paginator(ServiceClient& client, const OperationRequest& firstReq) : m_client(client), m_firstRequest(firstReq) {} - PageIterator begin() const { return PageIterator(m_client, m_firstRequest); } + Iterator begin() const { return Iterator(m_client, m_firstRequest); } EndSentinel end() const { return EndSentinel{}; } private: - std::shared_ptr m_client; + ServiceClient& m_client; OperationRequest m_firstRequest{}; }; diff --git a/tests/aws-cpp-sdk-core-tests/utils/pagination/PaginatorTest.cpp b/tests/aws-cpp-sdk-core-tests/utils/pagination/PaginatorTest.cpp index 7bf1a3591ff7..b94e0ae47400 100644 --- a/tests/aws-cpp-sdk-core-tests/utils/pagination/PaginatorTest.cpp +++ b/tests/aws-cpp-sdk-core-tests/utils/pagination/PaginatorTest.cpp @@ -129,8 +129,7 @@ class PaginatorTest : public Aws::Testing::AwsCppSdkGTestSuite TEST_F(PaginatorTest, TestIteratesThroughAllPages) { - auto clientPtr = std::make_shared(client); - PagePaginator paginator(clientPtr, request); + Paginator paginator(client, request); Aws::Vector allItems; int pageCount = 0; @@ -160,8 +159,7 @@ TEST_F(PaginatorTest, TestIteratesThroughAllPages) TEST_F(PaginatorTest, TestHandlesErrorGracefully) { client.SetShouldFail(true); - auto clientPtr = std::make_shared(client); - PagePaginator paginator(clientPtr, request); + Paginator paginator(client, request); auto it = paginator.begin(); ASSERT_TRUE(it != paginator.end()); @@ -177,8 +175,7 @@ TEST_F(PaginatorTest, TestHandlesErrorGracefully) TEST_F(PaginatorTest, TestEmptyResultSet) { client.SetData({}); - auto clientPtr = std::make_shared(client); - PagePaginator paginator(clientPtr, request); + Paginator paginator(client, request); auto it = paginator.begin(); ASSERT_TRUE(it != paginator.end()); @@ -194,8 +191,7 @@ TEST_F(PaginatorTest, TestEmptyResultSet) TEST_F(PaginatorTest, TestBeginEndIteratorComparison) { - auto clientPtr = std::make_shared(client); - PagePaginator paginator(clientPtr, request); + Paginator paginator(client, request); auto begin = paginator.begin(); auto end = paginator.end(); @@ -213,8 +209,7 @@ TEST_F(PaginatorTest, TestBeginEndIteratorComparison) TEST_F(PaginatorTest, TestHandlesErrorOnSecondPage) { client.SetFailOnPage(1); // Fail on second page (0-indexed) - auto clientPtr = std::make_shared(client); - PagePaginator paginator(clientPtr, request); + Paginator paginator(client, request); auto it = paginator.begin(); diff --git a/tests/aws-cpp-sdk-dynamodb-integration-tests/ScanPaginationIntegrationTest.cpp b/tests/aws-cpp-sdk-dynamodb-integration-tests/ScanPaginationIntegrationTest.cpp index 97fb11767b3f..2b16f455b4ee 100644 --- a/tests/aws-cpp-sdk-dynamodb-integration-tests/ScanPaginationIntegrationTest.cpp +++ b/tests/aws-cpp-sdk-dynamodb-integration-tests/ScanPaginationIntegrationTest.cpp @@ -24,7 +24,6 @@ using namespace Aws::DynamoDB; using namespace Aws::DynamoDB::Model; namespace { - static const char* ALLOCATION_TAG = "ScanPaginationTest"; const size_t ITEM_COUNT = 19; const Aws::String HASH_KEY_NAME = "id"; const Aws::String ATTRIBUTE_FOO = "attribute_foo"; @@ -32,11 +31,10 @@ namespace { class ScanPaginationTest : public Aws::Testing::AwsCppSdkGTestSuite { protected: - std::shared_ptr dynamoClient; + DynamoDBClient dynamoClient; Aws::String tableName; void SetUp() override { - dynamoClient = Aws::MakeShared(ALLOCATION_TAG); tableName = CalculateTableName("scan-paginator-test"); CreateTable(); @@ -46,7 +44,7 @@ class ScanPaginationTest : public Aws::Testing::AwsCppSdkGTestSuite { void TearDown() override { DeleteTableRequest deleteRequest; deleteRequest.SetTableName(tableName); - dynamoClient->DeleteTable(deleteRequest); + dynamoClient.DeleteTable(deleteRequest); } Aws::String CalculateTableName(const Aws::String& tablePrefix) { @@ -72,7 +70,7 @@ class ScanPaginationTest : public Aws::Testing::AwsCppSdkGTestSuite { throughput.SetWriteCapacityUnits(5); createRequest.SetProvisionedThroughput(throughput); - auto outcome = dynamoClient->CreateTable(createRequest); + auto outcome = dynamoClient.CreateTable(createRequest); AWS_ASSERT_SUCCESS(outcome); WaitUntilActive(tableName); @@ -82,10 +80,10 @@ class ScanPaginationTest : public Aws::Testing::AwsCppSdkGTestSuite { DescribeTableRequest describeTableRequest; describeTableRequest.SetTableName(tableNameParam); - DescribeTableOutcome outcome = dynamoClient->DescribeTable(describeTableRequest); + DescribeTableOutcome outcome = dynamoClient.DescribeTable(describeTableRequest); while (outcome.IsSuccess() && outcome.GetResult().GetTable().GetTableStatus() != TableStatus::ACTIVE) { std::this_thread::sleep_for(std::chrono::seconds(1)); - outcome = dynamoClient->DescribeTable(describeTableRequest); + outcome = dynamoClient.DescribeTable(describeTableRequest); } return outcome.GetResult(); @@ -101,7 +99,7 @@ class ScanPaginationTest : public Aws::Testing::AwsCppSdkGTestSuite { item[ATTRIBUTE_FOO] = AttributeValue().SetN(Aws::Utils::StringUtils::to_string(i * 2)); putRequest.SetItem(item); - auto outcome = dynamoClient->PutItem(putRequest); + auto outcome = dynamoClient.PutItem(putRequest); ASSERT_TRUE(outcome.IsSuccess()); } } @@ -113,7 +111,7 @@ TEST_F(ScanPaginationTest, TestPaginationTraits) { request.SetLimit(1); // Force pagination size_t pageCount = 0; - auto paginator = dynamoClient->ScanPaginator(request); + auto paginator = dynamoClient.ScanPaginator(request); for (auto pageIter = paginator.begin(); pageIter != paginator.end(); ++pageIter) { const auto& outcome = *pageIter; diff --git a/tests/aws-cpp-sdk-ec2-integration-tests/EC2PaginationIntegrationTest.cpp b/tests/aws-cpp-sdk-ec2-integration-tests/EC2PaginationIntegrationTest.cpp index ac15fa287ffb..70864ae7f618 100644 --- a/tests/aws-cpp-sdk-ec2-integration-tests/EC2PaginationIntegrationTest.cpp +++ b/tests/aws-cpp-sdk-ec2-integration-tests/EC2PaginationIntegrationTest.cpp @@ -14,20 +14,9 @@ using namespace Aws; using namespace Aws::EC2; using namespace Aws::EC2::Model; -namespace { - static const char* ALLOCATION_TAG = "EC2PaginationTest"; -} - class EC2PaginationTest : public Aws::Testing::AwsCppSdkGTestSuite { protected: - std::shared_ptr ec2Client; - - void SetUp() override { - ec2Client = Aws::MakeShared(ALLOCATION_TAG); - } - - void TearDown() override { - } + EC2Client ec2Client; }; TEST_F(EC2PaginationTest, TestPaginationTraits) { @@ -38,7 +27,7 @@ TEST_F(EC2PaginationTest, TestPaginationTraits) { request.SetMaxResults(1); // Force pagination size_t pageCount = 0; - auto paginator = ec2Client->DescribeSpotPriceHistoryPaginator(request); + auto paginator = ec2Client.DescribeSpotPriceHistoryPaginator(request); for (auto pageIter = paginator.begin(); pageIter != paginator.end(); ++pageIter) { const auto& outcome = *pageIter; diff --git a/tests/aws-cpp-sdk-s3-integration-tests/ListObjectsV2PaginationIntegrationTest.cpp b/tests/aws-cpp-sdk-s3-integration-tests/ListObjectsV2PaginationIntegrationTest.cpp index 8a0711a7494e..9443dfe3778f 100644 --- a/tests/aws-cpp-sdk-s3-integration-tests/ListObjectsV2PaginationIntegrationTest.cpp +++ b/tests/aws-cpp-sdk-s3-integration-tests/ListObjectsV2PaginationIntegrationTest.cpp @@ -34,13 +34,13 @@ namespace { class ListObjectsV2PaginationTest : public Aws::Testing::AwsCppSdkGTestSuite { protected: - std::shared_ptr Client; + S3Client Client; Aws::String bucketName; void SetUp() override { Aws::Client::ClientConfiguration config; config.region = Aws::Region::US_EAST_1; - Client = Aws::MakeShared(ALLOCATION_TAG, config); + Client = S3Client(config); bucketName = CalculateBucketName("listobjectsv2paginationtest"); @@ -48,7 +48,7 @@ class ListObjectsV2PaginationTest : public Aws::Testing::AwsCppSdkGTestSuite { CreateBucketRequest createRequest; createRequest.SetBucket(bucketName); createRequest.SetACL(BucketCannedACL::private_); - auto createOutcome = Client->CreateBucket(createRequest); + auto createOutcome = Client.CreateBucket(createRequest); AWS_ASSERT_SUCCESS(createOutcome); ASSERT_TRUE(WaitForBucketToPropagate()); @@ -61,14 +61,13 @@ class ListObjectsV2PaginationTest : public Aws::Testing::AwsCppSdkGTestSuite { } void TearDown() override { - if (Client && !bucketName.empty()) { + if (!bucketName.empty()) { EmptyBucket(); DeleteBucketRequest deleteRequest; deleteRequest.SetBucket(bucketName); - Client->DeleteBucket(deleteRequest); + Client.DeleteBucket(deleteRequest); } - Client = nullptr; } bool WaitForBucketToPropagate() { @@ -76,7 +75,7 @@ class ListObjectsV2PaginationTest : public Aws::Testing::AwsCppSdkGTestSuite { while (timeoutCount++ < TIMEOUT_MAX) { ListObjectsV2Request listRequest; listRequest.SetBucket(bucketName); - auto listOutcome = Client->ListObjectsV2(listRequest); + auto listOutcome = Client.ListObjectsV2(listRequest); if (listOutcome.IsSuccess()) { return true; } @@ -94,7 +93,7 @@ class ListObjectsV2PaginationTest : public Aws::Testing::AwsCppSdkGTestSuite { Tagging tagging; tagging.AddTagSet(tag); taggingRequest.SetTagging(tagging); - Client->PutBucketTagging(taggingRequest); + Client.PutBucketTagging(taggingRequest); } void CreateTestObject(const Aws::String& key) { @@ -106,20 +105,20 @@ class ListObjectsV2PaginationTest : public Aws::Testing::AwsCppSdkGTestSuite { *data << "Test data for " << key; putRequest.SetBody(data); - Client->PutObject(putRequest); + Client.PutObject(putRequest); } void EmptyBucket() { ListObjectsV2Request listRequest; listRequest.SetBucket(bucketName); - auto listOutcome = Client->ListObjectsV2(listRequest); + auto listOutcome = Client.ListObjectsV2(listRequest); if (listOutcome.IsSuccess()) { for (const auto& object : listOutcome.GetResult().GetContents()) { DeleteObjectRequest deleteRequest; deleteRequest.SetBucket(bucketName); deleteRequest.SetKey(object.GetKey()); - Client->DeleteObject(deleteRequest); + Client.DeleteObject(deleteRequest); } } } @@ -131,7 +130,7 @@ TEST_F(ListObjectsV2PaginationTest, TestPaginationTraits) { request.SetMaxKeys(1); // Force pagination size_t pageCount = 0; - auto paginator = Client->ListObjectsV2Paginator(request); + auto paginator = Client.ListObjectsV2Paginator(request); for (auto pageIter = paginator.begin(); pageIter != paginator.end(); ++pageIter) { const auto& outcome = *pageIter; @@ -140,20 +139,4 @@ TEST_F(ListObjectsV2PaginationTest, TestPaginationTraits) { } EXPECT_GT(pageCount, 1u); // Should have multiple pages with MaxKeys=1 -} - -TEST_F(ListObjectsV2PaginationTest, TestPaginationOnEmptyBucket) { - // Empty the bucket first - EmptyBucket(); - - ListObjectsV2Request emptyRequest; - emptyRequest.SetBucket(bucketName); - emptyRequest.SetMaxKeys(1); - - auto emptyOutcome = Client->ListObjectsV2(emptyRequest); - AWS_ASSERT_SUCCESS(emptyOutcome); - - const auto& emptyResult = emptyOutcome.GetResult(); - EXPECT_EQ(0u, emptyResult.GetContents().size()); - EXPECT_FALSE(Aws::S3::Pagination::ListObjectsV2PaginationTraits::HasMoreResults(emptyResult)); } \ No newline at end of file diff --git a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ClientCodegenSettings.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ClientCodegenSettings.java deleted file mode 100644 index f992d3b76df1..000000000000 --- a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ClientCodegenSettings.java +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0. - */ -package com.amazonaws.util.awsclientsmithygenerator.generators; - -import software.amazon.smithy.model.node.ObjectNode; -import software.amazon.smithy.model.shapes.ShapeId; - -public class ClientCodegenSettings { - private final ShapeId service; - - public ClientCodegenSettings(ObjectNode settings) { - this.service = ShapeId.from(settings.expectStringMember("service").getValue()); - } - - public ShapeId getService() { - return service; - } -} \ No newline at end of file diff --git a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ShapeUtil.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ShapeUtil.java index cc9ea2b0ecff..1cdfd4c3cd26 100644 --- a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ShapeUtil.java +++ b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/ShapeUtil.java @@ -77,18 +77,6 @@ public class ShapeUtil { "s3-crt", Map.of("ListParts", Set.of("NextPartNumberMarker")) ); - /** - * Returns all shapes referenced by a root shape, recursively. - */ - public static Set getReferences(Model model, Shape root) { - Set refs = new HashSet<>(); - refs.add(root); - for (var member : root.members()) { - refs.addAll(getReferences(model, model.expectShape(member.getTarget()))); - } - return refs; - } - /** * Gets the operation method name with legacy version suffix if required. * diff --git a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationBaseGenerator.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationBaseGenerator.java index 2d485ccfa065..2982510f9015 100644 --- a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationBaseGenerator.java +++ b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationBaseGenerator.java @@ -61,12 +61,12 @@ protected void writeSpecificContent(CppWriter writer, String serviceName) { .write(" * Create a paginator for " + opName + " operation") .write(" */"); - writer.write("Aws::Utils::Pagination::PagePaginator") + writer.write("Aws::Utils::Pagination::Paginator>") .write(opName + "Paginator(const Model::" + methodName + "Request& request)"); writer.openBlock("{", "}", () -> { - writer.write("return Aws::Utils::Pagination::PagePaginator{") - .write(" std::shared_ptr(static_cast(this), [](DerivedClient*){}), request};"); + writer.write("return Aws::Utils::Pagination::Paginator>{") + .write(" *static_cast(this), request};"); }); } } diff --git a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationClientHeaderGenerator.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationClientHeaderGenerator.java index 2fbf36c20f30..a18c63b1e284 100644 --- a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationClientHeaderGenerator.java +++ b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationClientHeaderGenerator.java @@ -40,8 +40,8 @@ protected void writeSpecificContent(CppWriter writer, String serviceName) { for (OperationData data : operations) { String opName = data.getOperation().getId().getName(); String methodName = ShapeUtil.getOperationMethodName(opName, smithyServiceName); - writer.write("using $LPaginator = Aws::Utils::Pagination::PagePaginator<$LClient, Model::$LRequest, Pagination::$LPaginationTraits>;", - opName, classPrefix, methodName, opName); + writer.write("using $LPaginator = Aws::Utils::Pagination::Paginator<$LClient, Model::$LRequest, Pagination::$LPaginationTraits<$LClient>>;", + opName, classPrefix, methodName, opName, classPrefix); } writer.write(""); } diff --git a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationCodegenPlugin.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationCodegenPlugin.java index a33ac367ab24..e3d5cfdbffeb 100644 --- a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationCodegenPlugin.java +++ b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationCodegenPlugin.java @@ -2,14 +2,16 @@ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0. */ -package com.amazonaws.util.awsclientsmithygenerator.generators; +package com.amazonaws.util.awsclientsmithygenerator.generators.pagination; import software.amazon.smithy.build.PluginContext; import software.amazon.smithy.build.SmithyBuildPlugin; import software.amazon.smithy.model.knowledge.TopDownIndex; import software.amazon.smithy.model.traits.PaginatedTrait; import software.amazon.smithy.model.traits.DeprecatedTrait; -import software.amazon.smithy.model.shapes.*; +import software.amazon.smithy.model.shapes.ServiceShape; +import software.amazon.smithy.model.shapes.OperationShape; +import com.amazonaws.util.awsclientsmithygenerator.generators.ServiceNameUtil; import com.amazonaws.util.awsclientsmithygenerator.generators.OperationData; import com.amazonaws.util.awsclientsmithygenerator.generators.FeatureParser; import com.amazonaws.util.awsclientsmithygenerator.generators.pagination.PaginationTraitsGenerator; @@ -20,9 +22,6 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; public class PaginationCodegenPlugin implements SmithyBuildPlugin { diff --git a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationTraitsGenerator.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationTraitsGenerator.java index 686ad0b5592d..43bd669c3d44 100644 --- a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationTraitsGenerator.java +++ b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationTraitsGenerator.java @@ -13,6 +13,7 @@ import com.amazonaws.util.awsclientsmithygenerator.generators.ServiceNameUtil; import com.amazonaws.util.awsclientsmithygenerator.generators.ShapeUtil; import java.util.List; +import java.util.Optional; public class PaginationTraitsGenerator extends BaseTraitsGenerator> { @@ -47,22 +48,20 @@ protected void generateOperationContent(CppWriter writer, OperationData { + writer.openBlock("template\nstruct " + opName + "PaginationTraits\n{", "};", () -> { // Use detected suffix to match C2J renameShape logic writer.write(" using RequestType = Model::$LRequest;", methodName) .write(" using ResultType = Model::$L$L;", methodName, resultSuffix) .write(" using OutcomeType = Model::$LOutcome;", methodName) - .write(" using ClientType = $LClient;", capitalizedServiceName) + .write(" using ClientType = Client;") .write(""); - // Invoke method - template to defer instantiation - writer.write(" template") - .openBlock(" static OutcomeType Invoke(Client& client, const RequestType& request)\n {", " }", () -> { + // Invoke method - no template needed since struct is templated + writer.openBlock(" static OutcomeType Invoke(Client& client, const RequestType& request)\n {", " }", () -> { writer.write(" return client.$L(request);", methodName); }); @@ -141,39 +140,41 @@ else if (ShapeUtil.hasTopLevelMember(context.getModel(), op, outToken)) { } private void generateSetNextRequestLogic(CppWriter writer, PaginatedTrait trait, OperationShape op) { - String inToken = null; - String outToken = null; + Optional inToken = Optional.empty(); + Optional outToken = Optional.empty(); if (trait.getInputToken().isPresent() && trait.getOutputToken().isPresent()) { - inToken = trait.getInputToken().get(); - outToken = trait.getOutputToken().get(); + inToken = trait.getInputToken(); + outToken = trait.getOutputToken(); } else { // Fallback to service-level pagination configuration - String serviceLevelInputToken = ShapeUtil.getServiceLevelToken(service, software.amazon.smithy.model.traits.PaginatedTrait.class, t -> t.getInputToken()); - String serviceLevelOutputToken = ShapeUtil.getServiceLevelToken(service, software.amazon.smithy.model.traits.PaginatedTrait.class, t -> t.getOutputToken()); - if (serviceLevelInputToken != null && serviceLevelOutputToken != null) { + Optional serviceLevelInputToken = Optional.ofNullable(ShapeUtil.getServiceLevelToken(service, software.amazon.smithy.model.traits.PaginatedTrait.class, t -> t.getInputToken())); + Optional serviceLevelOutputToken = Optional.ofNullable(ShapeUtil.getServiceLevelToken(service, software.amazon.smithy.model.traits.PaginatedTrait.class, t -> t.getOutputToken())); + if (serviceLevelInputToken.isPresent() && serviceLevelOutputToken.isPresent()) { inToken = serviceLevelInputToken; outToken = serviceLevelOutputToken; } } - if (inToken != null && outToken != null) { + if (inToken.isPresent() && outToken.isPresent()) { + String inTokenValue = inToken.get(); + String outTokenValue = outToken.get(); // Pattern A: Explicit nested token like "EngineDefaults.Marker" - if (outToken.contains(".")) { - String[] parts = outToken.split("\\.", 2); + if (outTokenValue.contains(".")) { + String[] parts = outTokenValue.split("\\.", 2); String memberName = parts[0]; String nestedTokenName = parts[1]; - writer.write(" request.Set$L(result.Get$L().Get$L());", ServiceNameUtil.capitalize(inToken), ServiceNameUtil.capitalize(memberName), ServiceNameUtil.capitalize(nestedTokenName)); + writer.write(" request.Set$L(result.Get$L().Get$L());", ServiceNameUtil.capitalize(inTokenValue), ServiceNameUtil.capitalize(memberName), ServiceNameUtil.capitalize(nestedTokenName)); } // Pattern B: Check if token is on top-level output - else if (ShapeUtil.hasTopLevelMember(context.getModel(), op, outToken)) { - writer.write(" request.Set$L(result.Get$L());", ServiceNameUtil.capitalize(inToken), ServiceNameUtil.capitalize(outToken)); + else if (ShapeUtil.hasTopLevelMember(context.getModel(), op, outTokenValue)) { + writer.write(" request.Set$L(result.Get$L());", ServiceNameUtil.capitalize(inTokenValue), ServiceNameUtil.capitalize(outTokenValue)); } // Pattern C: Find wrapper member containing the token else { - String wrapperMember = ShapeUtil.findWrapperMemberContainingToken(context.getModel(), op, outToken); + String wrapperMember = ShapeUtil.findWrapperMemberContainingToken(context.getModel(), op, outTokenValue); if (wrapperMember != null) { - writer.write(" request.Set$L(result.Get$L().Get$L());", ServiceNameUtil.capitalize(inToken), ServiceNameUtil.capitalize(wrapperMember), ServiceNameUtil.capitalize(outToken)); + writer.write(" request.Set$L(result.Get$L().Get$L());", ServiceNameUtil.capitalize(inTokenValue), ServiceNameUtil.capitalize(wrapperMember), ServiceNameUtil.capitalize(outTokenValue)); } else { writer.write(" (void)result; (void)request; // Token not found"); } diff --git a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/resources/META-INF/services/software.amazon.smithy.build.SmithyBuildPlugin b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/resources/META-INF/services/software.amazon.smithy.build.SmithyBuildPlugin index f4e064860447..d1ade5942e3d 100644 --- a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/resources/META-INF/services/software.amazon.smithy.build.SmithyBuildPlugin +++ b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/resources/META-INF/services/software.amazon.smithy.build.SmithyBuildPlugin @@ -1 +1 @@ -com.amazonaws.util.awsclientsmithygenerator.generators.PaginationCodegenPlugin +com.amazonaws.util.awsclientsmithygenerator.generators.pagination.PaginationCodegenPlugin From 36169958b7e35b2ee0dad94493b91a812dd51b26 Mon Sep 17 00:00:00 2001 From: kai lin Date: Tue, 10 Feb 2026 14:35:12 -0500 Subject: [PATCH 5/5] Refactor generateHasMoreResultsLogic --- .../pagination/PaginationTraitsGenerator.java | 127 +++++++++++------- 1 file changed, 77 insertions(+), 50 deletions(-) diff --git a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationTraitsGenerator.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationTraitsGenerator.java index 43bd669c3d44..45ab4b2d003f 100644 --- a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationTraitsGenerator.java +++ b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationTraitsGenerator.java @@ -86,56 +86,83 @@ protected void generateOperationContent(CppWriter writer, OperationData outToken = trait.getOutputToken() + .or(() -> Optional.ofNullable(ShapeUtil.getServiceLevelToken(service, + software.amazon.smithy.model.traits.PaginatedTrait.class, t -> t.getOutputToken()))); + + if (outToken.isEmpty()) { + writer.write(" return result.GetIsTruncated();"); + return; + } + + String token = outToken.get(); + List resolvers = List.of( + // Pattern A: Nested token + new TokenResolver() { + public boolean canResolve(String token, OperationShape op) { return token.contains("."); } + public void writeLogic(CppWriter writer, String token, OperationShape op) { + String[] parts = token.split("\\.", 2); + boolean isNumeric = ShapeUtil.isNumericToken(context.getModel(), op, smithyServiceName, parts[0], parts[1]); + writeResultLogic(writer, Optional.of(ServiceNameUtil.capitalize(parts[0])), + ServiceNameUtil.capitalize(parts[1]), isNumeric); } - } - // Pattern B: Check if token is on top-level output - else if (ShapeUtil.hasTopLevelMember(context.getModel(), op, outToken)) { - if (ShapeUtil.isNumericToken(context.getModel(), op, smithyServiceName, null, outToken)) { - writer.write(" return result.Get$L() != 0;", ServiceNameUtil.capitalize(outToken)); - } else { - writer.write(" return !result.Get$L().empty();", ServiceNameUtil.capitalize(outToken)); + }, + // Pattern B: Top-level token + new TokenResolver() { + public boolean canResolve(String token, OperationShape op) { + return ShapeUtil.hasTopLevelMember(context.getModel(), op, token); } - } - // Pattern C: Find wrapper member containing the token - else { - String wrapperMember = ShapeUtil.findWrapperMemberContainingToken(context.getModel(), op, outToken); - if (wrapperMember != null) { - if (ShapeUtil.isNumericToken(context.getModel(), op, smithyServiceName, wrapperMember, outToken)) { - writer.write(" return result.Get$L().Get$L() != 0;", ServiceNameUtil.capitalize(wrapperMember), ServiceNameUtil.capitalize(outToken)); - } else { - writer.write(" return !result.Get$L().Get$L().empty();", ServiceNameUtil.capitalize(wrapperMember), ServiceNameUtil.capitalize(outToken)); - } - } else if (ShapeUtil.hasTopLevelMember(context.getModel(), op, "IsTruncated")) { - writer.write(" return result.GetIsTruncated();"); - } else { - writer.write(" return false;"); + public void writeLogic(CppWriter writer, String token, OperationShape op) { + boolean isNumeric = ShapeUtil.isNumericToken(context.getModel(), op, smithyServiceName, null, token); + writeResultLogic(writer, Optional.empty(), ServiceNameUtil.capitalize(token), isNumeric); } - } - } else { - // Fallback to service-level pagination configuration - String serviceLevelOutputToken = ShapeUtil.getServiceLevelToken(service, software.amazon.smithy.model.traits.PaginatedTrait.class, t -> t.getOutputToken()); - if (serviceLevelOutputToken != null) { - if (ShapeUtil.isNumericToken(context.getModel(), op, smithyServiceName, null, serviceLevelOutputToken)) { - writer.write(" return result.Get$L() != 0;", ServiceNameUtil.capitalize(serviceLevelOutputToken)); - } else { - writer.write(" return !result.Get$L().empty();", ServiceNameUtil.capitalize(serviceLevelOutputToken)); + }, + // Pattern C: Wrapped token + new TokenResolver() { + public boolean canResolve(String token, OperationShape op) { + return Optional.ofNullable(ShapeUtil.findWrapperMemberContainingToken(context.getModel(), op, token)).isPresent(); + } + public void writeLogic(CppWriter writer, String token, OperationShape op) { + Optional.ofNullable(ShapeUtil.findWrapperMemberContainingToken(context.getModel(), op, token)) + .ifPresent(wrapper -> { + boolean isNumeric = ShapeUtil.isNumericToken(context.getModel(), op, smithyServiceName, wrapper, token); + writeResultLogic(writer, Optional.of(ServiceNameUtil.capitalize(wrapper)), + ServiceNameUtil.capitalize(token), isNumeric); + }); } - } else { - writer.write(" return result.GetIsTruncated();"); } + ); + + for (TokenResolver resolver : resolvers) { + if (resolver.canResolve(token, op)) { + resolver.writeLogic(writer, token, op); + return; + } + } + + // Fallback + if (ShapeUtil.hasTopLevelMember(context.getModel(), op, "IsTruncated")) { + writer.write(" return result.GetIsTruncated();"); + } else { + writer.write(" return false;"); + } + } + + private void writeResultLogic(CppWriter writer, Optional wrapperMember, String tokenName, boolean isNumeric) { + String getter = wrapperMember.isPresent() ? "result.Get$L().Get$L()" : "result.Get$L()"; + String condition = isNumeric ? " != 0" : ".empty()"; + String prefix = isNumeric ? "" : "!"; + + if (wrapperMember.isPresent()) { + writer.write(" return " + prefix + getter + condition + ";", wrapperMember.get(), tokenName); + } else { + writer.write(" return " + prefix + getter + condition + ";", tokenName); } } @@ -172,12 +199,12 @@ else if (ShapeUtil.hasTopLevelMember(context.getModel(), op, outTokenValue)) { } // Pattern C: Find wrapper member containing the token else { - String wrapperMember = ShapeUtil.findWrapperMemberContainingToken(context.getModel(), op, outTokenValue); - if (wrapperMember != null) { - writer.write(" request.Set$L(result.Get$L().Get$L());", ServiceNameUtil.capitalize(inTokenValue), ServiceNameUtil.capitalize(wrapperMember), ServiceNameUtil.capitalize(outTokenValue)); - } else { - writer.write(" (void)result; (void)request; // Token not found"); - } + Optional.ofNullable(ShapeUtil.findWrapperMemberContainingToken(context.getModel(), op, outTokenValue)) + .ifPresentOrElse( + wrapperMember -> writer.write(" request.Set$L(result.Get$L().Get$L());", + ServiceNameUtil.capitalize(inTokenValue), ServiceNameUtil.capitalize(wrapperMember), ServiceNameUtil.capitalize(outTokenValue)), + () -> writer.write(" (void)result; (void)request; // Token not found") + ); } } else { writer.write(" (void)result; (void)request; // Unused parameters");