on master help sign in
Move transpose to util module
commit5af176c94f3e797d2d784b0c3df103a2921fd62d authorsharkdp <davidpeter@web.de> dateThu 11 Oct 2018, 22:27 (8 years ago) parent9e7da05
3 files changed+29−6
src/app.rs+1−6 src/main.rs+1 src/util.rs+27
src/app.rs+1−6
@@ -20,6 +20,7 @@ use errors::*;
2020use inputfile::InputFile;
2121use line_range::LineRange;
2222use style::{OutputComponent, OutputComponents, OutputWrap};
23+use util::transpose;
2324
2425#[derive(Debug, Clone, Copy, PartialEq)]
2526pub enum PagingMode {
@@ -74,12 +75,6 @@ fn is_truecolor_terminal() -> bool {
7475 .unwrap_or(false)
7576}
7677
77−/// Helper function that might appear in Rust stable at some point
78−/// (https://doc.rust-lang.org/stable/std/option/enum.Option.html#method.transpose)
79−fn transpose<T>(opt: Option<Result<T>>) -> Result<Option<T>> {
80− opt.map_or(Ok(None), |res| res.map(Some))
81−}
82−
8378pub struct App {
8479 pub matches: ArgMatches<'static>,
8580 interactive_output: bool,
src/main.rs+1
@@ -36,6 +36,7 @@ mod preprocessor;
3636mod printer;
3737mod style;
3838mod terminal;
39+mod util;
3940
4041use std::collections::HashSet;
4142use std::io;
src/util.rsnew file+27
@@ -0,0 +1,27 @@
1+/// Helper function that might appear in Rust stable at some point
2+/// (https://doc.rust-lang.org/stable/std/option/enum.Option.html#method.transpose)
3+pub fn transpose<T, E>(opt: Option<Result<T, E>>) -> Result<Option<T>, E> {
4+ opt.map_or(Ok(None), |res| res.map(Some))
5+}
6+
7+#[cfg(test)]
8+mod tests {
9+ use super::transpose;
10+
11+ #[derive(Debug, PartialEq)]
12+ struct TestError;
13+
14+ type TestResult<T> = Result<T, TestError>;
15+
16+ #[test]
17+ fn basic() {
18+ let a: Option<TestResult<i32>> = Some(Ok(2));
19+ assert_eq!(Ok(Some(2)), transpose(a));
20+
21+ let b: Option<TestResult<i32>> = Some(Err(TestError));
22+ assert_eq!(Err(TestError), transpose(b));
23+
24+ let c: Option<TestResult<i32>> = None;
25+ assert_eq!(Ok(None), transpose(c));
26+ }
27+}