macro_rules! transpose_tuple {
(Option; $first:expr, $($rest:expr),+ $(,)?) => { ... };
(Result; $first:expr, $($rest:expr),+ $(,)?) => { ... };
($first:expr, $($rest:expr),+ $(,)?) => { ... };
}Expand description
Transposes an arbitrary length of tuple of Options/Results into an Option/Result of a tuple.
Syntax:
Option-variant:transpose_tuple!(Option; e1, e2, ..., eN)… transposes a tuple ofOptions.- You can omit
Option;part, like:transpose_tuple!(e1, e2, ..., eN).
- You can omit
Result-variant:transpose_tuple!(Result; e1, e2, ..., eN)… transposes a tuple ofvalq::Results.
Note: Result-variant is meant to be used with valq::Result (return type of query_value_result! macro).
It doesn’t support other error types for now.
§Examples
// Options
use serde_json::json;
use valq::{query_value, transpose_tuple};
let valq = json!({
"name": "valq",
"keywords": ["macro", "query", "serde"],
"author": {
"name": "jiftechnify",
"age": 31
}
});
let picks = transpose_tuple!(
query_value!(valq.name -> str),
query_value!(valq.keywords[1] -> str),
query_value!(valq.author.age -> u64),
);
assert_eq!(picks, Some(("valq", "query", 31u64)));
let wrong_picks = transpose_tuple!(
query_value!(valq.name -> str),
query_value!(valq.keywords[10] -> str), // out of bounds
);
assert_eq!(wrong_picks, None);// Results
use valq::{query_value_result, transpose_tuple};
let picks = transpose_tuple!(
Result; // don't forget this!
query_value_result!(valq.name -> str),
query_value_result!(valq.keywords[1] -> str),
query_value_result!(valq.author.age -> u64),
);
assert!(matches!(picks, Ok(("valq", "query", 31u64))));
let wrong_picks = transpose_tuple!(
Result;
query_value_result!(valq.name -> str),
query_value_result!(valq.secrets), // non-existent path
);
assert!(matches!(wrong_picks, Err(valq::Error::ValueNotFoundAtPath(_))));