Skip to content

Commit fbb0ecb

Browse files
committed
Add return_ok and return_some macros
1 parent 589998d commit fbb0ecb

File tree

2 files changed

+94
-0
lines changed

2 files changed

+94
-0
lines changed

CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
## [[Unreleased]]
44

5+
- `try_match` and `unwrap_match` macros to get a certain variant from an enum.
6+
- `return_ok` and `return_some` macros for early return of successful calculation.
7+
58
## 0.2.1 (09.07.2020)
69

710
- `VecExt::remove_item` method was added (#9).

src/macros.rs

+91
Original file line numberDiff line numberDiff line change
@@ -138,3 +138,94 @@ macro_rules! unwrap_match {
138138
$crate::try_match!($var, $variant).unwrap()
139139
};
140140
}
141+
142+
/// Checks whether supplied [`Result`] variable is `Ok`
143+
/// and if so, returns it.
144+
///
145+
/// If variant is an `Err`, macro evaluates to the contents of the `Err`
146+
/// variant.
147+
///
148+
/// This macro supports two forms:
149+
/// - `return_ok!(Ok(42));` - will return `Ok(42)`.
150+
/// - `return_ok!(inner Ok(42));` - will return just `42`.
151+
///
152+
/// ## Examples
153+
///
154+
/// ```rust
155+
/// # use stdext::return_ok;
156+
///
157+
/// fn choose_one(left: Result<u8, ()>, right: Result<u8, ()>) -> Result<u8, ()> {
158+
/// return_ok!(left);
159+
/// return_ok!(right);
160+
/// Err(())
161+
/// }
162+
///
163+
/// fn choose_one_inner(left: Result<u8, ()>, right: Result<u8, ()>) -> u8 {
164+
/// return_ok!(inner left);
165+
/// return_ok!(inner right);
166+
/// panic!("Both variables are bad")
167+
/// }
168+
///
169+
/// assert_eq!(choose_one(Err(()), Ok(10)), Ok(10));
170+
/// assert_eq!(choose_one_inner(Ok(1), Err(())), 1);
171+
/// ```
172+
#[macro_export]
173+
macro_rules! return_ok {
174+
($var:expr) => {
175+
match $var {
176+
Ok(val) => return Ok(val),
177+
Err(err) => err,
178+
}
179+
};
180+
(inner $var:expr) => {
181+
match $var {
182+
Ok(val) => return val,
183+
Err(err) => err,
184+
}
185+
};
186+
}
187+
188+
/// Checks whether supplied [`Option`] variable is `Some`
189+
/// and if so, returns it.
190+
///
191+
/// If variant is an `None`, nothing happens.
192+
///
193+
/// This macro supports two forms:
194+
/// - `return_some!(Some(42));` - will return `Some(42)`.
195+
/// - `return_some!(inner Some(42));` - will return just `42`.
196+
///
197+
/// ## Examples
198+
///
199+
/// ```rust
200+
/// # use stdext::return_some;
201+
///
202+
/// fn choose_one(left: Option<u8>, right: Option<u8>) -> Option<u8> {
203+
/// return_some!(left);
204+
/// return_some!(right);
205+
/// None
206+
/// }
207+
///
208+
/// fn choose_one_inner(left: Option<u8>, right: Option<u8>) -> u8 {
209+
/// return_some!(inner left);
210+
/// return_some!(inner right);
211+
/// panic!("Both variables are bad")
212+
/// }
213+
///
214+
/// assert_eq!(choose_one(None, Some(10)), Some(10));
215+
/// assert_eq!(choose_one_inner(Some(1), None), 1);
216+
/// ```
217+
#[macro_export]
218+
macro_rules! return_some {
219+
($var:expr) => {
220+
match $var {
221+
Some(val) => return Some(val),
222+
None => {}
223+
}
224+
};
225+
(inner $var:expr) => {
226+
match $var {
227+
Some(val) => return val,
228+
None => {}
229+
}
230+
};
231+
}

0 commit comments

Comments
 (0)