2022-04-29 00:06:48 +08:00
|
|
|
Smithy Rust [![CI on Branch `main`](https://github.com/awslabs/smithy-rs/actions/workflows/ci-main.yml/badge.svg)](https://github.com/awslabs/smithy-rs/actions/workflows/ci-main.yml)
|
2022-01-28 05:05:31 +08:00
|
|
|
==================================================================================
|
2020-10-28 21:37:45 +08:00
|
|
|
|
2022-01-28 05:05:31 +08:00
|
|
|
Smithy code generators for Rust that generate clients, servers, and the entire AWS SDK.
|
|
|
|
The latest unreleased SDK build can be found in [aws-sdk-rust/next](https://github.com/awslabs/aws-sdk-rust/tree/next).
|
2021-01-27 01:30:42 +08:00
|
|
|
|
2022-01-28 05:05:31 +08:00
|
|
|
[Design documentation](https://awslabs.github.io/smithy-rs/design)
|
2021-05-07 06:59:12 +08:00
|
|
|
|
2021-01-27 01:30:42 +08:00
|
|
|
**All internal and external interfaces are considered unstable and subject to change without notice.**
|
|
|
|
|
2022-02-02 10:15:20 +08:00
|
|
|
Setup
|
|
|
|
-----
|
|
|
|
|
2022-06-24 00:27:43 +08:00
|
|
|
1. `./gradlew` will setup gradle for you. JDK 17 is required.
|
2020-11-05 11:09:00 +08:00
|
|
|
2. Running tests requires a working Rust installation. See [Rust docs](https://www.rust-lang.org/learn/get-started) for
|
2021-01-27 01:30:42 +08:00
|
|
|
installation instructions on your platform. Minimum supported Rust version is the latest released Rust version, although older versions may work.
|
2020-10-28 21:37:45 +08:00
|
|
|
|
2022-02-02 10:15:20 +08:00
|
|
|
Development
|
|
|
|
-----------
|
2020-10-28 21:37:45 +08:00
|
|
|
|
2022-02-02 10:15:20 +08:00
|
|
|
For development, pre-commit hooks make it easier to pass automated linting when opening a pull request. Setup:
|
|
|
|
```bash
|
2020-11-05 11:09:00 +08:00
|
|
|
brew install pre-commit # (or appropriate for your platform: https://pre-commit.com/)
|
|
|
|
pre-commit install
|
|
|
|
```
|
2021-01-20 04:23:07 +08:00
|
|
|
|
2022-02-02 10:15:20 +08:00
|
|
|
Project Layout
|
|
|
|
--------------
|
|
|
|
|
2021-01-20 04:23:07 +08:00
|
|
|
* `aws`: AWS specific codegen & Rust code (signing, endpoints, customizations, etc.)
|
2021-05-07 06:59:12 +08:00
|
|
|
Common commands:
|
2022-02-02 10:15:20 +08:00
|
|
|
* `./gradlew :aws:sdk:assemble`: Generate (but do not test / compile etc.) a fresh SDK into `sdk/build/aws-sdk`
|
|
|
|
* `./gradlew :aws:sdk:test`: Generate & run all tests for a fresh SDK
|
|
|
|
* `./gradlew :aws:sdk:{cargoCheck, cargoTest, cargoDocs, cargoClippy}`: Generate & run specified cargo command.
|
2021-11-10 20:51:31 +08:00
|
|
|
* `codegen`: Whitelabel Smithy client code generation
|
|
|
|
* `codegen-test`: Smithy protocol test generation & integration tests for Smithy client whitelabel code
|
2021-05-07 06:59:12 +08:00
|
|
|
* [`design`](design): Design documentation. See the [design/README.md](design/README.md) for details about building / viewing.
|
2021-11-10 20:51:31 +08:00
|
|
|
* `codegen-server`: Whitelabel Smithy server code generation
|
|
|
|
* `codegen-server-test`: Smithy protocol test generation & integration tests for Smithy server whitelabel code
|
2022-02-02 10:15:20 +08:00
|
|
|
|
|
|
|
Testing
|
|
|
|
-------
|
|
|
|
|
|
|
|
Running all of smithy-rs's tests can take a very long time, so it's better to know which parts
|
|
|
|
to test based on the changes being made, and allow continuous integration to find other issues
|
|
|
|
when posting a pull request.
|
|
|
|
|
|
|
|
In general, the components of smithy-rs affect each other in the following order (with earlier affecting later):
|
|
|
|
|
|
|
|
1. `rust-runtime`
|
|
|
|
2. `codegen` and `codegen-server`
|
|
|
|
3. `aws/rust-runtime`
|
|
|
|
4. `aws/sdk-codegen`
|
|
|
|
|
|
|
|
Some components, such as `codegen-test` and `codegen-server-test`, are purely for testing other components.
|
|
|
|
|
|
|
|
### Testing `rust-runtime` and `aws/rust-runtime`
|
|
|
|
|
|
|
|
To test the `rust-runtime` crates:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
# Run all Rust tests for `rust-runtime/`
|
|
|
|
./gradlew rust-runtime:cargoTest
|
|
|
|
# Run clippy for `rust-runtime/`
|
|
|
|
./gradlew rust-runtime:cargoClippy
|
|
|
|
```
|
|
|
|
|
|
|
|
For `aws/rust-runtime`, just prefix with `aws:`:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
# Run all Rust tests for `rust-runtime/`
|
|
|
|
./gradlew aws:rust-runtime:cargoTest
|
|
|
|
# Run clippy for `rust-runtime/`
|
|
|
|
./gradlew aws:rust-runtime:cargoClippy
|
|
|
|
```
|
|
|
|
|
|
|
|
Some runtime crates have a `additional-ci` script that can also be run. These scripts often require
|
|
|
|
[`cargo-hack`](https://github.com/taiki-e/cargo-hack) and [`cargo-udeps`](https://github.com/est31/cargo-udeps)
|
|
|
|
to be installed.
|
|
|
|
|
|
|
|
### Testing Client/Server Codegen
|
|
|
|
|
|
|
|
To test the code generation, the following can be used:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
# Run Kotlin codegen unit tests
|
|
|
|
./gradlew codegen:check
|
|
|
|
# Run client codegen tests
|
|
|
|
./gradlew codegen-test:check
|
|
|
|
# Run server codegen tests
|
|
|
|
./gradlew codegen-server-test:check
|
|
|
|
```
|
|
|
|
|
|
|
|
Several Kotlin unit tests generate Rust projects and compile them. When these fail, they typically
|
|
|
|
output links to the location of the generated code so that it can be inspected.
|
|
|
|
|
|
|
|
To look at generated code when the codegen tests fail, check these paths depending on the test suite that's failing:
|
|
|
|
- For codegen-test: `codegen-test/build/smithyprojections/codegen-test`
|
|
|
|
- For codgen-server-test: `codegen-server-test/build/smithyprojections/codegen-server-test`
|
|
|
|
|
|
|
|
### Testing SDK Codegen
|
|
|
|
|
|
|
|
See the readme in `aws/sdk/` for more information about these targets as they can be configured
|
|
|
|
to generate more or less AWS service clients.
|
|
|
|
|
|
|
|
```bash
|
|
|
|
# Run Kotlin codegen unit tests
|
|
|
|
./gradlew aws:sdk-codegen:check
|
|
|
|
# Generate an SDK, but do not attempt to compile / run tests. Useful for inspecting generated code
|
|
|
|
./gradlew :aws:sdk:assemble
|
|
|
|
# Run all the tests
|
|
|
|
./gradlew :aws:sdk:test
|
|
|
|
# Validate that the generated code compiles
|
|
|
|
./gradlew :aws:sdk:cargoCheck
|
|
|
|
# Validate that the generated code passes Clippy
|
|
|
|
./gradlew :aws:sdk:cargoClippy
|
|
|
|
# Validate the generated docs
|
|
|
|
./gradlew :aws:sdk:cargoDoc
|
|
|
|
```
|
|
|
|
|
|
|
|
The generated SDK will be placed in `aws/sdk/build/aws-sdk`.
|