# Clean conditional return statements

**URL:** <https://internals.rust-lang.org/t/clean-conditional-return-statements/18438>\
**Category:** language design\
**Created:** [February 28, 2023, 11:24am UTC](https://internals.rust-lang.org/t/clean-conditional-return-statements/18438 "2023-02-28T11:24:24Z")\
**Posts on this page:** 6\
**Page:** 2

<div class="post-metadata">

**Author:** ![Kees-van-Beilen](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/kees-van-beilen/32/9746_2.png) [@Kees-van-Beilen](https://internals.rust-lang.org/u/Kees-van-Beilen)\
**Post date:** [March 1, 2023, 7:36pm UTC](https://internals.rust-lang.org/t/clean-conditional-return-statements/18438/21 "2023-03-01T19:36:29Z")

</div>

I get where your comming from, but what about a `return value if condition` like so:

```rust

fn validate_admin(user:&User)->Result<(),UserValidationError>{
    return Err(UserValidationError::UsernameToShort) if user.name.len() < 3;
    return Err(UserValidationError::UsernameToLong) if user.name.len() > 20;
    return Err(UserValidationError::NotAnAdmin) if !user.is_admin;
    Ok(())
}

```

---

<div class="post-metadata">

**Author:** ![scottmcm](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/scottmcm/32/2355_2.png) [@scottmcm](https://internals.rust-lang.org/u/scottmcm)\
**Post date:** [March 1, 2023, 8:47pm UTC](https://internals.rust-lang.org/t/clean-conditional-return-statements/18438/22 "2023-03-01T20:47:17Z")

</div>

Since you should always start with the weakest construct -- language changes are a last resort -- how about a function?

```rust
fn require<E>(cond: bool, err: E) -> Result<(), E> {
    if cond { Err(err) } else { Ok(()) }}
}

pub fn validate_admin(user:&User)->Result<(),UserValidationError>{
    require(user.name.len() >= 3, UserValidationError::UsernameToShort)?;
    require(user.name.len() <= 20, UserValidationError::UsernameToLong)?;
    require(user.is_admin, UserValidationError::NotAnAdmin)?;
    Ok(())
}

```

(Or make a macro if you want to shorten it further.)

---

<div class="post-metadata">

**Author:** ![idanarye](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/idanarye/32/3346_2.png) [@idanarye](https://internals.rust-lang.org/u/idanarye)\
**Post date:** [March 1, 2023, 11:03pm UTC](https://internals.rust-lang.org/t/clean-conditional-return-statements/18438/23 "2023-03-01T23:03:27Z")

</div>

Guys, I have a bad idea. This gets formatted as a single line:

```rust
let false = condition() else { return }; 

```

---

<div class="post-metadata">

**Author:** ![CAD97](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/cad97/32/3460_2.png) [@CAD97](https://internals.rust-lang.org/u/CAD97)\
**Post date:** [March 2, 2023, 5:14am UTC](https://internals.rust-lang.org/t/clean-conditional-return-statements/18438/24 "2023-03-02T05:14:52Z")

</div>

Another stupid/fun alternative:

```rust
(user.name.len() < 3).then_some(()).ok_or(UserValidationError::UsernameToShort)?;

```

---

<div class="post-metadata">

**Author:** ![kajacx](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/kajacx/32/9181_2.png) [@kajacx](https://internals.rust-lang.org/u/kajacx)\
**Post date:** [March 5, 2023, 5:00pm UTC](https://internals.rust-lang.org/t/clean-conditional-return-statements/18438/25 "2023-03-05T17:00:54Z")

</div>

The third one is easily most readable to me. "If this isn't true, then don't do the next thing" isn't really great IMO. But that is just your example which has double negation.

In general, I prefer if there is only one way to do something. For example, generic bounds can be either in the `<>` brackets, or in the `where` clause. This just leads to decision fatigue and inconsistencies, where one function have it one way, and another function another way. Not saying that is necessarily bad, but it's slightly annoying for me.

And your proposed syntax would kind of do the same thing - add multiple ways or returning from a function. Yes, Rust has the `?` operator, but that is for `Try` specifically. I just don't see the added value, especially if you can do the same thing with a macro.

---

<div class="post-metadata">

**Author:** ![system](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/system/32/14092_2.png) [@system](https://internals.rust-lang.org/u/system)\
**Post date:** [June 3, 2023, 5:01pm UTC](https://internals.rust-lang.org/t/clean-conditional-return-statements/18438/26 "2023-06-03T17:01:24Z")

</div>

This topic was automatically closed 90 days after the last reply. New replies are no longer allowed.

[Previous page](https://internals.rust-lang.org/t/clean-conditional-return-statements/18438.md?page=1)
