smithy-cargo

Crates.iosmithy-cargo
lib.rssmithy-cargo
version1.1.0
created_at2025-03-23 22:56:28.312678+00
updated_at2026-01-07 23:10:46.428196+00
descriptionA library for Cargo build scripts to build Smithy models.
homepage
repositoryhttps://github.com/mellemahp/smithy-cargo
max_upload_size
id1603151
size24,994
Hunter Mellema (mellemahp)

documentation

README

smithy-cargo

CI Status License Crates.io dependency status

Tooling for building Smithy models from cargo build scripts (build.rs).

This crate does not build models itself; it calls out to the Smithy CLI, expecting it to be installed on the current machine.

Getting Started

[!IMPORTANT]
Before you proceed, make sure you have the Smithy CLI installed.

First, create a new cargo project and add smithy-cargo as a build dependency

cargo new smithy-cargo-example \
&& cd smithy-cargo-example \
&& cargo add --build smithy-cargo

Next, add a smithy-build config file to the root of the project. This config file determines how Smithy will build your models.

Now, add any smithy models we want to build to a model/ directory within our cargo project. smithy-cargo will automatically discover any smithy files within the model/ directory and include them as sources for the Smithy build.

Finally, configure smithy-cargo to run as part of your cargo build script (build.rs):

use smithy_cargo::SmithyBuild;

fn main() {
    SmithyBuild::new().execute().expect("Failed to build Smithy models");
}

Your fully configured cargo project should now look something like:

.
├── Cargo.toml
├── build.rs
├── model
│   └── a.smithy
├── smithy-build.json
└── src
    └── main.rs

To run the Smithy build, just run cargo build as you would normally and the smithy build will be executed by the build script.

Including generated Rust code

[!WARNING] This package does not provide any Smithy code generation plugins for rust on its own. You will still need to add a rust codegen plugin (such as smithy4rs) to actually generate rust code

Your Smithy build may use a build plugin to generate Rust code that you want to include as part of your crate.

For example the following smithy-build config:

{
  "version": "1.0",
  "maven": {
    "dependencies": ["com.example:my-rust-code-generator:1.0.0"]
  },
  "plugins": {
    "example-rust-codegen": { }
  }
}

Might generate a number of .rs files as build artifacts.

We can use the built-in include macro and the $SMITHY_OUTPUT_DIR environment variable added by the smithy-cargo build tool to quickly add generated files to our project:


// Module containing all of our generated Smithy shapes
mod shapes {
    // Adds generated file from the "example-rust-codegen" plugin in the "source" projection. 
    // Note: the "source" projection is the default projection for Smithy.
    include!(concat!(env!("SMITHY_OUTPUT_DIR"),
        "/", "source", // <- Projection name
        "/", "example-rust-codegen", // <- Plugin name
        "/", "example.rs") // <- Generated file to include
    );
}

fn my_function(string: String) {
    // Example usage
    let shapes::GeneratedShapeA { fieldA: 2 };
    
    // ...
}

License

This library is licensed under the Apache 2.0 License.

Commit count: 22

cargo fmt