Skip to content

Commit

Permalink
add feature tracking for cbor protocol (#2821)
Browse files Browse the repository at this point in the history
  • Loading branch information
lucix-aws authored Oct 8, 2024
1 parent 183987c commit 5a4e5bb
Show file tree
Hide file tree
Showing 17 changed files with 139 additions and 0 deletions.
1 change: 1 addition & 0 deletions aws/middleware/user_agent.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ const (
UserAgentFeatureS3ExpressBucket = "J"
UserAgentFeatureS3AccessGrants = "K" // not yet implemented
UserAgentFeatureGZIPRequestCompression = "L"
UserAgentFeatureProtocolRPCV2CBOR = "M"
)

// RequestUserAgent is a build middleware that set the User-Agent for the request.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package software.amazon.smithy.aws.go.codegen.customization;

import static software.amazon.smithy.go.codegen.GoWriter.goTemplate;
import static software.amazon.smithy.go.codegen.SymbolUtils.buildPackageSymbol;

import java.util.List;
import java.util.Map;
import java.util.function.BiPredicate;
import software.amazon.smithy.aws.go.codegen.AwsGoDependency;
import software.amazon.smithy.codegen.core.Symbol;
import software.amazon.smithy.go.codegen.GoCodegenContext;
import software.amazon.smithy.go.codegen.GoWriter;
import software.amazon.smithy.go.codegen.SmithyGoTypes;
import software.amazon.smithy.go.codegen.integration.GoIntegration;
import software.amazon.smithy.go.codegen.integration.MiddlewareRegistrar;
import software.amazon.smithy.go.codegen.integration.RuntimeClientPlugin;
import software.amazon.smithy.model.Model;
import software.amazon.smithy.model.shapes.ServiceShape;
import software.amazon.smithy.protocol.traits.Rpcv2CborTrait;

/**
* Adds user agent tracking for basic features - i.e. simple model-based ones that do not require any additional in-code
* checks, such as a particular protocol.
*/
public class BasicUserAgentFeatures implements GoIntegration {
private static final List<Feature> FEATURES = List.of(
new Feature("ProtocolRPCV2CBOR", (model, service) -> service.hasTrait(Rpcv2CborTrait.class))
);

@Override
public List<RuntimeClientPlugin> getClientPlugins() {
return FEATURES.stream().map(Feature::getPlugin).toList();
}

@Override
public void writeAdditionalFiles(GoCodegenContext ctx) {
var model = ctx.model();
var service = ctx.settings().getService(model);
ctx.writerDelegator().useFileWriter("api_client.go", ctx.settings().getModuleName(),
GoWriter.ChainWritable.of(
FEATURES.stream()
.filter(it -> it.servicePredicate.test(model, service))
.map(Feature::getAddMiddleware)
.toList()
).compose());
}

private static final class Feature {
public final Symbol featureId;
public final BiPredicate<Model, ServiceShape> servicePredicate;

public Feature(String id, BiPredicate<Model, ServiceShape> servicePredicate) {
this.featureId = AwsGoDependency.AWS_MIDDLEWARE.constSymbol("UserAgentFeature" + id);
this.servicePredicate = servicePredicate;
}

public RuntimeClientPlugin getPlugin() {
return RuntimeClientPlugin.builder()
.servicePredicate(servicePredicate)
.registerMiddleware(
MiddlewareRegistrar.builder()
.resolvedFunction(buildPackageSymbol("add" + featureId.getName()))
.useClientOptions()
.build()
)
.build();
}

public GoWriter.Writable getAddMiddleware() {
return goTemplate("""
func add$featureName:L(stack $stack:P, options Options) error {
ua, err := getOrAddRequestUserAgent(stack)
if err != nil {
return err
}
ua.AddUserAgentFeature($featureEnum:T)
return nil
}
""",
Map.of(
"stack", SmithyGoTypes.Middleware.Stack,
"featureName", featureId.getName(),
"featureEnum", featureId
));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -86,3 +86,4 @@ software.amazon.smithy.aws.go.codegen.customization.RequestCompressionUserAgent
software.amazon.smithy.aws.go.codegen.customization.s3.ExpressUserAgent
software.amazon.smithy.aws.go.codegen.customization.BackfillRequiredTrait
software.amazon.smithy.aws.go.codegen.customization.DeprecateService
software.amazon.smithy.aws.go.codegen.customization.BasicUserAgentFeatures
10 changes: 10 additions & 0 deletions internal/protocoltest/smithyrpcv2cbor/api_client.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions internal/protocoltest/smithyrpcv2cbor/api_op_Float16.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions internal/protocoltest/smithyrpcv2cbor/api_op_NoInputOutput.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 5a4e5bb

Please sign in to comment.