pub trait UnitExt: Sized {
// Provided methods
fn ret<T>(self, value: T) -> T { ... }
fn ret_default<T: Default>(self) -> T { ... }
fn ret_none<T>(self) -> Option<T> { ... }
fn ret_some<T>(self, value: T) -> Option<T> { ... }
fn ret_some_default<T: Default>(self) -> Option<T> { ... }
fn ret_err<T, E>(self, value: E) -> Result<T, E> { ... }
fn ret_err_default<T, E: Default>(self) -> Result<T, E> { ... }
fn ret_ok<T, E>(self, value: T) -> Result<T, E> { ... }
fn ret_ok_default<T: Default, E>(self) -> Result<T, E> { ... }
}
Expand description
Extension methods for the unit type ()
that construct common wrapper
values without explicit boiler-plate.
Import unit_ext
to bring the trait into scope.
§Examples
use unit_ext::*;
let ok: Result<_, ()> = ().ret_ok(1);
let err: Result<u8, _> = ().ret_err("boom");
let some = ().ret_some("hi");
let none: Option<i32> = ().ret_none();
let vec: Vec<u8> = ().ret_default();
Provided Methods§
Sourcefn ret<T>(self, value: T) -> T
fn ret<T>(self, value: T) -> T
Returns value
.
This is mainly useful when syntactic symmetry with the other
ret_*
helpers is desired.
§Examples
use unit_ext::*;
assert_eq!(().ret(42), 42);
assert_eq!({ 24; }.ret(42), 42); // Can cause a Clippy warning/error.
assert_eq!(println!("24").ret(42), 42);
Examples found in repository?
examples/example.rs (line 11)
4fn main() {
5 Some(10)
6 .filter(|n| n > &5)
7 .map(|n| n * 2)
8 .or_else(|| println!("Value too small").ret_none());
9
10 Some(10)
11 .map(|v| println!("Some({v})").ret(v + 10))
12 .or_else(|| println!("Default value").ret_default());
13
14 Some([1, 2, 3, 4])
15 .map(|mut arr| arr.clone_from_slice(&[4, 3, 2, 1]).ret(arr));
16
17 "10".parse::<u8>().map_or_else(
18 |e| eprintln!("{e}").ret_none(),
19 |v| println!("Got here").ret_some(v.add(10)),
20 );
21
22 match "15".parse::<u8>() {
23 Ok(v) => v.add(15).into(),
24 Err(e) => eprintln!("{e}").ret_none(),
25 };
26
27 // One can also use do something like this:
28 "15".parse::<u8>()
29 .inspect_err(|e| eprintln!("{e}"))
30 .ok()
31 .map(|v| v + 15);
32}
Sourcefn ret_default<T: Default>(self) -> T
fn ret_default<T: Default>(self) -> T
Returns T::default()
.
§Examples
use unit_ext::*;
let v: Vec<u8> = println!("Creating empty vec").ret_default();
assert!(v.is_empty());
Examples found in repository?
examples/example.rs (line 12)
4fn main() {
5 Some(10)
6 .filter(|n| n > &5)
7 .map(|n| n * 2)
8 .or_else(|| println!("Value too small").ret_none());
9
10 Some(10)
11 .map(|v| println!("Some({v})").ret(v + 10))
12 .or_else(|| println!("Default value").ret_default());
13
14 Some([1, 2, 3, 4])
15 .map(|mut arr| arr.clone_from_slice(&[4, 3, 2, 1]).ret(arr));
16
17 "10".parse::<u8>().map_or_else(
18 |e| eprintln!("{e}").ret_none(),
19 |v| println!("Got here").ret_some(v.add(10)),
20 );
21
22 match "15".parse::<u8>() {
23 Ok(v) => v.add(15).into(),
24 Err(e) => eprintln!("{e}").ret_none(),
25 };
26
27 // One can also use do something like this:
28 "15".parse::<u8>()
29 .inspect_err(|e| eprintln!("{e}"))
30 .ok()
31 .map(|v| v + 15);
32}
Sourcefn ret_none<T>(self) -> Option<T>
fn ret_none<T>(self) -> Option<T>
Examples found in repository?
examples/example.rs (line 8)
4fn main() {
5 Some(10)
6 .filter(|n| n > &5)
7 .map(|n| n * 2)
8 .or_else(|| println!("Value too small").ret_none());
9
10 Some(10)
11 .map(|v| println!("Some({v})").ret(v + 10))
12 .or_else(|| println!("Default value").ret_default());
13
14 Some([1, 2, 3, 4])
15 .map(|mut arr| arr.clone_from_slice(&[4, 3, 2, 1]).ret(arr));
16
17 "10".parse::<u8>().map_or_else(
18 |e| eprintln!("{e}").ret_none(),
19 |v| println!("Got here").ret_some(v.add(10)),
20 );
21
22 match "15".parse::<u8>() {
23 Ok(v) => v.add(15).into(),
24 Err(e) => eprintln!("{e}").ret_none(),
25 };
26
27 // One can also use do something like this:
28 "15".parse::<u8>()
29 .inspect_err(|e| eprintln!("{e}"))
30 .ok()
31 .map(|v| v + 15);
32}
Sourcefn ret_some<T>(self, value: T) -> Option<T>
fn ret_some<T>(self, value: T) -> Option<T>
Wraps value
in Some
and returns it.
value
is passed through Into
, matching the behaviour of
Option::from
.
§Examples
use unit_ext::*;
let opt = ().ret_some(5);
assert_eq!(opt, Some(5));
Examples found in repository?
examples/example.rs (line 19)
4fn main() {
5 Some(10)
6 .filter(|n| n > &5)
7 .map(|n| n * 2)
8 .or_else(|| println!("Value too small").ret_none());
9
10 Some(10)
11 .map(|v| println!("Some({v})").ret(v + 10))
12 .or_else(|| println!("Default value").ret_default());
13
14 Some([1, 2, 3, 4])
15 .map(|mut arr| arr.clone_from_slice(&[4, 3, 2, 1]).ret(arr));
16
17 "10".parse::<u8>().map_or_else(
18 |e| eprintln!("{e}").ret_none(),
19 |v| println!("Got here").ret_some(v.add(10)),
20 );
21
22 match "15".parse::<u8>() {
23 Ok(v) => v.add(15).into(),
24 Err(e) => eprintln!("{e}").ret_none(),
25 };
26
27 // One can also use do something like this:
28 "15".parse::<u8>()
29 .inspect_err(|e| eprintln!("{e}"))
30 .ok()
31 .map(|v| v + 15);
32}
Sourcefn ret_some_default<T: Default>(self) -> Option<T>
fn ret_some_default<T: Default>(self) -> Option<T>
Returns Some(T::default())
.
§Examples
use unit_ext::*;
let s: Option<String> = ().ret_some_default();
assert_eq!(s, Some(String::new()));
Sourcefn ret_err<T, E>(self, value: E) -> Result<T, E>
fn ret_err<T, E>(self, value: E) -> Result<T, E>
Returns Err(value)
.
§Examples
use unit_ext::*;
let e: Result<(), &str> = ().ret_err("nope");
assert!(e.is_err());
Sourcefn ret_err_default<T, E: Default>(self) -> Result<T, E>
fn ret_err_default<T, E: Default>(self) -> Result<T, E>
Returns Err(E::default())
.
§Examples
use unit_ext::*;
let e: Result<i32, &str> = ().ret_err_default();
assert!(e.is_err());
Sourcefn ret_ok<T, E>(self, value: T) -> Result<T, E>
fn ret_ok<T, E>(self, value: T) -> Result<T, E>
Returns Ok(value)
.
§Examples
use unit_ext::*;
let ok = ().ret_ok::<_, ()>("yes");
assert_eq!(ok, Ok("yes"));
Sourcefn ret_ok_default<T: Default, E>(self) -> Result<T, E>
fn ret_ok_default<T: Default, E>(self) -> Result<T, E>
Returns Ok(T::default())
.
§Examples
use unit_ext::*;
let ok: Result<Vec<u8>, ()> = ().ret_ok_default();
assert_eq!(ok, Ok(Vec::new()));
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.