# 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 a `COALESCE` in SQL. - `and!`: `and!(optA => optB => optC)` will produce a tuple `(A, B, C)` iff all values are `Some`. - `try_!`: This is an `Option` focused version of the try block which seems to work better with type inference than the `try` 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. ```rust #[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, } struct LogConfig { level: Option, } #[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`.