diff --git a/smithy-model/src/main/java/software/amazon/smithy/model/shapes/SmithyIdlModelSerializer.java b/smithy-model/src/main/java/software/amazon/smithy/model/shapes/SmithyIdlModelSerializer.java index 9431fc89665..061ed324f6c 100644 --- a/smithy-model/src/main/java/software/amazon/smithy/model/shapes/SmithyIdlModelSerializer.java +++ b/smithy-model/src/main/java/software/amazon/smithy/model/shapes/SmithyIdlModelSerializer.java @@ -64,7 +64,13 @@ public final class SmithyIdlModelSerializer { private SmithyIdlModelSerializer(Builder builder) { metadataFilter = builder.metadataFilter; - shapeFilter = builder.shapeFilter.and(FunctionalUtils.not(Prelude::isPreludeShape)); + // If prelude serializing has been enabled, only use the given shape filter. + if (builder.serializePrelude) { + shapeFilter = builder.shapeFilter; + // Default to using the given shape filter and filtering prelude shapes. + } else { + shapeFilter = builder.shapeFilter.and(FunctionalUtils.not(Prelude::isPreludeShape)); + } // Never serialize synthetic traits. traitFilter = builder.traitFilter.and(FunctionalUtils.not(Trait::isSynthetic)); basePath = builder.basePath; @@ -236,6 +242,7 @@ public static final class Builder implements SmithyBuilder traitFilter = FunctionalUtils.alwaysTrue(); private Function shapePlacer = SmithyIdlModelSerializer::placeShapesByNamespace; private Path basePath = null; + private boolean serializePrelude = false; public Builder() {} @@ -302,6 +309,16 @@ public Builder basePath(Path basePath) { return this; } + /** + * Enables serializing shapes in the Smithy prelude. + * Defaults to false. + * @return Returns the builder. + */ + public Builder serializePrelude() { + this.serializePrelude = true; + return this; + } + @Override public SmithyIdlModelSerializer build() { return new SmithyIdlModelSerializer(this); diff --git a/smithy-model/src/test/java/software/amazon/smithy/model/shapes/SmithyIdlModelSerializerTest.java b/smithy-model/src/test/java/software/amazon/smithy/model/shapes/SmithyIdlModelSerializerTest.java index 55221a3eaf9..9d1e45a03f4 100644 --- a/smithy-model/src/test/java/software/amazon/smithy/model/shapes/SmithyIdlModelSerializerTest.java +++ b/smithy-model/src/test/java/software/amazon/smithy/model/shapes/SmithyIdlModelSerializerTest.java @@ -78,6 +78,7 @@ public void filtersShapes() { assertThat(serialized, hasKey(Paths.get("ns.structures.smithy"))); assertThat(serialized.get(Paths.get("ns.structures.smithy")), containsString("namespace ns.structures")); + assertThat(serialized, not(hasKey(Paths.get("smithy.api.smithy")))); } @Test @@ -168,4 +169,17 @@ public void transientTraitsAreNotSerialized() { assertThat(results.get(Paths.get("com.foo.smithy")), not(containsString(OriginalShapeIdTrait.ID.toString()))); } + + @Test + public void canEnableSerializingPrelude() { + Model model = Model.assembler() + .addImport(getClass().getResource("idl-serialization/test-model.json")) + .assemble() + .unwrap(); + SmithyIdlModelSerializer serializer = SmithyIdlModelSerializer.builder() + .serializePrelude() + .build(); + Map serialized = serializer.serialize(model); + assertThat(serialized.get(Paths.get("smithy.api.smithy")), containsString("namespace smithy.api")); + } }