15 releases (9 breaking)

Uses new Rust 2024

new 0.26.2 May 3, 2026
0.26.0 Feb 7, 2026
0.25.2 Dec 17, 2025
0.24.0 Oct 5, 2025
0.19.0 Mar 10, 2025

#402 in Rust patterns

Download history 38675/week @ 2026-01-12 25706/week @ 2026-01-19 28841/week @ 2026-01-26 27272/week @ 2026-02-02 30864/week @ 2026-02-09 31472/week @ 2026-02-16 30975/week @ 2026-02-23 33438/week @ 2026-03-02 36150/week @ 2026-03-09 35454/week @ 2026-03-16 38378/week @ 2026-03-23 34933/week @ 2026-03-30 38680/week @ 2026-04-06 44480/week @ 2026-04-13 59404/week @ 2026-04-20 59588/week @ 2026-04-27

205,514 downloads per month
Used in 149 crates (via salsa)

Apache-2.0 OR MIT

87KB
1.5K SLoC

This crate defines various macro_rules macros used as part of Salsa's internal plumbing. These macros are re-exported under salsa::plumbing``. The procedural macros emit calls to these macro_rules` macros after doing error checking.

Using macro_rules macro definitions is generally more ergonomic and also permits true hygiene for local variables (sadly not items).

Currently the only way to have a macro that is re-exported from a submodule is to use multiple crates, hence the existence of this crate.


salsa

Test Book Released API docs Crates.io

A generic framework for on-demand, incrementalized computation.

Salsa Logo

Obligatory warning

Very much a WORK IN PROGRESS at this point.

Credits

This system is heavily inspired by adapton, glimmer, and rustc's query system. So credit goes to Eduard-Mihai Burtescu, Matthew Hammer, Yehuda Katz, and Michael Woerister.

Key idea

The key idea of salsa is that you define your program as a set of queries. Every query is used like function K -> V that maps from some key of type K to a value of type V. Queries come in two basic varieties:

  • Inputs: the base inputs to your system. You can change these whenever you like.
  • Functions: pure functions (no side effects) that transform your inputs into other values. The results of queries are memoized to avoid recomputing them a lot. When you make changes to the inputs, we'll figure out (fairly intelligently) when we can re-use these memoized values and when we have to recompute them.

Want to learn more?

To learn more about Salsa, try one of the following:

Getting in touch

The bulk of the discussion happens in the issues and pull requests, but we have a zulip chat as well.

Contributing

To create a release and publish to crates.io, update the version field in Cargo.toml. After pushed, GitHub Actions will publish the crates to crates.io automatically.

No runtime deps

Features