Hello and welcome to another issue of This Week in Rust! Rust is a programming language empowering everyone to build reliable and efficient software. This is a weekly summary of its progress and community. Want something mentioned? Tag us at @ThisWeekInRust on Twitter or @ThisWeekinRust on mastodon.social, or send us a pull request. Want to get involved? We love contributions.
This Week in Rust is openly developed on GitHub and archives can be viewed at this-week-in-rust.org. If you find any errors in this week's issue, please submit a PR.
Updates from Rust Community
Foundation
Project/Tooling Updates
- Ruffle 2023 in review
- Four challenges cargo-semver-checks has yet to tackle
- rustc_codegen_gcc: Progress Report #29
- Roadmap for the Xilem backend in 2024
- rust-analyzer changelog #217
- pq-sys 0.5.0
- What's new in SeaORM 0.12.x
- Rust on Espressif chips - January 24 2024
Observations/Thoughts
- Making Rust binaries smaller by default
- My Best and Worst Deadlock in Rust
- Why SQL hang for exactly 940s? TCP and Async Rust!
- Making Async Rust Reliable
- Identifying Rust’s collect::() memory leak footgun
- [video] embassy is now on crates.io
- [video] Rust full stack web frameworks have a bright future
- [video] Rust Halifax - Rust & Tell #1
- [video] Why Rust will keep growing in 2024
Rust Walkthroughs
- Using
mem::take
to reduce heap allocations - Writing your own Rust linter
- Using Serde in Rust
- Parsing JSON in Rust
- Billion-row challenge: Rust walkthrough
- Embassy on ESP: Timers
- Supporting LoRa on the SparkFun expLoRaBLE Thing Plus with Rust
- How to work with !Sized types in Rust
- Rocket - logging in the web application
- Rocket - access custom configuration in the routes
- Testing with tempfiles and environment variables
Research
- Profiling Programming Language Learning
- Rust-lancet: Automated Ownership-Rule-Violation Fixing with Behavior Preservation
Crate of the Week
This week's crate is apistos, an OpenAPI documentation tool.
Thanks to Romain Lebran for the self-suggestion!
Please submit your suggestions and votes for next week!
Call for Participation; projects and speakers
CFP - Projects
Always wanted to contribute to open-source projects but did not know where to start? Every week we highlight some tasks from the Rust community for you to pick and get started!
Some of these tasks may also have mentors available, visit the task page for more information.
- Ockam - Have a single
SqlxDatabase
instance per process - Ockam - Improve database migrations to pair sql and rust migration code
- Ockam - Make install.sh not fail during upgrade process
- Hyperswitch - [FEATURE]: Make cache configuration configurable at runtime
- Hyperswitch - [FEATURE]: Implement Code cov for local system using makefile
- Hyperswitch - [FEATURE]: Setup code coverage for local tests & CI
- Hyperswitch - [FEATURE]: Add domain type for client secret
- Hyperswitch - [FEATURE]: Have get_required_value to use ValidationError in OptionExt
If you are a Rust project owner and are looking for contributors, please submit tasks here.
CFP - Speakers
Are you a new or experienced speaker looking for a place to share something cool? This section highlights events that are being planned and are accepting submissions to join their event as a speaker.
If you are an event organizer hoping to expand the reach of your event, please submit a link to the submission website through a PR to TWiR.
Updates from the Rust Project
453 pull requests were merged in the last week
HashMap
/HashSet
: forwardfold
implementations of iteratorsdead_code
treats#[repr(transparent)]
the same as#[repr(C)]
fix(rust-analyzer)
: use new pkgid spec to comparelarge_assignments
: Lint on specific large args passed to functionsmaybe_lint_impl_trait
: separateis_downgradable
fromis_object_safe
never_patterns
: Count!
bindings as divergingnever_patterns
: typecheck never patternspat_analysis
: Don't rely on contiguousVariantId
s outside of rustcpattern_analysis
: RemoveTy: Copy
boundproc_macro
: AddLiteral::c_string
constructorsingle_use_lifetimes
: Don't suggest deleting lifetimes with bounds- add
#[track_caller]
to the "From implies Into" impl - add
Ipv6Addr::is_ipv4_mapped
- add
PatKind::Err
to AST/HIR - add help message for
exclusive_range_pattern
error - add private
NonZero<T>
type alias - add way to express that no values are expected with check-cfg
- added
NonZeroXxx::from_mut(_unchecked)?
- allow any
const
expression blocks inthread_local!
- always use RevealAll for const eval queries
- avoid ICEs in trait names without
dyn
- consolidate logic around resolving built-in coroutine trait impls
- deny braced macro invocations in let-else
- detect
NulInCStr
error earlier - improve
let_underscore_lock
- improved
collapse_debuginfo
attribute, added command-line flag - make
unsafe_op_in_unsafe_fn
migrated in edition 2024 - restrict access to the private field of newtype indexes
- simplify
closure_env_ty
andclosure_env_param
- suggest
.swap()
when encountering conflicting borrows frommem::swap
on a slice - undeprecate lint
unstable_features
and make use of it in the compiler - make MIR pass name a compile-time constant
- make
stable_mir::with_tables
sound - SMIR: make the remaining "private" fields actually private
- use an interpreter in MIR jump threading
- use implied bounds compat mode in MIR borrowck
- validate AggregateKind types in MIR
- sandwich MIR optimizations between DSE
- cache local DefId-keyed queries without hashing
- pack u128 in the compiler to mitigate new alignment
- use UnhashMap for a few more maps
- fold arithmetic identities in GVN
- optimize large array creation in const-eval
- implement iterator specialization traits on more adapters
- optimize
EscapeAscii
's Display andCStr
's Debug - stabilise
bound_map
- stabilize
round_ties_even
- stabilize
slice_first_last_chunk
- stabilize single-field
offset_of!
- implement strict integer operations that panic on overflow
- core: introduce
split_at{,_mut}_checked
- un-hide
iter::repeat_n
- fix deallocation with wrong allocator in
(A)Rc::from_box_in
- use
bool
instead ofPartialOrd
as return value of the comparison closure in{slice,Iterator}::is_sorted_by
- regex: make
Input::new
guard against incorrectAsRef
implementations - cargo-rustdoc: use same path by output format logic everywhere
- cargo: use pkgid spec in in JSON messages
- cargo: remap common prefix only
- cargo doc: add a heading to highlight "How to find features enabled on dependencies"
- cargo: inherit jobserver from env for all kinds of runner
- cargo: fix precise-prerelease tracking link
- cargo: go back to passing an empty
values()
when no features are declared - cargo: improve GitHub Actions CI config
- rustdoc: Allows links in headings
- rustdoc: hide modals when resizing the sidebar
- rustfmt: check that a token can begin a nonterminal kind before parsing it as a macro arg
- rustfmt: add config option
generated_marker_line_search_limit
- clippy:
blocks_in_conditions
: do not warn if condition comes from macro - clippy:
default_numeric_fallback
: improve const context detection - clippy:
no_effect_underscore_binding: _
prefixed variables can be used - clippy:
unused_io_amount
capturesOk(_)
s - clippy: add
suspicious_open_options
lint - clippy: correctly handle type relative in
trait_duplication_in_bounds
lint - clippy: don't emit
derive_partial_eq_without_eq
lint if the type has thenon_exhaustive
attribute - clippy: find function path references early in the same lint pass
- clippy: fix FP on
semicolon_if_nothing_returned
- clippy: fix
multiple_crate_versions
to correctly normalize package names to avoid missing the local one - clippy: fix warning span for
no_effect_underscore_binding
- clippy: respect
#[allow]
attributes insingle_call_fn
lint - clippy: improve wording and fix dead link in description of
arc_with_non_send_sync
lint - rust-analyzer: add "One" import granularity
- rust-analyzer: add a new config to allow renaming of non-local defs
- rust-analyzer: goto type actions for notable trait hovers
- rust-analyzer: show additional value information when hovering over literals
- rust-analyzer: show notable implemented traits on hover
- rust-analyzer: add error recovery for
use_tree_list
parsing - rust-analyzer: fix panic when extracting
struct
fromenum
variant - rust-analyzer: fix progress reporting getting stuck
- rust-analyzer: handle
SelfParam
better in "Inline call" - rust-analyzer: include
for
construct in convert to guarded return conditions - rust-analyzer: infer
OUT_DIR
when workspace root contains a symlink - rust-analyzer: make
value_ty
query fallible - rust-analyzer: parse
macro_rules
as macro name
Rust Compiler Performance Triage
This week saw a bunch of regressions caused by correctness fixes and in general doing more work in the compiler. These were offset by many improvements (especially around hashing in the compiler) that improved performance by ~2% across a large number of benchmarks. Don't get too excited about the large 45+% wins though, these were only for tiny benchmarks like helloworld. They were caused by a change in Cargo which introduces stripping of debug symbols from Rust release binaries by default, and in turn also improves compilation time for small crates.
Triage done by @kobzol. Revision range: f9c2421a..d6b151fc
Summary:
(instructions:u) | mean | range | count |
---|---|---|---|
Regressions ❌ (primary) |
0.7% | [0.2%, 1.5%] | 11 |
Regressions ❌ (secondary) |
2.2% | [0.2%, 9.9%] | 26 |
Improvements ✅ (primary) |
-3.2% | [-47.5%, -0.2%] | 191 |
Improvements ✅ (secondary) |
-7.9% | [-46.5%, -0.1%] | 123 |
All ❌✅ (primary) | -3.0% | [-47.5%, 1.5%] | 202 |
4 Regressions, 4 Improvements, 9 Mixed; 4 of them in rollups 48 artifact comparisons made in total
Approved RFCs
Changes to Rust follow the Rust RFC (request for comments) process. These are the RFCs that were approved for implementation this week:
- No RFCs were approved this week.
Final Comment Period
Every week, the team announces the 'final comment period' for RFCs and key PRs which are reaching a decision. Express your opinions now.
RFCs
- No RFCs entered Final Comment Period this week.
Tracking Issues & PRs
- [disposition: close] Add a default flag for enum documentation
- [disposition: merge] impl
From<&[T; N]>
forCow<[T]>
- [disposition: merge] Tracking Issue for array_methods
Language Reference
- No Language Reference RFCs entered Final Comment Period this week.
Unsafe Code Guidelines
- No Unsafe Code Guideline RFCs entered Final Comment Period this week.
New and Updated RFCs
Call for Testing
An important step for RFC implementation is for people to experiment with the implementation and give feedback, especially before stabilization. The following RFCs would benefit from user testing before moving forward:
- No RFCs issued a call for testing this week.
If you are a feature implementer and would like your RFC to appear on the above list, add the new call-for-testing
label to your RFC along with a comment providing testing instructions and/or guidance on which aspect(s) of the feature
need testing.
Upcoming Events
Rusty Events between 2024-01-24 - 2024-02-21 🦀
Virtual
- 2024-01-24 | Virtual (Berlin, DE) | WeAreDevelopers Community
- 2024-01-25 | Virtual (Charlottesville, NC, US) | Charlottesville Rust Meetup
- 2024-01-25 | Virtual (Linz, AT) | Rust Linz
- 2024-01-25 | Virtual (Mexico City, DF, MX) | Rust MX
- 2024-01-28 | Virtual (Wrocław, PL) | Stacja IT Wrocław
- 2024-01-30 | Virtual | Bevy Game Development
- 2024-01-30 | Virtual (Buffalo, NY, US) | Buffalo Rust User Group
- 2024-01-30 | Virtual (Dallas, TX, US) | Dallas Rust
- 2024-01-31 | Virtual (Cardiff, UK) | Rust and C++ Cardiff
- 2024-02-01 | Virtual + In Person (Barcelona, ES) | BcnRust
- 2024-02-01 | Virtual (Berlin, DE) | OpenTechSchool Berlin + Rust Berlin
- 2024-02-03 | Virtual + In-person (Brussels, BE) | FOSDEM 2024
- 2024-02-03 | Virtual (Kampala, UG) | Rust Circle
- 2024-02-04 | Virtual | Rust Maven
- 2024-02-07 | Virtual (Indianapolis, IN, US) | Indy Rust
- 2024-02-08 | Virtual (Charlottesville, NC, US) | Charlottesville Rust Meetup
- 2024-02-08 | Virtual (Nürnberg, DE) | Rust Nüremberg
- 2024-02-10 | Virtual (Wrocław, PL) | Stacja IT Wrocław
- 2024-02-13 | Virtual (Dallas, TX, US) | Dallas Rust
- 2024-02-15 | Virtual (Berlin, DE) | OpenTechSchool Berlin + Rust Berlin
- 2024-02-21 | Virtual (Vancouver, BC, CA) | Vancouver Rust
Europe
- 2024-01-24 | Zagreb, HR | impl Zagreb for Rust
- 2024-01-25 | Augsburg, DE | Rust Meetup Augsburg
- 2024-01-25 | Vienna, AT | Rust Vienna
- 2024-02-01 | Hybrid (Barcelona, ES) | BcnRust
- 2024-02-03 | Brussels, BE | FOSDEM '24
- 2024-02-03 | Nürnberg, BY, DE | Paessler Rust Camp 2024
- 2024-02-06 | Bremen, DE | Rust Meetup Bremen
- 2024-02-07 | London, UK | Rust London User Group
- 2024-02-08 | Bern, CH | Rust Bern
North America
- 2024-01-24 | Austin, TX, US | Rust ATX
- 2024-01-27-28 | Calgary, AB, CA | Rust Calgary
- 2024-01-25 | Mountain View, CA, US | Mountain View Rust Meetup
- 2024-01-30 | Cambridge, MA, US | Boston Rust Meetup
- 2024-02-07 | Brookline, MA, US | Boston Rust Meetup
- 2024-02-12 | Minneapolis, MN, US | Minneapolis Rust Meetup
- 2024-02-13 | New York, NY, US | Rust NYC
- 2024-02-13 | Seattle, WA, US | Cap Hill Rust Coding/Hacking/Learning
- 2024-02-15 | Boston, MA, US | Boston Rust Meetup
- 2024-02-15 | Seattle, WA, US | Seattle Rust User Group
Oceania
- 2024-02-06 | Perth, WA, AU | Perth Rust Meetup Group
If you are running a Rust event please add it to the calendar to get it mentioned here. Please remember to add a link to the event too. Email the Rust Community Team for access.
Jobs
Please see the latest Who's Hiring thread on r/rust
Quote of the Week
The functional ML roots of the language, Graydon's first Rust compiler was written in OCaml, shine through, influencing it right from the start.
It's not "C++ but better".
It's Haskell standing on Lisp's shoulders, hiding in C's coat to sneak into PRDCTN. (The fancy nightclub where all the popular languages hang out)
– tris on his "No Boilerplate" Youtube channel
Thanks to PrototypeNM1 for the suggestion!
Please submit quotes and vote for next week!
This Week in Rust is edited by: nellshamrell, llogiq, cdmistman, ericseppanen, extrawurst, andrewpollack, U007D, kolharsam, joelmarcey, mariannegoldin, bennyvasquez.
Email list hosting is sponsored by The Rust Foundation