gitm 0.4.3

Git manager is a nice wrapper to git, where it manages repos in a specified directory
Documentation
use crate::config;
use crate::config::Configuration;
use crate::integrations::editor;
use crate::integrations::search;
use crate::integrations::srcs::Repository;
use crate::integrations::srcs::{gh::GhSource, local::LocalSource, Source};
use crate::utils::make_sources_unique;

use clier::display::label::LabelLogger;
use clier::display::Displayer;
use clier::hooks::use_double_dash;
use clier::{run::ExitCode, Clier, HasMeta, Runnable};
use std::path::Path;

fn get_sources<T>(_dir: T) -> Vec<Repository>
where
  T: AsRef<Path>,
{
  let total_vec = [GhSource::list(), LocalSource::list()]
    .iter()
    .flatten()
    .cloned()
    .collect::<Vec<Repository>>();
  make_sources_unique(&total_vec)
}

fn get_repo(config: &Configuration, initial_query: &str) -> Option<Repository> {
  let log = LabelLogger::default();
  let repos = get_sources(config.project_directory.clone());

  let searcher = match search::get_searcher(config) {
    Some(value) => value,
    None => {
      log.error("No searcher configured");
      std::process::exit(1);
    }
  };

  if let Some(value) = repos.iter().find(|value| value.repo_id == initial_query) {
    return Some(value.clone());
  }

  if let Ok(value) = searcher.search(repos, initial_query) {
    Some(value)
  } else {
    None
  }
}

pub fn goto_command(clier: Clier<HasMeta, Runnable>) -> ExitCode {
  let initial_query = use_double_dash(&clier).unwrap_or("".into());

  let config = config::load_config();
  let log = LabelLogger::default();

  let repo_selected = get_repo(&config, &initial_query);
  let gotten_editor = match editor::get_editor(&config) {
    Some(editor) => editor,
    None => {
      log.error("No editor configured");
      std::process::exit(1);
    }
  };

  match repo_selected {
    Some(repo) => {
      let _ = gotten_editor.open(&repo.link.resolve_path());
      ExitCode(0)
    }
    None => ExitCode(1),
  }
}