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}