maven-search 0.7.0

A library for searching in Maven Central and formatting to Maven/Gradle/Gradle.kts/Sbt/Ivy/Lein
Documentation
use dialoguer::{Input, Select, console::Term, theme::ColorfulTheme};
use log::error;
use maven_search::args::get_args;
use maven_search::format::format;
use maven_search::http::search;
use std::error::Error;

static HELP: &str = r#"
maven-search [options] query

Search for Maven dependency

Positionals:
  query  The dependency you search for. E.g. "wicket-core" or "g:org.apache.wicket AND a:wicket-core"                [string]
         The syntax is the same as at https://search.maven.org/

Options:
  --version                 Show version number and exit
  --format, -f [string]     Define in which format to print dependency. (maven, gradle, gradlekts, lein, ivy, sbt). Default: "maven"
  --check-for-update, -u    Checks whether there is a new version of this tool available and exit
  --help, -h                Show this help and exit
"#;

fn main() -> Result<(), Box<dyn Error>> {
    env_logger::init();

    let args: Vec<String> = std::env::args().skip(1).collect();
    let mut args = args.iter().map(String::as_str);
    let mut opts = getargs::Options::new(&mut args);
    let options = get_args(&mut opts);

    match options {
        Ok(args) => {
            if args.show_version {
                let version = env!("CARGO_PKG_VERSION");
                println!("{version}");
                std::process::exit(0);
            }

            if args.show_help {
                println!("{HELP}");
                std::process::exit(0);
            }

            if args.check_for_update {
                check_for_new_version();
                std::process::exit(0);
            }

            let query: String = match args.search_term {
                Some(term) => term.to_owned(),
                None => Input::<String>::new()
                    .with_prompt("Please enter the Maven query ")
                    .interact_text()?,
            };

            let output_format = match args.format {
                "" => {
                    let items = vec!["maven", "gradle", "gradlekts", "ivy", "lein", "sbt"];
                    let selection = Select::with_theme(&ColorfulTheme::default())
                        .items(&items)
                        .default(0)
                        .interact_on_opt(&Term::stderr())?;

                    match selection {
                        Some(index) => items[index],
                        None => {
                            error!(
                                "You need to select an output format. Or use '--format xyz' command line argument."
                            );
                            std::process::exit(3);
                        }
                    }
                }
                f => f,
            };

            match search(query.as_str()) {
                Ok(results) => format(results, output_format)
                    .iter()
                    .for_each(|dep| println!("{dep}")),
                Err(err) => {
                    error!(
                        "An error occurred while searching for the latest version of '{query}'\n\n{err:?}"
                    );
                    std::process::exit(2);
                }
            }
        }
        Err(err) => {
            error!("An error occurred while parsing the command line arguments: {err:?}");
            std::process::exit(1);
        }
    }

    Ok(())
}

fn check_for_new_version() {
    use update_informer::{Check, registry};

    let name = env!("CARGO_PKG_NAME");
    let version = env!("CARGO_PKG_VERSION");

    let informer = update_informer::new(registry::Crates, name, version);
    if let Ok(Some(latest_version)) = informer.check_version() {
        println!(
            "A new version of this tool is available. Current {version}, latest: {latest_version}. Please run 'cargo install {name}' to update!"
        );
    }
}