gitm 0.4.3

Git manager is a nice wrapper to git, where it manages repos in a specified directory
Documentation
use std::collections::HashSet;

use crate::integrations::srcs::{Link, Repository};

pub trait UnwrapAnd<T, E> {
  fn unwrap_and<F: Fn(E) -> i32>(self, err_fn: F) -> T;
}

impl<T, E> UnwrapAnd<T, E> for Result<T, E> {
  fn unwrap_and<F: Fn(E) -> i32>(self, err_fn: F) -> T {
    match self {
      Ok(value) => value,
      Err(err) => {
        let exit_code = err_fn(err);
        std::process::exit(exit_code);
      }
    }
  }
}

pub fn make_sources_unique(vec: &[Repository]) -> Vec<Repository> {
  let mut seen = HashSet::new();
  let mut result = Vec::new();

  for item in vec {
    if let Link::Path(ref _unused) = item.link {
      if seen.insert(&item.repo_id) {
        result.push(item.clone());
      }
    }
  }

  for item in vec {
    if let Link::Url(ref _unused) = item.link {
      if seen.insert(&item.repo_id) {
        result.push(item.clone());
      }
    }
  }

  result
}