# Pre-RFC: Option::none\_if()

**URL:** <https://internals.rust-lang.org/t/pre-rfc-option-none-if/16607>\
**Category:** language design\
**Created:** [May 11, 2022, 11:54am UTC](https://internals.rust-lang.org/t/pre-rfc-option-none-if/16607 "2022-05-11T11:54:53Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![tomers](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/tomers/32/8787_2.png) [@tomers](https://internals.rust-lang.org/u/tomers)\
**Post date:** [May 11, 2022, 11:54am UTC](https://internals.rust-lang.org/t/pre-rfc-option-none-if/16607/1 "2022-05-11T11:54:53Z")

</div>

I had cases where I got an `Option`'s `Some(x)` , which I wanted to convert to `None` in case `x` is in a given state. For example, `Some<String>` which should be converted to `None` in case the string is empty:

```rust
fn none_if_string_is_empty(param: Option<String>) -> Option<String> {
    param.and_then(|s| if s.is_empty() { None } else { Some(s) })
}

fn main() {
    assert_eq!(
        none_if_string_is_empty(Some("Hello, world".to_owned())),
        Some("Hello, world".to_owned())
    );
    assert_eq!(none_if_string_is_empty(Some("".to_owned())), None);
    assert_eq!(none_if_string_is_empty(None), None);
}

```

I noticed this pattern is rather common, and I find the current implementation a bit cumbersome. For that reason I would like to suggest to add a syntactic sugar for such test, called `Option::none_if`:

```rust
// pub const fn none_if<U, F>(self, f: F) -> Option<U>
// where
// F: ~const FnOnce(T) -> Option<U>,
// F: ~const Drop,
// {
// match self {
// Some(x) => if f(x) { None } else { Some(x) },
// None => None,
// }
// }

fn none_if_string_is_empty_with_none_if(param: Option<String>) -> Option<String> {
    param.none_if(|s| s.is_empty())
}

```

I would like to get some feedback in this suggestion. Thanks!

---

<div class="post-metadata">

**Author:** ![elidupree](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/elidupree/32/4304_2.png) [@elidupree](https://internals.rust-lang.org/u/elidupree)\
**Post date:** [May 11, 2022, 12:24pm UTC](https://internals.rust-lang.org/t/pre-rfc-option-none-if/16607/2 "2022-05-11T12:24:57Z")

</div>

[Option::filter](https://doc.rust-lang.org/std/option/enum.Option.html#method.filter) seems to do the job here (you just have to negate the condition).

---

<div class="post-metadata">

**Author:** ![steffahn](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/steffahn/32/13288_2.png) [@steffahn](https://internals.rust-lang.org/u/steffahn)\
**Post date:** [May 11, 2022, 12:25pm UTC](https://internals.rust-lang.org/t/pre-rfc-option-none-if/16607/3 "2022-05-11T12:25:08Z")

</div>

Are you aware of [Option::filter](https://doc.rust-lang.org/std/option/enum.Option.html#method.filter)?

---

<div class="post-metadata">

**Author:** ![tomers](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/tomers/32/8787_2.png) [@tomers](https://internals.rust-lang.org/u/tomers)\
**Post date:** [May 11, 2022, 12:28pm UTC](https://internals.rust-lang.org/t/pre-rfc-option-none-if/16607/4 "2022-05-11T12:28:36Z")

</div>

Oh, that is exactly what I wanted, and of course the naming is much better. Thanks for answering. Could you please close this discussion?

---

<div class="post-metadata">

**Author:** ![steffahn](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/steffahn/32/13288_2.png) [@steffahn](https://internals.rust-lang.org/u/steffahn)\
**Post date:** [May 11, 2022, 1:20pm UTC](https://internals.rust-lang.org/t/pre-rfc-option-none-if/16607/5 "2022-05-11T13:20:54Z")

</div>

Closed on May 11, 2022, 1:20pm UTC


