2 releases
0.1.1 | Jul 29, 2019 |
---|---|
0.1.0 | Jul 10, 2019 |
#2078 in Rust patterns
5KB
70 lines
koption_macros
Some macros that are useful for working with Option
s.
or!
:or!(optA => optB => optC)
will select the first non-None
value, like aCOALESCE
in SQL.and!
:and!(optA => optB => optC)
will produce a tuple(A, B, C)
iff all values areSome
.try_!
: This is anOption
focused version of the try block which seems to work better with type inference than thetry
blocks in nightly.
There is at least one more thing planned as soon as I can figure out how to use proc_macros.
Examples
Straight from the unit tests.
#[test]
fn or_works() {
assert_eq!(Some(1), or!(Some(1) => Some(2) => Some(3)));
assert_eq!(Some(2), or!(None => Some(2) => Some(3)));
assert_eq!(Some(3), or!(None => None => Some(3)));
assert_eq!(None::<()>, or!(None => None => None));
}
#[test]
fn and_works() {
assert_eq!(Some((1, 2, 3)), and!(Some(1) => Some(2) => Some(3)));
assert_eq!(None, and!(None => Some(2) => Some(3)));
assert_eq!(None, and!(None => None => Some(3)));
assert_eq!(None, and!(None => None => None));
}
struct Config {
log: Option<LogConfig>,
}
struct LogConfig {
level: Option<String>,
}
#[test]
fn try_works() {
assert_eq!(
Some(6),
try_! {
let x = Some(3);
let y = Some(2);
x? * y?
}
);
let config = Config {
log: Some(LogConfig {
level: Some("debug".to_owned()),
}),
};
let x = try_! { config.log?.level? }.unwrap_or("foo".to_owned());
assert_eq!(x, "debug");
}
Why k
option_macros?
It's my version of namespacing my crates with my last initial, k
.