gitm/commands/
goto.rs

1use crate::config;
2use crate::config::Configuration;
3use crate::integrations::editor;
4use crate::integrations::search;
5use crate::integrations::srcs::Repository;
6use crate::integrations::srcs::{gh::GhSource, local::LocalSource, Source};
7use crate::utils::make_sources_unique;
8
9use clier::display::label::LabelLogger;
10use clier::display::Displayer;
11use clier::hooks::use_double_dash;
12use clier::{run::ExitCode, Clier, HasMeta, Runnable};
13use std::path::Path;
14
15fn get_sources<T>(_dir: T) -> Vec<Repository>
16where
17  T: AsRef<Path>,
18{
19  let total_vec = [GhSource::list(), LocalSource::list()]
20    .iter()
21    .flatten()
22    .cloned()
23    .collect::<Vec<Repository>>();
24  make_sources_unique(&total_vec)
25}
26
27fn get_repo(config: &Configuration, initial_query: &str) -> Option<Repository> {
28  let log = LabelLogger::default();
29  let repos = get_sources(config.project_directory.clone());
30
31  let searcher = match search::get_searcher(config) {
32    Some(value) => value,
33    None => {
34      log.error("No searcher configured");
35      std::process::exit(1);
36    }
37  };
38
39  if let Some(value) = repos.iter().find(|value| value.repo_id == initial_query) {
40    return Some(value.clone());
41  }
42
43  if let Ok(value) = searcher.search(repos, initial_query) {
44    Some(value)
45  } else {
46    None
47  }
48}
49
50pub fn goto_command(clier: Clier<HasMeta, Runnable>) -> ExitCode {
51  let initial_query = use_double_dash(&clier).unwrap_or("".into());
52
53  let config = config::load_config();
54  let log = LabelLogger::default();
55
56  let repo_selected = get_repo(&config, &initial_query);
57  let gotten_editor = match editor::get_editor(&config) {
58    Some(editor) => editor,
59    None => {
60      log.error("No editor configured");
61      std::process::exit(1);
62    }
63  };
64
65  match repo_selected {
66    Some(repo) => {
67      let _ = gotten_editor.open(&repo.link.resolve_path());
68      ExitCode(0)
69    }
70    None => ExitCode(1),
71  }
72}