Skip to content

Commit

Permalink
Remove invalid defaults from a few services
Browse files Browse the repository at this point in the history
Updates the RemoveDefaults customization to include a few more services/
shapes, specifically ones where the shape has a range incompatible with
its default value. Also refactors RemoveDefaults slightly.

Tested by `make generate` and confirming the expected diff.

This is a breakfix for evidently and emrserverless - the types for
ResultsPeriod and WorkerCounts will become nillable.
  • Loading branch information
milesziemer committed Jan 16, 2024
1 parent 301644a commit ffa376d
Showing 1 changed file with 61 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,36 @@
import software.amazon.smithy.go.codegen.GoSettings;
import software.amazon.smithy.go.codegen.integration.GoIntegration;
import software.amazon.smithy.model.Model;
import software.amazon.smithy.model.shapes.MemberShape;
import software.amazon.smithy.model.shapes.Shape;
import software.amazon.smithy.model.shapes.AbstractShapeBuilder;
import software.amazon.smithy.model.shapes.ShapeId;
import software.amazon.smithy.model.traits.DefaultTrait;
import software.amazon.smithy.model.transform.ModelTransformer;
import software.amazon.smithy.utils.MapUtils;
import software.amazon.smithy.utils.SetUtils;
import software.amazon.smithy.utils.ToSmithyBuilder;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

public class RemoveDefaults implements GoIntegration {
private static final Map<ShapeId, Set<ShapeId>> toRemove = MapUtils.of(
ShapeId.from("com.amazonaws.s3control#AWSS3ControlServiceV20180820"), SetUtils.of(
ShapeId.from("com.amazonaws.s3control#PublicAccessBlockConfiguration$BlockPublicAcls"),
ShapeId.from("com.amazonaws.s3control#PublicAccessBlockConfiguration$IgnorePublicAcls"),
ShapeId.from("com.amazonaws.s3control#PublicAccessBlockConfiguration$BlockPublicPolicy"),
ShapeId.from("com.amazonaws.s3control#PublicAccessBlockConfiguration$RestrictPublicBuckets")
)
);
private static final Map<ShapeId, Set<ShapeId>> toRemove = MapUtils.ofEntries(
serviceToShapeIds("com.amazonaws.s3control#AWSS3ControlServiceV20180820",
"com.amazonaws.s3control#PublicAccessBlockConfiguration$BlockPublicAcls",
"com.amazonaws.s3control#PublicAccessBlockConfiguration$IgnorePublicAcls",
"com.amazonaws.s3control#PublicAccessBlockConfiguration$BlockPublicPolicy",
"com.amazonaws.s3control#PublicAccessBlockConfiguration$RestrictPublicBuckets"),
serviceToShapeIds("com.amazonaws.evidently#Evidently",
"com.amazonaws.evidently#ResultsPeriod"),
serviceToShapeIds("com.amazonaws.amplifyuibuilder#AmplifyUIBuilder",
"smithy.go.synthetic#ListPlaceIndexesInput$MaxResults",
"smithy.go.synthetic#SearchPlaceIndexForSuggestionsInput$MaxResults",
"com.amazonaws.location#PlaceIndexSearchResultLimit"),
serviceToShapeIds("com.amazonaws.paymentcryptographydata#PaymentCryptographyDataPlane",
"com.amazonaws.paymentcryptographydata#IntegerRangeBetween4And12"),
serviceToShapeIds("com.amazonaws.emrserverless#AwsToledoWebService",
"com.amazonaws.emrserverless#WorkerCounts"));

private boolean mustPreprocess(ShapeId service) {
return toRemove.containsKey(service);
Expand All @@ -38,16 +47,52 @@ public Model preprocessModel(Model model, GoSettings settings) {
}

private Model removeDefaults(Model model, Set<ShapeId> fromShapes) {
return ModelTransformer.create().mapShapes(model, it ->
fromShapes.contains(it.getId())
? withoutDefault(it)
: it
);
Set<ShapeId> removedRootDefaults = new HashSet<>();
Model removedRootDefaultsModel = ModelTransformer.create().mapShapes(model, (shape) -> {
if (shouldRemoveRootDefault(shape, fromShapes)) {
removedRootDefaults.add(shape.getId());
return withoutDefault(shape);
} else {
return shape;
}
});
return ModelTransformer.create().mapShapes(removedRootDefaultsModel, (shape) -> {
if (shouldRemoveMemberDefault(shape, removedRootDefaults, fromShapes)) {
return withoutDefault(shape);
} else {
return shape;
}
});
}

private boolean shouldRemoveRootDefault(Shape shape, Set<ShapeId> removeDefaultsFrom) {
return !shape.isMemberShape()
&& removeDefaultsFrom.contains(shape.getId())
&& shape.hasTrait(DefaultTrait.class);
}

private boolean shouldRemoveMemberDefault(
Shape shape,
Set<ShapeId> removedRootDefaults,
Set<ShapeId> removeDefaultsFrom
) {
if (!shape.isMemberShape()) {
return false;
}
MemberShape member = shape.asMemberShape().get();
return (removedRootDefaults.contains(member.getTarget()) || removeDefaultsFrom.contains(member.getId()))
&& member.hasTrait(DefaultTrait.class);
}

private Shape withoutDefault(Shape shape) {
return Shape.shapeToBuilder(shape)
.removeTrait(DefaultTrait.ID)
.build();
}

private static Map.Entry<ShapeId, Set<ShapeId>> serviceToShapeIds(String serviceId, String... shapeIds) {
return Map.entry(
ShapeId.from(serviceId),
Arrays.stream(shapeIds).map(ShapeId::from).collect(Collectors.toSet()));
}
}

0 comments on commit ffa376d

Please sign in to comment.