Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Adds AWSPaginator attribute to methods in Paginator Factory interface that PowerShell consumes #3726

Open
wants to merge 6 commits into
base: main-staging
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"core": {
"changeLogMessages": [
"Added pagination attribute for Paginator methods"
],
"type": "patch",
"updateMinimum": true
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ namespace ServiceClientGenerator.Generators.SourceFiles
/// Class to produce the template output
/// </summary>

#line 1 "C:\codebase\v3\AWSDotNetPublic\generator\ServiceClientGeneratorLib\Generators\SourceFiles\ServicePaginatorFactoryInterface.tt"
#line 1 "C:\git\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\ServicePaginatorFactoryInterface.tt"
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")]
public partial class ServicePaginatorFactoryInterface : BaseGenerator
{
Expand All @@ -29,37 +29,38 @@ public partial class ServicePaginatorFactoryInterface : BaseGenerator
public override string TransformText()
{

#line 6 "C:\codebase\v3\AWSDotNetPublic\generator\ServiceClientGeneratorLib\Generators\SourceFiles\ServicePaginatorFactoryInterface.tt"
#line 6 "C:\git\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\ServicePaginatorFactoryInterface.tt"

AddLicenseHeader();


#line default
#line hidden
this.Write("\r\n#pragma warning disable CS0612,CS0618\r\nnamespace ");
this.Write("using Amazon.Runtime.Internal;\r\n\r\n#pragma warning disable CS0612,CS0618\r\nnamespac" +
"e ");

#line 11 "C:\codebase\v3\AWSDotNetPublic\generator\ServiceClientGeneratorLib\Generators\SourceFiles\ServicePaginatorFactoryInterface.tt"
#line 12 "C:\git\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\ServicePaginatorFactoryInterface.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(this.Config.Namespace));

#line default
#line hidden
this.Write(".Model\r\n{\r\n /// <summary>\r\n /// Paginators for the ");

#line 14 "C:\codebase\v3\AWSDotNetPublic\generator\ServiceClientGeneratorLib\Generators\SourceFiles\ServicePaginatorFactoryInterface.tt"
#line 15 "C:\git\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\ServicePaginatorFactoryInterface.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(this.Config.ServiceNameRoot));

#line default
#line hidden
this.Write(" service\r\n ///</summary>\r\n public interface I");

#line 16 "C:\codebase\v3\AWSDotNetPublic\generator\ServiceClientGeneratorLib\Generators\SourceFiles\ServicePaginatorFactoryInterface.tt"
#line 17 "C:\git\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\ServicePaginatorFactoryInterface.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(this.Config.ServiceNameRoot));

#line default
#line hidden
this.Write("PaginatorFactory\r\n {\r\n");

#line 18 "C:\codebase\v3\AWSDotNetPublic\generator\ServiceClientGeneratorLib\Generators\SourceFiles\ServicePaginatorFactoryInterface.tt"
#line 19 "C:\git\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\ServicePaginatorFactoryInterface.tt"

foreach(var operation in this.Config.ServiceModel.Operations)
{
Expand All @@ -71,35 +72,57 @@ public override string TransformText()
#line hidden
this.Write("\r\n /// <summary>\r\n /// Paginator for ");

#line 26 "C:\codebase\v3\AWSDotNetPublic\generator\ServiceClientGeneratorLib\Generators\SourceFiles\ServicePaginatorFactoryInterface.tt"
#line 27 "C:\git\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\ServicePaginatorFactoryInterface.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(operation.Name));

#line default
#line hidden
this.Write(" operation\r\n ///</summary>\r\n I");
this.Write(" operation\r\n ///</summary>\r\n [AWSPaginator(\r\n InputToken" +
" = new[] { ");

#line 28 "C:\codebase\v3\AWSDotNetPublic\generator\ServiceClientGeneratorLib\Generators\SourceFiles\ServicePaginatorFactoryInterface.tt"
#line 30 "C:\git\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\ServicePaginatorFactoryInterface.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(string.Join(",", operation.Paginators.InputTokens.Select(x => "\"" + x.PropertyName + "\""))));

#line default
#line hidden
this.Write(" },\r\n ");

#line 31 "C:\git\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\ServicePaginatorFactoryInterface.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(operation.Paginators.LimitKey != null ? $"LimitKey = \"{operation.Paginators.LimitKey.PropertyName}\"," : ""));

#line default
#line hidden
this.Write("\r\n OutputToken = new[] { ");

#line 32 "C:\git\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\ServicePaginatorFactoryInterface.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(string.Join(",", operation.Paginators.OutputTokens.Select(x => "\"" + x.PropertyName + "\""))));

#line default
#line hidden
this.Write(" }\r\n )]\r\n I");

#line 34 "C:\git\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\ServicePaginatorFactoryInterface.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(operation.Name));

#line default
#line hidden
this.Write("Paginator ");

#line 28 "C:\codebase\v3\AWSDotNetPublic\generator\ServiceClientGeneratorLib\Generators\SourceFiles\ServicePaginatorFactoryInterface.tt"
#line 34 "C:\git\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\ServicePaginatorFactoryInterface.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(operation.Name));

#line default
#line hidden
this.Write("(");

#line 28 "C:\codebase\v3\AWSDotNetPublic\generator\ServiceClientGeneratorLib\Generators\SourceFiles\ServicePaginatorFactoryInterface.tt"
#line 34 "C:\git\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\ServicePaginatorFactoryInterface.tt"
this.Write(this.ToStringHelper.ToStringWithCulture(operation.Name));

#line default
#line hidden
this.Write("Request request);\r\n");

#line 29 "C:\codebase\v3\AWSDotNetPublic\generator\ServiceClientGeneratorLib\Generators\SourceFiles\ServicePaginatorFactoryInterface.tt"
#line 35 "C:\git\aws-sdk-net\generator\ServiceClientGeneratorLib\Generators\SourceFiles\ServicePaginatorFactoryInterface.tt"

}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
<#
AddLicenseHeader();
#>
using Amazon.Runtime.Internal;

#pragma warning disable CS0612,CS0618
namespace <#=this.Config.Namespace#>.Model
Expand All @@ -25,6 +26,11 @@ foreach(var operation in this.Config.ServiceModel.Operations)
/// <summary>
/// Paginator for <#=operation.Name#> operation
///</summary>
[AWSPaginator(
InputToken = new[] { <#= string.Join(",", operation.Paginators.InputTokens.Select(x => "\"" + x.PropertyName + "\"")) #> },
<#= operation.Paginators.LimitKey != null ? $"LimitKey = \"{operation.Paginators.LimitKey.PropertyName}\"," : "" #>
OutputToken = new[] { <#= string.Join(",", operation.Paginators.OutputTokens.Select(x => "\"" + x.PropertyName + "\"")) #> }
)]
I<#=operation.Name#>Paginator <#=operation.Name#>(<#=operation.Name#>Request request);
<#
}
Expand Down
12 changes: 12 additions & 0 deletions sdk/src/Core/Amazon.Runtime/Internal/AWSPaginatorAttribute.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System;

namespace Amazon.Runtime.Internal
{
[AttributeUsage(AttributeTargets.Method)]
public sealed class AWSPaginatorAttribute : Attribute
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not add attributes above InputToken, LimitKey and OutputToken instead of the Paginator attribute? Then you can add them to the properties themselves, this way you can select the properties you need from the pagination request/response types in PowerShell based on the attributes instead of having to select them by name.

Copy link
Contributor Author

@afroz429 afroz429 Apr 2, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not add attributes above InputToken, LimitKey and OutputToken instead of the Paginator attribute?

Can you clarify this statement?

this way you can select the properties you need from the pagination request/response types in PowerShell

A paginator property value may not match the Request or Response property. InputToken and OutputToken values in paginators model file can be a list or a single property name. Additionally OutputToken can be a JMESPath e.g "output_token": "StreamDescription.Shards[-1].ShardId". Also semantically, the paginators model is defined for operations so makes more sense to add the metadata on the Paginators methods. See https://github.com/aws/aws-models/blob/master/secretsmanager/2017-10-17/paginators-1.json

{
public string[] InputToken { get; set; }
public string LimitKey { get; set; }
public string[] OutputToken { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
/*
* Do not modify this file. This file is generated from the accessanalyzer-2019-11-01.normal.json service model.
*/
using Amazon.Runtime.Internal;

#pragma warning disable CS0612,CS0618
namespace Amazon.AccessAnalyzer.Model
Expand All @@ -29,56 +30,111 @@ public interface IAccessAnalyzerPaginatorFactory
/// <summary>
/// Paginator for GetFindingRecommendation operation
///</summary>
[AWSPaginator(
InputToken = new[] { "NextToken" },
LimitKey = "MaxResults",
OutputToken = new[] { "NextToken" }
)]
IGetFindingRecommendationPaginator GetFindingRecommendation(GetFindingRecommendationRequest request);

/// <summary>
/// Paginator for GetFindingV2 operation
///</summary>
[AWSPaginator(
InputToken = new[] { "NextToken" },
LimitKey = "MaxResults",
OutputToken = new[] { "NextToken" }
)]
IGetFindingV2Paginator GetFindingV2(GetFindingV2Request request);

/// <summary>
/// Paginator for ListAccessPreviewFindings operation
///</summary>
[AWSPaginator(
InputToken = new[] { "NextToken" },
LimitKey = "MaxResults",
OutputToken = new[] { "NextToken" }
)]
IListAccessPreviewFindingsPaginator ListAccessPreviewFindings(ListAccessPreviewFindingsRequest request);

/// <summary>
/// Paginator for ListAccessPreviews operation
///</summary>
[AWSPaginator(
InputToken = new[] { "NextToken" },
LimitKey = "MaxResults",
OutputToken = new[] { "NextToken" }
)]
IListAccessPreviewsPaginator ListAccessPreviews(ListAccessPreviewsRequest request);

/// <summary>
/// Paginator for ListAnalyzedResources operation
///</summary>
[AWSPaginator(
InputToken = new[] { "NextToken" },
LimitKey = "MaxResults",
OutputToken = new[] { "NextToken" }
)]
IListAnalyzedResourcesPaginator ListAnalyzedResources(ListAnalyzedResourcesRequest request);

/// <summary>
/// Paginator for ListAnalyzers operation
///</summary>
[AWSPaginator(
InputToken = new[] { "NextToken" },
LimitKey = "MaxResults",
OutputToken = new[] { "NextToken" }
)]
IListAnalyzersPaginator ListAnalyzers(ListAnalyzersRequest request);

/// <summary>
/// Paginator for ListArchiveRules operation
///</summary>
[AWSPaginator(
InputToken = new[] { "NextToken" },
LimitKey = "MaxResults",
OutputToken = new[] { "NextToken" }
)]
IListArchiveRulesPaginator ListArchiveRules(ListArchiveRulesRequest request);

/// <summary>
/// Paginator for ListFindings operation
///</summary>
[AWSPaginator(
InputToken = new[] { "NextToken" },
LimitKey = "MaxResults",
OutputToken = new[] { "NextToken" }
)]
IListFindingsPaginator ListFindings(ListFindingsRequest request);

/// <summary>
/// Paginator for ListFindingsV2 operation
///</summary>
[AWSPaginator(
InputToken = new[] { "NextToken" },
LimitKey = "MaxResults",
OutputToken = new[] { "NextToken" }
)]
IListFindingsV2Paginator ListFindingsV2(ListFindingsV2Request request);

/// <summary>
/// Paginator for ListPolicyGenerations operation
///</summary>
[AWSPaginator(
InputToken = new[] { "NextToken" },
LimitKey = "MaxResults",
OutputToken = new[] { "NextToken" }
)]
IListPolicyGenerationsPaginator ListPolicyGenerations(ListPolicyGenerationsRequest request);

/// <summary>
/// Paginator for ValidatePolicy operation
///</summary>
[AWSPaginator(
InputToken = new[] { "NextToken" },
LimitKey = "MaxResults",
OutputToken = new[] { "NextToken" }
)]
IValidatePolicyPaginator ValidatePolicy(ValidatePolicyRequest request);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
/*
* Do not modify this file. This file is generated from the swf-2012-01-25.normal.json service model.
*/
using Amazon.Runtime.Internal;

#pragma warning disable CS0612,CS0618
namespace Amazon.SimpleWorkflow.Model
Expand All @@ -29,36 +30,71 @@ public interface ISimpleWorkflowPaginatorFactory
/// <summary>
/// Paginator for GetWorkflowExecutionHistory operation
///</summary>
[AWSPaginator(
InputToken = new[] { "NextPageToken" },
LimitKey = "MaximumPageSize",
OutputToken = new[] { "History.NextPageToken" }
)]
IGetWorkflowExecutionHistoryPaginator GetWorkflowExecutionHistory(GetWorkflowExecutionHistoryRequest request);

/// <summary>
/// Paginator for ListActivityTypes operation
///</summary>
[AWSPaginator(
InputToken = new[] { "NextPageToken" },
LimitKey = "MaximumPageSize",
OutputToken = new[] { "ActivityTypeInfos.NextPageToken" }
)]
IListActivityTypesPaginator ListActivityTypes(ListActivityTypesRequest request);

/// <summary>
/// Paginator for ListClosedWorkflowExecutions operation
///</summary>
[AWSPaginator(
InputToken = new[] { "NextPageToken" },
LimitKey = "MaximumPageSize",
OutputToken = new[] { "WorkflowExecutionInfos.NextPageToken" }
)]
IListClosedWorkflowExecutionsPaginator ListClosedWorkflowExecutions(ListClosedWorkflowExecutionsRequest request);

/// <summary>
/// Paginator for ListDomains operation
///</summary>
[AWSPaginator(
InputToken = new[] { "NextPageToken" },
LimitKey = "MaximumPageSize",
OutputToken = new[] { "DomainInfos.NextPageToken" }
)]
IListDomainsPaginator ListDomains(ListDomainsRequest request);

/// <summary>
/// Paginator for ListOpenWorkflowExecutions operation
///</summary>
[AWSPaginator(
InputToken = new[] { "NextPageToken" },
LimitKey = "MaximumPageSize",
OutputToken = new[] { "WorkflowExecutionInfos.NextPageToken" }
)]
IListOpenWorkflowExecutionsPaginator ListOpenWorkflowExecutions(ListOpenWorkflowExecutionsRequest request);

/// <summary>
/// Paginator for ListWorkflowTypes operation
///</summary>
[AWSPaginator(
InputToken = new[] { "NextPageToken" },
LimitKey = "MaximumPageSize",
OutputToken = new[] { "WorkflowTypeInfos.NextPageToken" }
)]
IListWorkflowTypesPaginator ListWorkflowTypes(ListWorkflowTypesRequest request);

/// <summary>
/// Paginator for PollForDecisionTask operation
///</summary>
[AWSPaginator(
InputToken = new[] { "NextPageToken" },
LimitKey = "MaximumPageSize",
OutputToken = new[] { "DecisionTask.NextPageToken" }
)]
IPollForDecisionTaskPaginator PollForDecisionTask(PollForDecisionTaskRequest request);
}
}
Loading