Option Utilities
Extension methods for working with Option types more ergonomically
Description
A collection of utility functions and extension traits for working with Rust’s Option<T> type. Provides common patterns like fallback values, transformations, and error handling.
Features
- Fallback value chains
- Transform and filter operations
- Error conversion
- Conditional execution
Code
pub trait OptionExt<T> { fn or_else_lazy<F>(self, f: F) -> Option<T> where F: FnOnce() -> Option<T>; fn map_or_default<U: Default>(self, f: impl FnOnce(T) -> U) -> U; fn filter_map<U>(self, f: impl FnOnce(T) -> Option<U>) -> Option<U>;}impl<T> OptionExt<T> for Option<T> { fn or_else_lazy<F>(self, f: F) -> Option<T> where F: FnOnce() -> Option<T>, { self.or_else(f) } fn map_or_default<U: Default>(self, f: impl FnOnce(T) -> U) -> U { self.map_or_else(|| U::default(), f) } fn filter_map<U>(self, f: impl FnOnce(T) -> Option<U>) -> Option<U> { self.and_then(f) }}pub fn unwrap_or_default<T: Default>(opt: Option<T>) -> T { opt.unwrap_or_else(|| T::default())}pub fn option_to_result<T, E>(opt: Option<T>, err: E) -> Result<T, E> { opt.ok_or(err)}
use option_utils::{OptionExt, unwrap_or_default, option_to_result};let value: Option<i32> = Some(42);// Use extension methodslet result = value .map_or_default(|v| v * 2) .filter_map(|v| if v > 50 { Some(v) } else { None });// Convert to Resultlet res: Result<i32, &str> = option_to_result(value, "No value");// Default fallbacklet defaulted = unwrap_or_default(value);
Comments
No comments yet. Be the first to comment!
Please login to leave a comment.