diff --git a/2023/07/01/rustfmt-supports-let-else-statements.html b/2023/07/01/rustfmt-supports-let-else-statements.html new file mode 100644 index 000000000..52ffd64de --- /dev/null +++ b/2023/07/01/rustfmt-supports-let-else-statements.html @@ -0,0 +1,153 @@ + + + + + Rustfmt support for let-else statements | Rust Blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+

Rustfmt support for let-else statements

+
+
+ +
July 1, 2023 · Caleb Cartwright + on behalf of the style team +
+ +
+

Rustfmt will add support for formatting let-else statements starting with the nightly 2023-07-02 toolchain, and then let-else formatting support should come to stable Rust as part of the 1.72 release.

+

Overview

+

let-else statements were stabilized back in 2022 as part of the 1.65.0 release. However, the current and previous versions of Rustfmt did not have formatting support for let-else statements. When Rustfmt encountered a let-else statement it would leave it alone and maintain the manual styling originally authored by the developer.

+

After updating to one of the toolchains with let-else formatting support, you may notice that cargo fmt/rustfmt invocations want to "change" the formatting of your let-else statements. However, this isn't actually a "change" in formatting, but instead is simply Rustfmt applying the let-else formatting rules for the very first time.

+

Rustfmt support for let-else statements has been a long standing request, and the Project has taken a number of steps to prevent a recurrence of the delay between feature stabilization and formatting support, as well as putting additional procedures in place which should enable more expeditious formatting support for nightly-only syntax.

+

Background and Context

+

Rust has an official Style Guide that articulates the default formatting style for Rust code. The Style Guide functions as a specification that defines the default formatting behavior for Rustfmt, and Rustfmt's primary mission is to provide automated formatting capabilities based around that Style Guide specification. Rustfmt is a direct consumer of the Style Guide, but Rustfmt does not unilaterally dictate what the default formatting style of language constructs should be.

+

The initial Style Guide was developed many years ago (beginning in 2016), and was driven by a Style Team in collaboration with the community through an RFC process. The Style Guide was then made official in 2018 via RFC 2436.

+

That initial Style Team was more akin to a Project Working Group in today's terms, as they had a fixed scope with a main goal to simply pull together the initial Style Guide. Accordingly that initial Style Team was disbanded once the Guide was made official.

+

There was subsequently no designated group within the Rust Project that was +explicitly responsible for the Style Guide, and no group explicitly focused on determining the official Style for new language constructs.

+

The absence of a team/group with ownership of the Style Guide didn't really cause problems at first, as the new syntax that came along during the first few years was comparatively non-controversial when it came to default style and formatting. However, over time challenges started to develop when there was increasingly less community consensus and no governing team within the Project to make the final decision about how new language syntax should be styled.

+

This was certainly the case with let-else statements, with lots of varying perspectives on how they should be styled. Without any team/group to make the decision and update the Style Guide with the official rules for let-else statements, Rustfmt was blocked and was unable to proceed.

+

These circumstances around let-else statements resulted in a greater understanding across the Project of the need to establish a team to own and maintain the Style Guide. However, it was also well understood that spinning up a new team and respective processes would take some time, and the decision was made to not block the stabilization of features that were otherwise fully ready to be stabilized, like let-else statements, in the nascency of such a new team and new processes.

+

Accordingly, let-else statements were stabilized and released without formatting support and with an understanding that the new Style Team and then subsequently the Rustfmt Team would later complete the requisite work required to incorporate formatting support.

+

Steps Taken

+

A number of steps have been taken to improve matters in this space. This includes steps to address the aforementioned issues and deal with some of the "style debt" that accrued over the years in the absence of a Style Team, and also to establish new processes and mechanisms to bring about other formatting/styling improvements.

+
    +
  • Launched a new, permanent Style Team that's responsible for the Style Guide.
  • +
  • Established a mechanism to evolve the default style while still maintaining stability guarantees (RFC 3338).
  • +
  • Developed a nightly-syntax-policy that provides clarity around style rules for unstable/nightly-only syntax, and enables Rustfmt to provide earlier support for such syntax.
  • +
+

Furthermore, the Style Team is also continuing to diligently work through the backlog of those "style debt" items, and the Rustfmt team is in turn actively working on respective formatting implementation. The Rustfmt team is also focused on growing the team in order to improve contributor and review capacity.

+

Conclusion

+

We know that many have wanted let-else formatting support for a while, and we're sorry it's taken this long. We also recognize that Rustfmt now starting to format let-else statements may cause some formatting churn, and that's a highly undesirable scenario we strive to avoid.

+

However, we believe the benefits of delivering let-else formatting support outweigh those drawbacks. While it's possible there may be another future case or two where we have to do something similar as we work through the style backlog, we're hopeful that over time this new team and these new processes will reduce (or eliminate) the possibility of a recurrence by addressing the historical problems that played such an outsize role in the let-else delay, and also bring about various other improvements.

+

Both the Style and Rustfmt teams hang out on Zulip so if you'd like to get more involved or have any questions please drop by on T-Style and/or T-Rustfmt.

+ +
+
+
+ + + + + + + + diff --git a/feed.xml b/feed.xml index 56eee933a..d4dbe0606 100644 --- a/feed.xml +++ b/feed.xml @@ -10,9 +10,49 @@ Maintained by the Rust Teams. https://github.com/rust-lang/blog.rust-lang.org/ - 2023-06-23T09:26:30+00:00 + 2023-07-03T17:56:39+00:00 + + Rustfmt support for let-else statements + + 2023-07-01T00:00:00+00:00 + 2023-07-01T00:00:00+00:00 + https://blog.rust-lang.org/2023/07/01/rustfmt-supports-let-else-statements.html + <p>Rustfmt will add support for formatting <a href="https://doc.rust-lang.org/rust-by-example/flow_control/let_else.html">let-else statements</a> starting with the nightly 2023-07-02 toolchain, and then let-else formatting support should come to stable Rust as part of the 1.72 release.</p> +<h2><a href="#overview" aria-hidden="true" class="anchor" id="overview"></a>Overview</h2> +<p>let-else statements were <a href="https://blog.rust-lang.org/2022/11/03/Rust-1.65.0.html#let-else-statements">stabilized</a> back in 2022 as part of the 1.65.0 release. However, the current and previous versions of Rustfmt did not have formatting support for let-else statements. When Rustfmt encountered a let-else statement it would leave it alone and maintain the manual styling originally authored by the developer.</p> +<p>After updating to one of the toolchains with let-else formatting support, you may notice that <code>cargo fmt</code>/<code>rustfmt</code> invocations want to &quot;change&quot; the formatting of your let-else statements. However, this isn't actually a &quot;change&quot; in formatting, but instead is simply Rustfmt applying the <a href="https://doc.rust-lang.org/nightly/style-guide/statements.html#else-blocks-let-else-statements">let-else formatting rules</a> for the very first time.</p> +<p>Rustfmt support for let-else statements has been a long standing request, and the Project has taken a number of steps to prevent a recurrence of the delay between feature stabilization and formatting support, as well as putting additional procedures in place which should enable more expeditious formatting support for nightly-only syntax.</p> +<h2><a href="#background-and-context" aria-hidden="true" class="anchor" id="background-and-context"></a>Background and Context</h2> +<p>Rust has an official <a href="https://doc.rust-lang.org/nightly/style-guide/">Style Guide</a> that articulates the default formatting style for Rust code. The Style Guide functions as a specification that defines the default formatting behavior for Rustfmt, and Rustfmt's primary mission is to provide automated formatting capabilities based around that Style Guide specification. Rustfmt is a direct consumer of the Style Guide, but Rustfmt does not unilaterally dictate what the default formatting style of language constructs should be.</p> +<p>The initial Style Guide was developed many years ago (beginning in 2016), and was driven by a Style Team in collaboration with the community through an RFC process. The Style Guide was then made official in 2018 via <a href="https://rust-lang.github.io/rfcs/2436-style-guide.html">RFC 2436</a>.</p> +<p>That initial Style Team was more akin to a Project Working Group in today's terms, as they had a fixed scope with a main goal to simply pull together the initial Style Guide. Accordingly that initial Style Team was disbanded once the Guide was made official.</p> +<p>There was subsequently no designated group within the Rust Project that was +explicitly responsible for the Style Guide, and no group explicitly focused on determining the official Style for new language constructs.</p> +<p>The absence of a team/group with ownership of the Style Guide didn't really cause problems at first, as the new syntax that came along during the first few years was comparatively non-controversial when it came to default style and formatting. However, over time challenges started to develop when there was increasingly less community consensus and no governing team within the Project to make the final decision about how new language syntax should be styled.</p> +<p>This was certainly the case with let-else statements, with lots of varying perspectives on how they should be styled. Without any team/group to make the decision and update the Style Guide with the official rules for let-else statements, Rustfmt was blocked and was unable to proceed.</p> +<p>These circumstances around let-else statements resulted in a greater understanding across the Project of the need to establish a team to own and maintain the Style Guide. However, it was also well understood that spinning up a new team and respective processes would take some time, and the decision was made to not block the stabilization of features that were otherwise fully ready to be stabilized, like let-else statements, in the nascency of such a new team and new processes.</p> +<p>Accordingly, let-else statements were stabilized and released without formatting support and with an understanding that the new Style Team and then subsequently the Rustfmt Team would later complete the requisite work required to incorporate formatting support.</p> +<h2><a href="#steps-taken" aria-hidden="true" class="anchor" id="steps-taken"></a>Steps Taken</h2> +<p>A number of steps have been taken to improve matters in this space. This includes steps to address the aforementioned issues and deal with some of the &quot;style debt&quot; that accrued over the years in the absence of a Style Team, and also to establish new processes and mechanisms to bring about other formatting/styling improvements.</p> +<ul> +<li><a href="https://rust-lang.github.io/rfcs/3309-style-team.html">Launched a new, permanent Style Team</a> that's responsible for the Style Guide.</li> +<li>Established a mechanism to evolve the default style while still maintaining stability guarantees (<a href="https://rust-lang.github.io/rfcs/3338-style-evolution.html">RFC 3338</a>).</li> +<li>Developed a <a href="https://github.com/rust-lang/style-team/blob/468570a02856a6bbe3994164e1a16a13b56b5cf4/nightly-style-procedure.md">nightly-syntax-policy</a> that provides clarity around style rules for unstable/nightly-only syntax, and enables Rustfmt to provide earlier support for such syntax.</li> +</ul> +<p>Furthermore, the Style Team is also continuing to diligently work through the backlog of those &quot;style debt&quot; items, and the Rustfmt team is in turn actively working on respective formatting implementation. The Rustfmt team is also focused on growing the team in order to improve contributor and review capacity.</p> +<h2><a href="#conclusion" aria-hidden="true" class="anchor" id="conclusion"></a>Conclusion</h2> +<p>We know that many have wanted let-else formatting support for a while, and we're sorry it's taken this long. We also recognize that Rustfmt now starting to format let-else statements may cause some formatting churn, and that's a highly undesirable scenario we strive to avoid.</p> +<p>However, we believe the benefits of delivering let-else formatting support outweigh those drawbacks. While it's possible there may be another future case or two where we have to do something similar as we work through the style backlog, we're hopeful that over time this new team and these new processes will reduce (or eliminate) the possibility of a recurrence by addressing the historical problems that played such an outsize role in the let-else delay, and also bring about various other improvements.</p> +<p>Both the Style and Rustfmt teams hang out on Zulip so if you'd like to get more involved or have any questions please drop by on <a href="https://rust-lang.zulipchat.com/#narrow/stream/346005-t-style">T-Style</a> and/or <a href="https://rust-lang.zulipchat.com/#narrow/stream/357797-t-rustfmt">T-Rustfmt</a>.</p> + + + + Caleb Cartwright + + + Improved API tokens for crates.io @@ -574,120 +614,6 @@ ThinLTO despite compiling to a dylib.</p> <h3><a href="#contributors-to-1681" aria-hidden="true" class="anchor" id="contributors-to-1681"></a>Contributors to 1.68.1</h3> <p>Many people came together to create Rust 1.68.1. We couldn't have done it without all of you. <a href="https://thanks.rust-lang.org/rust/1.68.1/">Thanks!</a></p> - - - - The Rust Release Team - - - - - Announcing Rust 1.68.0 - - 2023-03-09T00:00:00+00:00 - 2023-03-09T00:00:00+00:00 - https://blog.rust-lang.org/2023/03/09/Rust-1.68.0.html - <p>The Rust team is happy to announce a new version of Rust, 1.68.0. Rust is a -programming language empowering everyone to build reliable and efficient -software.</p> -<p>If you have a previous version of Rust installed via rustup, you can get 1.68.0 -with:</p> -<pre><code class="language-console">rustup update stable -</code></pre> -<p>If you don't have it already, you can <a href="https://www.rust-lang.org/install.html">get -<code>rustup</code></a> from the appropriate page on -our website, and check out the <a href="https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1680-2023-03-09">detailed release notes for -1.68.0</a> -on GitHub.</p> -<p>If you'd like to help us out by testing future releases, you might consider -updating locally to use the beta channel (<code>rustup default beta</code>) or the nightly -channel (<code>rustup default nightly</code>). Please -<a href="https://github.com/rust-lang/rust/issues/new/choose">report</a> any bugs you -might come across!</p> -<h2><a href="#whats-in-1680-stable" aria-hidden="true" class="anchor" id="whats-in-1680-stable"></a>What's in 1.68.0 stable</h2> -<h3><a href="#cargos-sparse-protocol" aria-hidden="true" class="anchor" id="cargos-sparse-protocol"></a>Cargo's sparse protocol</h3> -<p>Cargo's &quot;sparse&quot; registry protocol has been stabilized for reading the index of -crates, along with infrastructure at <code>https://index.crates.io/</code> for those -published in the primary crates.io registry. The prior git protocol (which is -still the default) clones a repository that indexes <em>all</em> crates available in -the registry, but this has started to hit scaling limitations, with noticeable -delays while updating that repository. The new protocol should provide a -significant performance improvement when accessing crates.io, as it will only -download information about the subset of crates that you actually use.</p> -<p>To use the sparse protocol with crates.io, set the environment variable -<code>CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse</code>, or edit your -<a href="https://doc.rust-lang.org/cargo/reference/config.html"><code>.cargo/config.toml</code> file</a> -to add:</p> -<pre><code class="language-toml">[registries.crates-io] -protocol = &quot;sparse&quot; -</code></pre> -<p>The sparse protocol is currently planned to become the default for crates.io in -the 1.70.0 release in a few months. For more information, please see the prior -<a href="https://blog.rust-lang.org/inside-rust/2023/01/30/cargo-sparse-protocol.html">announcement</a> -on the Inside Rust Blog, as well as -<a href="https://rust-lang.github.io/rfcs/2789-sparse-index.html">RFC 2789</a> -and the current -<a href="https://doc.rust-lang.org/stable/cargo/reference/registry-index.html#sparse-protocol">documentation</a> -in the Cargo Book.</p> -<h3><a href="#local-pin-construction" aria-hidden="true" class="anchor" id="local-pin-construction"></a>Local <code>Pin</code> construction</h3> -<p>The new <a href="https://doc.rust-lang.org/stable/std/pin/macro.pin.html"><code>pin!</code></a> macro -constructs a <code>Pin&lt;&amp;mut T&gt;</code> from a <code>T</code> expression, anonymously captured in local -state. This is often called stack-pinning, but that &quot;stack&quot; could also be the -captured state of an <code>async fn</code> or block. This macro is similar to some crates, -like <a href="https://docs.rs/tokio/1/tokio/macro.pin.html"><code>tokio::pin!</code></a>, but the -standard library can take advantage of <code>Pin</code> internals and <a href="https://doc.rust-lang.org/stable/reference/destructors.html#temporary-lifetime-extension">temporary lifetime -extension</a> -for a more expression-like macro.</p> -<pre><code class="language-rust">/// Runs a future to completion. -fn block_on&lt;F: Future&gt;(future: F) -&gt; F::Output { - let waker_that_unparks_thread = todo!(); - let mut cx = Context::from_waker(&amp;waker_that_unparks_thread); - // Pin the future so it can be polled. - let mut pinned_future = pin!(future); - loop { - match pinned_future.as_mut().poll(&amp;mut cx) { - Poll::Pending =&gt; thread::park(), - Poll::Ready(result) =&gt; return result, - } - } -} -</code></pre> -<p>In this example, the original <code>future</code> will be moved into a temporary local, -referenced by the new <code>pinned_future</code> with type <code>Pin&lt;&amp;mut F&gt;</code>, and that pin is -subject to the normal borrow checker to make sure it can't outlive that local.</p> -<h3><a href="#default-alloc-error-handler" aria-hidden="true" class="anchor" id="default-alloc-error-handler"></a>Default <code>alloc</code> error handler</h3> -<p>When allocation fails in Rust, APIs like <code>Box::new</code> and <code>Vec::push</code> have no way -to indicate that failure, so some divergent execution path needs to be taken. -When using the <code>std</code> crate, the program will print to <code>stderr</code> and abort. -As of Rust 1.68.0, binaries which include <code>std</code> will continue to have -this behavior. Binaries which do not include <code>std</code>, only including <code>alloc</code>, will now <code>panic!</code> -on allocation failure, which may be further adjusted via a <code>#[panic_handler]</code> if desired.</p> -<p>In the future, it's likely that the behavior for <code>std</code> will also be changed to match that of <code>alloc</code>-only binaries.</p> -<h3><a href="#stabilized-apis" aria-hidden="true" class="anchor" id="stabilized-apis"></a>Stabilized APIs</h3> -<ul> -<li><a href="https://doc.rust-lang.org/stable/std/pin/macro.pin.html"><code>{core,std}::pin::pin!</code></a></li> -<li><a href="https://doc.rust-lang.org/stable/std/primitive.f32.html#impl-From%3Cbool%3E-for-f32"><code>impl From&lt;bool&gt; for {f32,f64}</code></a></li> -<li><a href="https://doc.rust-lang.org/stable/std/path/constant.MAIN_SEPARATOR_STR.html"><code>std::path::MAIN_SEPARATOR_STR</code></a></li> -<li><a href="https://doc.rust-lang.org/stable/std/path/struct.PathBuf.html#impl-DerefMut-for-PathBuf"><code>impl DerefMut for PathBuf</code></a></li> -</ul> -<p>These APIs are now stable in const contexts:</p> -<ul> -<li><a href="https://doc.rust-lang.org/stable/std/collections/struct.VecDeque.html#method.new"><code>VecDeque::new</code></a></li> -</ul> -<h3><a href="#other-changes" aria-hidden="true" class="anchor" id="other-changes"></a>Other changes</h3> -<ul> -<li>As <a href="https://blog.rust-lang.org/2023/01/09/android-ndk-update-r25.html">previously announced</a>, -Android platform support in Rust is now targeting NDK r25, which corresponds to -a minimum supported API level of 19 (KitKat).</li> -</ul> -<p>Check out everything that changed in -<a href="https://github.com/rust-lang/rust/blob/stable/RELEASES.md#version-1680-2023-03-09">Rust</a>, -<a href="https://github.com/rust-lang/cargo/blob/master/CHANGELOG.md#cargo-168-2023-03-09">Cargo</a>, -and <a href="https://github.com/rust-lang/rust-clippy/blob/master/CHANGELOG.md#rust-168">Clippy</a>.</p> -<h3><a href="#contributors-to-1680" aria-hidden="true" class="anchor" id="contributors-to-1680"></a>Contributors to 1.68.0</h3> -<p>Many people came together to create Rust 1.68.0. -We couldn't have done it without all of you. -<a href="https://thanks.rust-lang.org/rust/1.68.0/">Thanks!</a></p> diff --git a/index.html b/index.html index e2d28fabc..650c873f5 100644 --- a/index.html +++ b/index.html @@ -86,6 +86,12 @@

Posts in 2023

+ + July 1 + Rustfmt support for let-else statements + + + June 23 Improved API tokens for crates.io diff --git a/inside-rust/feed.xml b/inside-rust/feed.xml index 8922a6e37..d75c9eba1 100644 --- a/inside-rust/feed.xml +++ b/inside-rust/feed.xml @@ -10,7 +10,7 @@ Maintained by the Rust Teams. https://github.com/rust-lang/blog.rust-lang.org/
- 2023-06-23T09:26:28+00:00 + 2023-07-03T17:56:41+00:00 diff --git a/inside-rust/releases.json b/inside-rust/releases.json index b860342d9..711cfcc0c 100644 --- a/inside-rust/releases.json +++ b/inside-rust/releases.json @@ -1 +1 @@ -{"releases":[],"feed_updated":"2023-06-23T09:26:28+00:00"} \ No newline at end of file +{"releases":[],"feed_updated":"2023-07-03T17:56:41+00:00"} \ No newline at end of file diff --git a/releases.json b/releases.json index fcb733e3b..fdd558c67 100644 --- a/releases.json +++ b/releases.json @@ -1 +1 @@ -{"releases":[{"title":"Announcing Rust 1.70.0","url":"2023/06/01/Rust-1.70.0.html"},{"title":"Announcing Rust 1.69.0","url":"2023/04/20/Rust-1.69.0.html"},{"title":"Announcing Rust 1.68.2","url":"2023/03/28/Rust-1.68.2.html"},{"title":"Announcing Rust 1.68.1","url":"2023/03/23/Rust-1.68.1.html"},{"title":"Announcing Rust 1.68.0","url":"2023/03/09/Rust-1.68.0.html"},{"title":"Announcing Rust 1.67.1","url":"2023/02/09/Rust-1.67.1.html"},{"title":"Announcing Rust 1.67.0","url":"2023/01/26/Rust-1.67.0.html"},{"title":"Announcing Rust 1.66.1","url":"2023/01/10/Rust-1.66.1.html"},{"title":"Announcing Rust 1.66.0","url":"2022/12/15/Rust-1.66.0.html"},{"title":"Announcing Rust 1.65.0","url":"2022/11/03/Rust-1.65.0.html"},{"title":"Announcing Rust 1.64.0","url":"2022/09/22/Rust-1.64.0.html"},{"title":"Announcing Rust 1.63.0","url":"2022/08/11/Rust-1.63.0.html"},{"title":"Announcing Rust 1.62.1","url":"2022/07/19/Rust-1.62.1.html"},{"title":"Announcing Rust 1.62.0","url":"2022/06/30/Rust-1.62.0.html"},{"title":"Announcing Rust 1.61.0","url":"2022/05/19/Rust-1.61.0.html"},{"title":"Announcing Rust 1.60.0","url":"2022/04/07/Rust-1.60.0.html"},{"title":"Announcing Rust 1.59.0","url":"2022/02/24/Rust-1.59.0.html"},{"title":"Announcing Rust 1.58.1","url":"2022/01/20/Rust-1.58.1.html"},{"title":"Announcing Rust 1.58.0","url":"2022/01/13/Rust-1.58.0.html"},{"title":"Announcing Rust 1.57.0","url":"2021/12/02/Rust-1.57.0.html"},{"title":"Announcing Rust 1.56.1","url":"2021/11/01/Rust-1.56.1.html"},{"title":"Announcing Rust 1.56.0 and Rust 2021","url":"2021/10/21/Rust-1.56.0.html"},{"title":"Announcing Rust 1.55.0","url":"2021/09/09/Rust-1.55.0.html"},{"title":"Announcing Rust 1.54.0","url":"2021/07/29/Rust-1.54.0.html"},{"title":"Announcing Rust 1.53.0","url":"2021/06/17/Rust-1.53.0.html"},{"title":"Announcing Rust 1.52.1","url":"2021/05/10/Rust-1.52.1.html"},{"title":"Announcing Rust 1.52.0","url":"2021/05/06/Rust-1.52.0.html"},{"title":"Announcing Rust 1.51.0","url":"2021/03/25/Rust-1.51.0.html"},{"title":"Announcing Rust 1.50.0","url":"2021/02/11/Rust-1.50.0.html"},{"title":"Announcing Rust 1.49.0","url":"2020/12/31/Rust-1.49.0.html"},{"title":"Announcing Rust 1.48.0","url":"2020/11/19/Rust-1.48.html"},{"title":"Announcing Rust 1.47.0","url":"2020/10/08/Rust-1.47.html"},{"title":"Announcing Rust 1.46.0","url":"2020/08/27/Rust-1.46.0.html"},{"title":"Announcing Rust 1.45.2","url":"2020/08/03/Rust-1.45.2.html"},{"title":"Announcing Rust 1.45.1","url":"2020/07/30/Rust-1.45.1.html"},{"title":"Announcing Rust 1.45.0","url":"2020/07/16/Rust-1.45.0.html"},{"title":"Announcing Rust 1.44.1","url":"2020/06/18/Rust.1.44.1.html"},{"title":"Announcing Rust 1.44.0","url":"2020/06/04/Rust-1.44.0.html"},{"title":"Announcing Rust 1.43.1","url":"2020/05/07/Rust.1.43.1.html"},{"title":"Announcing Rust 1.43.0","url":"2020/04/23/Rust-1.43.0.html"},{"title":"Announcing Rust 1.42.0","url":"2020/03/12/Rust-1.42.html"},{"title":"Announcing Rust 1.41.1","url":"2020/02/27/Rust-1.41.1.html"},{"title":"Announcing Rust 1.41.0","url":"2020/01/30/Rust-1.41.0.html"},{"title":"Announcing Rust 1.40.0","url":"2019/12/19/Rust-1.40.0.html"},{"title":"Announcing Rust 1.39.0","url":"2019/11/07/Rust-1.39.0.html"},{"title":"Announcing Rust 1.38.0","url":"2019/09/26/Rust-1.38.0.html"},{"title":"Announcing Rust 1.37.0","url":"2019/08/15/Rust-1.37.0.html"},{"title":"Announcing Rust 1.36.0","url":"2019/07/04/Rust-1.36.0.html"},{"title":"Announcing Rust 1.35.0","url":"2019/05/23/Rust-1.35.0.html"},{"title":"Announcing Rust 1.34.2","url":"2019/05/14/Rust-1.34.2.html"},{"title":"Announcing Rust 1.34.1","url":"2019/04/25/Rust-1.34.1.html"},{"title":"Announcing Rust 1.34.0","url":"2019/04/11/Rust-1.34.0.html"},{"title":"Announcing Rust 1.33.0","url":"2019/02/28/Rust-1.33.0.html"},{"title":"Announcing Rust 1.32.0","url":"2019/01/17/Rust-1.32.0.html"},{"title":"Announcing Rust 1.31.1","url":"2018/12/20/Rust-1.31.1.html"},{"title":"Announcing Rust 1.31 and Rust 2018","url":"2018/12/06/Rust-1.31-and-rust-2018.html"},{"title":"Announcing Rust 1.30.1","url":"2018/11/08/Rust-1.30.1.html"},{"title":"Announcing Rust 1.30","url":"2018/10/25/Rust-1.30.0.html"},{"title":"Announcing Rust 1.29.2","url":"2018/10/12/Rust-1.29.2.html"},{"title":"Announcing Rust 1.29.1","url":"2018/09/25/Rust-1.29.1.html"},{"title":"Announcing Rust 1.29","url":"2018/09/13/Rust-1.29.html"},{"title":"Announcing Rust 1.28","url":"2018/08/02/Rust-1.28.html"},{"title":"Announcing Rust 1.27.2","url":"2018/07/20/Rust-1.27.2.html"},{"title":"Announcing Rust 1.27.1","url":"2018/07/10/Rust-1.27.1.html"},{"title":"Announcing Rust 1.27","url":"2018/06/21/Rust-1.27.html"},{"title":"Announcing Rust 1.26.2","url":"2018/06/05/Rust-1.26.2.html"},{"title":"Announcing Rust 1.26.1","url":"2018/05/29/Rust-1.26.1.html"},{"title":"Announcing Rust 1.26","url":"2018/05/10/Rust-1.26.html"},{"title":"Announcing Rust 1.25","url":"2018/03/29/Rust-1.25.html"},{"title":"Announcing Rust 1.24.1","url":"2018/03/01/Rust-1.24.1.html"},{"title":"Announcing Rust 1.24","url":"2018/02/15/Rust-1.24.html"},{"title":"Announcing Rust 1.23","url":"2018/01/04/Rust-1.23.html"},{"title":"Announcing Rust 1.22 (and 1.22.1)","url":"2017/11/22/Rust-1.22.html"},{"title":"Announcing Rust 1.21","url":"2017/10/12/Rust-1.21.html"},{"title":"Announcing Rust 1.20","url":"2017/08/31/Rust-1.20.html"},{"title":"Announcing Rust 1.19","url":"2017/07/20/Rust-1.19.html"},{"title":"Announcing Rust 1.18","url":"2017/06/08/Rust-1.18.html"},{"title":"Announcing Rust 1.17","url":"2017/04/27/Rust-1.17.html"},{"title":"Announcing Rust 1.16","url":"2017/03/16/Rust-1.16.html"},{"title":"Announcing Rust 1.15.1","url":"2017/02/09/Rust-1.15.1.html"},{"title":"Announcing Rust 1.15","url":"2017/02/02/Rust-1.15.html"},{"title":"Announcing Rust 1.14","url":"2016/12/22/Rust-1.14.html"},{"title":"Announcing Rust 1.13","url":"2016/11/10/Rust-1.13.html"},{"title":"Announcing Rust 1.12.1","url":"2016/10/20/Rust-1.12.1.html"},{"title":"Announcing Rust 1.12","url":"2016/09/29/Rust-1.12.html"},{"title":"Announcing Rust 1.11","url":"2016/08/18/Rust-1.11.html"},{"title":"Announcing Rust 1.10","url":"2016/07/07/Rust-1.10.html"},{"title":"Announcing Rust 1.9","url":"2016/05/26/Rust-1.9.html"},{"title":"Announcing Rust 1.8","url":"2016/04/14/Rust-1.8.html"},{"title":"Announcing Rust 1.7","url":"2016/03/02/Rust-1.7.html"},{"title":"Announcing Rust 1.6","url":"2016/01/21/Rust-1.6.html"},{"title":"Announcing Rust 1.5","url":"2015/12/10/Rust-1.5.html"},{"title":"Announcing Rust 1.4","url":"2015/10/29/Rust-1.4.html"},{"title":"Announcing Rust 1.3","url":"2015/09/17/Rust-1.3.html"},{"title":"Announcing Rust 1.2","url":"2015/08/06/Rust-1.2.html"},{"title":"Rust 1.1 stable, the Community Subteam, and RustCamp","url":"2015/06/25/Rust-1.1.html"},{"title":"Announcing Rust 1.0","url":"2015/05/15/Rust-1.0.html"}],"feed_updated":"2023-06-23T09:26:30+00:00"} \ No newline at end of file +{"releases":[{"title":"Announcing Rust 1.70.0","url":"2023/06/01/Rust-1.70.0.html"},{"title":"Announcing Rust 1.69.0","url":"2023/04/20/Rust-1.69.0.html"},{"title":"Announcing Rust 1.68.2","url":"2023/03/28/Rust-1.68.2.html"},{"title":"Announcing Rust 1.68.1","url":"2023/03/23/Rust-1.68.1.html"},{"title":"Announcing Rust 1.68.0","url":"2023/03/09/Rust-1.68.0.html"},{"title":"Announcing Rust 1.67.1","url":"2023/02/09/Rust-1.67.1.html"},{"title":"Announcing Rust 1.67.0","url":"2023/01/26/Rust-1.67.0.html"},{"title":"Announcing Rust 1.66.1","url":"2023/01/10/Rust-1.66.1.html"},{"title":"Announcing Rust 1.66.0","url":"2022/12/15/Rust-1.66.0.html"},{"title":"Announcing Rust 1.65.0","url":"2022/11/03/Rust-1.65.0.html"},{"title":"Announcing Rust 1.64.0","url":"2022/09/22/Rust-1.64.0.html"},{"title":"Announcing Rust 1.63.0","url":"2022/08/11/Rust-1.63.0.html"},{"title":"Announcing Rust 1.62.1","url":"2022/07/19/Rust-1.62.1.html"},{"title":"Announcing Rust 1.62.0","url":"2022/06/30/Rust-1.62.0.html"},{"title":"Announcing Rust 1.61.0","url":"2022/05/19/Rust-1.61.0.html"},{"title":"Announcing Rust 1.60.0","url":"2022/04/07/Rust-1.60.0.html"},{"title":"Announcing Rust 1.59.0","url":"2022/02/24/Rust-1.59.0.html"},{"title":"Announcing Rust 1.58.1","url":"2022/01/20/Rust-1.58.1.html"},{"title":"Announcing Rust 1.58.0","url":"2022/01/13/Rust-1.58.0.html"},{"title":"Announcing Rust 1.57.0","url":"2021/12/02/Rust-1.57.0.html"},{"title":"Announcing Rust 1.56.1","url":"2021/11/01/Rust-1.56.1.html"},{"title":"Announcing Rust 1.56.0 and Rust 2021","url":"2021/10/21/Rust-1.56.0.html"},{"title":"Announcing Rust 1.55.0","url":"2021/09/09/Rust-1.55.0.html"},{"title":"Announcing Rust 1.54.0","url":"2021/07/29/Rust-1.54.0.html"},{"title":"Announcing Rust 1.53.0","url":"2021/06/17/Rust-1.53.0.html"},{"title":"Announcing Rust 1.52.1","url":"2021/05/10/Rust-1.52.1.html"},{"title":"Announcing Rust 1.52.0","url":"2021/05/06/Rust-1.52.0.html"},{"title":"Announcing Rust 1.51.0","url":"2021/03/25/Rust-1.51.0.html"},{"title":"Announcing Rust 1.50.0","url":"2021/02/11/Rust-1.50.0.html"},{"title":"Announcing Rust 1.49.0","url":"2020/12/31/Rust-1.49.0.html"},{"title":"Announcing Rust 1.48.0","url":"2020/11/19/Rust-1.48.html"},{"title":"Announcing Rust 1.47.0","url":"2020/10/08/Rust-1.47.html"},{"title":"Announcing Rust 1.46.0","url":"2020/08/27/Rust-1.46.0.html"},{"title":"Announcing Rust 1.45.2","url":"2020/08/03/Rust-1.45.2.html"},{"title":"Announcing Rust 1.45.1","url":"2020/07/30/Rust-1.45.1.html"},{"title":"Announcing Rust 1.45.0","url":"2020/07/16/Rust-1.45.0.html"},{"title":"Announcing Rust 1.44.1","url":"2020/06/18/Rust.1.44.1.html"},{"title":"Announcing Rust 1.44.0","url":"2020/06/04/Rust-1.44.0.html"},{"title":"Announcing Rust 1.43.1","url":"2020/05/07/Rust.1.43.1.html"},{"title":"Announcing Rust 1.43.0","url":"2020/04/23/Rust-1.43.0.html"},{"title":"Announcing Rust 1.42.0","url":"2020/03/12/Rust-1.42.html"},{"title":"Announcing Rust 1.41.1","url":"2020/02/27/Rust-1.41.1.html"},{"title":"Announcing Rust 1.41.0","url":"2020/01/30/Rust-1.41.0.html"},{"title":"Announcing Rust 1.40.0","url":"2019/12/19/Rust-1.40.0.html"},{"title":"Announcing Rust 1.39.0","url":"2019/11/07/Rust-1.39.0.html"},{"title":"Announcing Rust 1.38.0","url":"2019/09/26/Rust-1.38.0.html"},{"title":"Announcing Rust 1.37.0","url":"2019/08/15/Rust-1.37.0.html"},{"title":"Announcing Rust 1.36.0","url":"2019/07/04/Rust-1.36.0.html"},{"title":"Announcing Rust 1.35.0","url":"2019/05/23/Rust-1.35.0.html"},{"title":"Announcing Rust 1.34.2","url":"2019/05/14/Rust-1.34.2.html"},{"title":"Announcing Rust 1.34.1","url":"2019/04/25/Rust-1.34.1.html"},{"title":"Announcing Rust 1.34.0","url":"2019/04/11/Rust-1.34.0.html"},{"title":"Announcing Rust 1.33.0","url":"2019/02/28/Rust-1.33.0.html"},{"title":"Announcing Rust 1.32.0","url":"2019/01/17/Rust-1.32.0.html"},{"title":"Announcing Rust 1.31.1","url":"2018/12/20/Rust-1.31.1.html"},{"title":"Announcing Rust 1.31 and Rust 2018","url":"2018/12/06/Rust-1.31-and-rust-2018.html"},{"title":"Announcing Rust 1.30.1","url":"2018/11/08/Rust-1.30.1.html"},{"title":"Announcing Rust 1.30","url":"2018/10/25/Rust-1.30.0.html"},{"title":"Announcing Rust 1.29.2","url":"2018/10/12/Rust-1.29.2.html"},{"title":"Announcing Rust 1.29.1","url":"2018/09/25/Rust-1.29.1.html"},{"title":"Announcing Rust 1.29","url":"2018/09/13/Rust-1.29.html"},{"title":"Announcing Rust 1.28","url":"2018/08/02/Rust-1.28.html"},{"title":"Announcing Rust 1.27.2","url":"2018/07/20/Rust-1.27.2.html"},{"title":"Announcing Rust 1.27.1","url":"2018/07/10/Rust-1.27.1.html"},{"title":"Announcing Rust 1.27","url":"2018/06/21/Rust-1.27.html"},{"title":"Announcing Rust 1.26.2","url":"2018/06/05/Rust-1.26.2.html"},{"title":"Announcing Rust 1.26.1","url":"2018/05/29/Rust-1.26.1.html"},{"title":"Announcing Rust 1.26","url":"2018/05/10/Rust-1.26.html"},{"title":"Announcing Rust 1.25","url":"2018/03/29/Rust-1.25.html"},{"title":"Announcing Rust 1.24.1","url":"2018/03/01/Rust-1.24.1.html"},{"title":"Announcing Rust 1.24","url":"2018/02/15/Rust-1.24.html"},{"title":"Announcing Rust 1.23","url":"2018/01/04/Rust-1.23.html"},{"title":"Announcing Rust 1.22 (and 1.22.1)","url":"2017/11/22/Rust-1.22.html"},{"title":"Announcing Rust 1.21","url":"2017/10/12/Rust-1.21.html"},{"title":"Announcing Rust 1.20","url":"2017/08/31/Rust-1.20.html"},{"title":"Announcing Rust 1.19","url":"2017/07/20/Rust-1.19.html"},{"title":"Announcing Rust 1.18","url":"2017/06/08/Rust-1.18.html"},{"title":"Announcing Rust 1.17","url":"2017/04/27/Rust-1.17.html"},{"title":"Announcing Rust 1.16","url":"2017/03/16/Rust-1.16.html"},{"title":"Announcing Rust 1.15.1","url":"2017/02/09/Rust-1.15.1.html"},{"title":"Announcing Rust 1.15","url":"2017/02/02/Rust-1.15.html"},{"title":"Announcing Rust 1.14","url":"2016/12/22/Rust-1.14.html"},{"title":"Announcing Rust 1.13","url":"2016/11/10/Rust-1.13.html"},{"title":"Announcing Rust 1.12.1","url":"2016/10/20/Rust-1.12.1.html"},{"title":"Announcing Rust 1.12","url":"2016/09/29/Rust-1.12.html"},{"title":"Announcing Rust 1.11","url":"2016/08/18/Rust-1.11.html"},{"title":"Announcing Rust 1.10","url":"2016/07/07/Rust-1.10.html"},{"title":"Announcing Rust 1.9","url":"2016/05/26/Rust-1.9.html"},{"title":"Announcing Rust 1.8","url":"2016/04/14/Rust-1.8.html"},{"title":"Announcing Rust 1.7","url":"2016/03/02/Rust-1.7.html"},{"title":"Announcing Rust 1.6","url":"2016/01/21/Rust-1.6.html"},{"title":"Announcing Rust 1.5","url":"2015/12/10/Rust-1.5.html"},{"title":"Announcing Rust 1.4","url":"2015/10/29/Rust-1.4.html"},{"title":"Announcing Rust 1.3","url":"2015/09/17/Rust-1.3.html"},{"title":"Announcing Rust 1.2","url":"2015/08/06/Rust-1.2.html"},{"title":"Rust 1.1 stable, the Community Subteam, and RustCamp","url":"2015/06/25/Rust-1.1.html"},{"title":"Announcing Rust 1.0","url":"2015/05/15/Rust-1.0.html"}],"feed_updated":"2023-07-03T17:56:39+00:00"} \ No newline at end of file