bluenote 0.1.0

Profile-based HTTP client library with configuration management
Documentation
pub type Result<T> = anyhow::Result<T>;

pub type Merger<T> = fn(T, T) -> T;

#[allow(dead_code)]
pub fn merge_opt<T>(o1: Option<T>, o2: Option<T>, merger: Merger<T>) -> Option<T> {
    match (o1, o2) {
        (Some(p), Some(s)) => Some(merger(p, s)),
        (Some(p), None) => Some(p),
        (None, Some(s)) => Some(s),
        (None, None) => None,
    }
}

#[cfg(test)]
mod test {
    use super::*;

    #[test]
    fn merge_opt_should_return_first_when_second_is_none() {
        assert_eq!(merge_opt(Some(1), None, |a, b| a + b), Some(1));
    }

    #[test]
    fn merge_opt_should_return_second_when_first_is_none() {
        assert_eq!(merge_opt(None, Some(2), |a, b| a + b), Some(2));
    }

    #[test]
    fn merge_opt_should_return_merged_value_when_both_are_not_none() {
        assert_eq!(merge_opt(Some(1), Some(2), |a, b| a + b), Some(3));
    }
}