Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Add the ability to generate pub(crate) values #1444

Merged
merged 5 commits into from
Jun 9, 2022
Merged
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
Expand Up @@ -7,6 +7,7 @@ package software.amazon.smithy.rustsdk

import software.amazon.smithy.codegen.core.CodegenException
import software.amazon.smithy.rust.codegen.rustlang.CargoDependency
import software.amazon.smithy.rust.codegen.rustlang.Visibility
import software.amazon.smithy.rust.codegen.smithy.RuntimeConfig
import software.amazon.smithy.rust.codegen.smithy.RuntimeCrateLocation
import software.amazon.smithy.rust.codegen.smithy.RuntimeType
Expand Down Expand Up @@ -43,12 +44,12 @@ fun RuntimeConfig.awsRoot(): RuntimeCrateLocation {
object AwsRuntimeType {
val S3Errors by lazy { RuntimeType.forInlineDependency(InlineAwsDependency.forRustFile("s3_errors")) }
val Presigning by lazy {
RuntimeType.forInlineDependency(InlineAwsDependency.forRustFile("presigning", public = true))
RuntimeType.forInlineDependency(InlineAwsDependency.forRustFile("presigning", visibility = Visibility.PUBLIC))
}

fun RuntimeConfig.defaultMiddleware() = RuntimeType.forInlineDependency(
InlineAwsDependency.forRustFile(
"middleware", public = true,
"middleware", visibility = Visibility.PUBLIC,
CargoDependency.SmithyHttp(this),
CargoDependency.SmithyHttpTower(this),
CargoDependency.SmithyClient(this),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@ package software.amazon.smithy.rustsdk

import software.amazon.smithy.rust.codegen.rustlang.InlineDependency
import software.amazon.smithy.rust.codegen.rustlang.RustDependency
import software.amazon.smithy.rust.codegen.rustlang.Visibility

object InlineAwsDependency {
fun forRustFile(file: String, public: Boolean = false, vararg additionalDependency: RustDependency): InlineDependency =
InlineDependency.Companion.forRustFile(file, "aws-inlineable", public, *additionalDependency)
fun forRustFile(file: String, visibility: Visibility = Visibility.PRIVATE, vararg additionalDependency: RustDependency): InlineDependency =
InlineDependency.Companion.forRustFile(file, "aws-inlineable", visibility, *additionalDependency)
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import software.amazon.smithy.model.shapes.OperationShape
import software.amazon.smithy.rust.codegen.rustlang.Attribute
import software.amazon.smithy.rust.codegen.rustlang.RustMetadata
import software.amazon.smithy.rust.codegen.rustlang.RustWriter
import software.amazon.smithy.rust.codegen.rustlang.Visibility
import software.amazon.smithy.rust.codegen.rustlang.Writable
import software.amazon.smithy.rust.codegen.rustlang.documentShape
import software.amazon.smithy.rust.codegen.rustlang.rust
Expand All @@ -37,7 +38,7 @@ class ServerCombinedErrorGenerator(
val symbol = operation.errorSymbol(symbolProvider)
val meta = RustMetadata(
derives = Attribute.Derives(setOf(RuntimeType.Debug)),
public = true
visibility = Visibility.PUBLIC
)

writer.rust("/// Error type for the `${operationSymbol.name}` operation.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import software.amazon.smithy.rust.codegen.rustlang.Attribute
import software.amazon.smithy.rust.codegen.rustlang.CargoDependency
import software.amazon.smithy.rust.codegen.rustlang.RustMetadata
import software.amazon.smithy.rust.codegen.rustlang.RustWriter
import software.amazon.smithy.rust.codegen.rustlang.Visibility
import software.amazon.smithy.rust.codegen.rustlang.asType
import software.amazon.smithy.rust.codegen.rustlang.escape
import software.amazon.smithy.rust.codegen.rustlang.rust
Expand Down Expand Up @@ -132,11 +133,11 @@ class ServerProtocolTestGenerator(
val operationName = operationSymbol.name
val testModuleName = "server_${operationName.toSnakeCase()}_test"
val moduleMeta = RustMetadata(
public = false,
additionalAttributes = listOf(
Attribute.Cfg("test"),
Attribute.Custom("allow(unreachable_code, unused_variables)")
)
),
visibility = Visibility.PRIVATE
)
writer.withModule(testModuleName, moduleMeta) {
renderAllTestCases(allTests)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,15 +74,15 @@ class InlineDependency(
name: String,
baseDir: String,
vararg additionalDependencies: RustDependency
): InlineDependency = forRustFile(name, baseDir, public = false, *additionalDependencies)
): InlineDependency = forRustFile(name, baseDir, visibility = Visibility.PRIVATE, *additionalDependencies)

fun forRustFile(
name: String,
baseDir: String,
public: Boolean,
visibility: Visibility,
vararg additionalDependencies: RustDependency
): InlineDependency {
val module = RustModule.default(name, public)
val module = RustModule.default(name, visibility)
val filename = "$name.rs"
// The inline crate is loaded as a dependency on the runtime classpath
val rustFile = this::class.java.getResource("/$baseDir/src/$filename")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@ data class RustModule(val name: String, val rustMetadata: RustMetadata, val docu
}

companion object {
fun default(name: String, public: Boolean, documentation: String? = null): RustModule {
return RustModule(name, RustMetadata(public = public), documentation)
fun default(name: String, visibility: Visibility, documentation: String? = null): RustModule {
return RustModule(name, RustMetadata(visibility = visibility), documentation)
}

fun public(name: String, documentation: String? = null): RustModule =
default(name, public = true, documentation = documentation)
default(name, visibility = Visibility.PUBLIC, documentation = documentation)

fun private(name: String, documentation: String? = null): RustModule =
default(name, public = false, documentation = documentation)
default(name, visibility = Visibility.PRIVATE, documentation = documentation)

val Config = public("config", documentation = "Configuration for the service.")
val Error = public("error", documentation = "Errors that can occur when calling the service.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -269,13 +269,19 @@ fun RustType.isCopy(): Boolean = when (this) {
else -> false
}

enum class Visibility {
PRIVATE,
PUBCRATE,
PUBLIC
}

/**
* Meta information about a Rust construction (field, struct, or enum)
* Meta information about a Rust construction (field, struct, or enum).
*/
data class RustMetadata(
val derives: Attribute.Derives = Attribute.Derives.Empty,
val additionalAttributes: List<Attribute> = listOf(),
val public: Boolean
val visibility: Visibility = Visibility.PRIVATE
) {
fun withDerives(vararg newDerive: RuntimeType): RustMetadata =
this.copy(derives = derives.copy(derives = derives.derives + newDerive))
Expand All @@ -293,9 +299,13 @@ data class RustMetadata(
}

fun renderVisibility(writer: RustWriter): RustMetadata {
if (public) {
writer.writeInline("pub ")
}
writer.writeInline(
when (visibility) {
Visibility.PRIVATE -> ""
Visibility.PUBCRATE -> "pub(crate) "
Visibility.PUBLIC -> "pub "
}
)
return this
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import org.jsoup.nodes.Element
import software.amazon.smithy.codegen.core.CodegenException
import software.amazon.smithy.codegen.core.Symbol
import software.amazon.smithy.codegen.core.SymbolWriter
import software.amazon.smithy.codegen.core.SymbolWriter.Factory
import software.amazon.smithy.model.Model
import software.amazon.smithy.model.shapes.BooleanShape
import software.amazon.smithy.model.shapes.CollectionShape
Expand Down Expand Up @@ -416,7 +417,7 @@ class RustWriter private constructor(
*/
fun withModule(
moduleName: String,
rustMetadata: RustMetadata = RustMetadata(public = true),
rustMetadata: RustMetadata = RustMetadata(visibility = Visibility.PUBLIC),
moduleWriter: RustWriter.() -> Unit
): RustWriter {
// In Rust, modules must specify their own imports—they don't have access to the parent scope.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import software.amazon.smithy.rust.codegen.rustlang.InlineDependency
import software.amazon.smithy.rust.codegen.rustlang.RustDependency
import software.amazon.smithy.rust.codegen.rustlang.RustModule
import software.amazon.smithy.rust.codegen.rustlang.RustWriter
import software.amazon.smithy.rust.codegen.rustlang.Visibility
import software.amazon.smithy.rust.codegen.smithy.generators.CargoTomlGenerator
import software.amazon.smithy.rust.codegen.smithy.generators.LibRsCustomization
import software.amazon.smithy.rust.codegen.smithy.generators.LibRsGenerator
Expand Down Expand Up @@ -94,7 +95,7 @@ open class RustCrate(
) {
injectInlineDependencies()
val modules = inner.writers.values.mapNotNull { it.module() }.filter { it != "lib" }
.map { modules[it] ?: RustModule.default(it, false) }
.map { modules[it] ?: RustModule.default(it, visibility = Visibility.PRIVATE) }
inner.finalize(
settings,
model,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import software.amazon.smithy.model.traits.EnumDefinition
import software.amazon.smithy.model.traits.EnumTrait
import software.amazon.smithy.rust.codegen.rustlang.Attribute
import software.amazon.smithy.rust.codegen.rustlang.RustMetadata
import software.amazon.smithy.rust.codegen.smithy.RuntimeType.Companion.PartialEq
import software.amazon.smithy.rust.codegen.rustlang.Visibility
import software.amazon.smithy.rust.codegen.util.hasTrait

/**
Expand Down Expand Up @@ -78,11 +78,11 @@ class BaseSymbolMetadataProvider(
private val containerDefault = RustMetadata(
Attribute.Derives(defaultDerives.toSet()),
additionalAttributes = additionalAttributes,
public = true
visibility = Visibility.PUBLIC
)

override fun memberMeta(memberShape: MemberShape): RustMetadata {
return RustMetadata(public = true)
return RustMetadata(visibility = Visibility.PUBLIC)
}

override fun structureMeta(structureShape: StructureShape): RustMetadata {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import software.amazon.smithy.model.shapes.StructureShape
import software.amazon.smithy.rust.codegen.rustlang.RustMetadata
import software.amazon.smithy.rust.codegen.rustlang.RustModule
import software.amazon.smithy.rust.codegen.rustlang.RustType
import software.amazon.smithy.rust.codegen.rustlang.Visibility
import software.amazon.smithy.rust.codegen.rustlang.Writable
import software.amazon.smithy.rust.codegen.rustlang.rust
import software.amazon.smithy.rust.codegen.rustlang.rustTemplate
Expand All @@ -23,7 +24,7 @@ import software.amazon.smithy.rust.codegen.smithy.protocols.lensName

/** Generator for accessing nested fields through optional values **/
class NestedAccessorGenerator(private val symbolProvider: RustSymbolProvider) {
private val module = RustModule("lens", RustMetadata(public = false), "Generated accessors for nested fields")
private val module = RustModule("lens", RustMetadata(visibility = Visibility.PUBLIC), "Generated accessors for nested fields")
/**
* Generate an accessor on [root] that consumes [root] and returns an `Option<T>` for the nested item
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import software.amazon.smithy.rust.codegen.rustlang.CargoDependency
import software.amazon.smithy.rust.codegen.rustlang.RustMetadata
import software.amazon.smithy.rust.codegen.rustlang.RustModule
import software.amazon.smithy.rust.codegen.rustlang.RustType
import software.amazon.smithy.rust.codegen.rustlang.Visibility
import software.amazon.smithy.rust.codegen.rustlang.Writable
import software.amazon.smithy.rust.codegen.rustlang.asType
import software.amazon.smithy.rust.codegen.rustlang.render
Expand Down Expand Up @@ -76,7 +77,7 @@ class PaginatorGenerator private constructor(
idx.getPaginationInfo(service, operation).orNull() ?: PANIC("failed to load pagination info")
private val module = RustModule(
"paginator",
RustMetadata(public = true),
RustMetadata(visibility = Visibility.PUBLIC),
documentation = "Paginators for the service"
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import software.amazon.smithy.rust.codegen.rustlang.RustModule
import software.amazon.smithy.rust.codegen.rustlang.RustReservedWords
import software.amazon.smithy.rust.codegen.rustlang.RustType
import software.amazon.smithy.rust.codegen.rustlang.RustWriter
import software.amazon.smithy.rust.codegen.rustlang.Visibility
import software.amazon.smithy.rust.codegen.rustlang.Writable
import software.amazon.smithy.rust.codegen.rustlang.asArgumentType
import software.amazon.smithy.rust.codegen.rustlang.asOptional
Expand Down Expand Up @@ -297,7 +298,7 @@ class FluentClientGenerator(

val clientModule = RustModule(
"client",
RustMetadata(public = true),
RustMetadata(visibility = Visibility.PUBLIC),
documentation = "Client and fluent builders for calling the service."
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import software.amazon.smithy.model.traits.RetryableTrait
import software.amazon.smithy.rust.codegen.rustlang.Attribute
import software.amazon.smithy.rust.codegen.rustlang.RustMetadata
import software.amazon.smithy.rust.codegen.rustlang.RustWriter
import software.amazon.smithy.rust.codegen.rustlang.Visibility
import software.amazon.smithy.rust.codegen.rustlang.Writable
import software.amazon.smithy.rust.codegen.rustlang.documentShape
import software.amazon.smithy.rust.codegen.rustlang.rust
Expand Down Expand Up @@ -62,7 +63,7 @@ class CombinedErrorGenerator(
val meta = RustMetadata(
derives = Attribute.Derives(setOf(RuntimeType.Debug)),
additionalAttributes = listOf(Attribute.NonExhaustive),
public = true
visibility = Visibility.PUBLIC
)

writer.rust("/// Error type for the `${operationSymbol.name}` operation.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import software.amazon.smithy.rust.codegen.rustlang.CargoDependency
import software.amazon.smithy.rust.codegen.rustlang.RustMetadata
import software.amazon.smithy.rust.codegen.rustlang.RustModule
import software.amazon.smithy.rust.codegen.rustlang.RustWriter
import software.amazon.smithy.rust.codegen.rustlang.Visibility
import software.amazon.smithy.rust.codegen.rustlang.asType
import software.amazon.smithy.rust.codegen.rustlang.documentShape
import software.amazon.smithy.rust.codegen.rustlang.rust
Expand Down Expand Up @@ -46,7 +47,7 @@ class TopLevelErrorGenerator(codegenContext: CodegenContext, private val operati

private val sdkError = CargoDependency.SmithyHttp(codegenContext.runtimeConfig).asType().member("result::SdkError")
fun render(crate: RustCrate) {
crate.withModule(RustModule.default("error_meta", false)) { writer ->
crate.withModule(RustModule.default("error_meta", visibility = Visibility.PRIVATE)) { writer ->
writer.renderDefinition()
writer.renderImplDisplay()
// Every operation error can be converted into service::Error
Expand Down Expand Up @@ -102,7 +103,7 @@ class TopLevelErrorGenerator(codegenContext: CodegenContext, private val operati
rust("/// All possible error types for this service.")
RustMetadata(
additionalAttributes = listOf(Attribute.NonExhaustive),
public = true
visibility = Visibility.PUBLIC
).withDerives(RuntimeType.Debug).render(this)
rustBlock("enum Error") {
allErrors.forEach { error ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import software.amazon.smithy.rust.codegen.rustlang.Attribute
import software.amazon.smithy.rust.codegen.rustlang.CargoDependency
import software.amazon.smithy.rust.codegen.rustlang.RustMetadata
import software.amazon.smithy.rust.codegen.rustlang.RustWriter
import software.amazon.smithy.rust.codegen.rustlang.Visibility
import software.amazon.smithy.rust.codegen.rustlang.asType
import software.amazon.smithy.rust.codegen.rustlang.escape
import software.amazon.smithy.rust.codegen.rustlang.rust
Expand Down Expand Up @@ -108,7 +109,7 @@ class ProtocolTestGenerator(
val operationName = operationSymbol.name
val testModuleName = "${operationName.toSnakeCase()}_request_test"
val moduleMeta = RustMetadata(
public = false,
visibility = Visibility.PRIVATE,
additionalAttributes = listOf(
Attribute.Cfg("test"),
Attribute.Custom("allow(unreachable_code, unused_variables)")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import software.amazon.smithy.model.shapes.StructureShape
import software.amazon.smithy.rust.codegen.rustlang.Attribute
import software.amazon.smithy.rust.codegen.rustlang.RustMetadata
import software.amazon.smithy.rust.codegen.rustlang.RustWriter
import software.amazon.smithy.rust.codegen.rustlang.Visibility
import software.amazon.smithy.rust.codegen.rustlang.docs
import software.amazon.smithy.rust.codegen.rustlang.raw
import software.amazon.smithy.rust.codegen.rustlang.rust
Expand Down Expand Up @@ -179,8 +180,11 @@ class StructureGeneratorTest {
writer
.withModule(
"model",
// By attaching this lint, any missing documentation becomes a compiler error
RustMetadata(additionalAttributes = listOf(Attribute.Custom("deny(missing_docs)")), public = true)
RustMetadata(
// By attaching this lint, any missing documentation becomes a compiler error.
additionalAttributes = listOf(Attribute.Custom("deny(missing_docs)")),
visibility = Visibility.PUBLIC
)
) {
StructureGenerator(model, provider, this, model.lookup("com.test#Inner")).render()
StructureGenerator(model, provider, this, model.lookup("com.test#MyStruct")).render()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import org.junit.jupiter.api.Test
import software.amazon.smithy.model.shapes.OperationShape
import software.amazon.smithy.model.traits.EndpointTrait
import software.amazon.smithy.rust.codegen.rustlang.RustModule
import software.amazon.smithy.rust.codegen.rustlang.Visibility
import software.amazon.smithy.rust.codegen.rustlang.rust
import software.amazon.smithy.rust.codegen.rustlang.rustBlock
import software.amazon.smithy.rust.codegen.smithy.CodegenContext
Expand Down Expand Up @@ -61,7 +62,7 @@ internal class EndpointTraitBindingsTest {
operationShape.expectTrait(EndpointTrait::class.java)
)
val project = TestWorkspace.testProject()
project.withModule(RustModule.default("test", false)) {
project.withModule(RustModule.default("test", visibility = Visibility.PRIVATE)) {
it.rust(
"""
struct GetStatusInput {
Expand Down