sate
/ˈsɑː.teɪ/
n.
(Malay, Indonesian)
a skewer; meat (or other food) cut into pieces, threaded onto a skewer, and grilled.
Satay turns a spec into request builders, response decoders, and validation newtypes. You send the
http::Request with reqwest, ureq, hyper, or whatever you already run.
Quick start
cargo install satay-cli
Origin
sate
/ˈsɑː.teɪ/
n.
(Malay, Indonesian)
a skewer; meat (or other food) cut into pieces, threaded onto a skewer, and grilled.
English satay comes from the Malay and Indonesian word sate, which refers to both the skewer and the dish. Street vendors thread marinated pieces onto bamboo sticks, grill them over charcoal, and serve them with peanut sauce. The name caught on abroad as the dish spread across Southeast Asia.
Satay-rs leans into that image. OpenAPI describes the pieces: schemas, operations, constraints. Codegen threads them into typed request builders and response decoders. Your application picks the transport and sends them through. The skewer is the sans-IO boundary. The pieces stay the same no matter which grill you use.
Why sans-IO
Most OpenAPI clients bundle a transport. Your SDK ends up tracking reqwest releases, TLS changes, and separate async, blocking, and WASM code paths. Satay generates the API layer only. You send the requests yourself.
You maintain only the OpenAPI spec. Satay turns it into typed Rust. When the API changes, update the spec and regenerate. Your HTTP client stays separate.
Features
Builders, decoders, and validation newtypes from your OpenAPI spec.
Actions build plain http::Request values. Send them with reqwest, ureq, hyper, tests, WASM, or whatever you already run.
String, number, integer, and array constraints from the spec become nutype newtypes. Bounds narrow to u8 when the maximum allows it.
Reads the spec into a normalized IR, then emits structs, enums, builders, and decoders as ordinary Rust you can edit.
Stay IO-free, or pull in satay-reqwest and satay-ureq when you want a short send_with call site.
Built with Satay
Open-source API clients built with Satay. Got one? Send a PR.
A type-safe, sans-IO Rust client for Singapore NEA real-time weather & environmental APIs.
Fork the repo, add a row to
website/src/data/users.ts
with your name, description, and links. Logo goes in
public/users/
if you have one; set logo in the entry.
How it works
http::Request values. $ satay generate --input openapi.yaml --output src/generated --rustfmt
$ satay --help