maven-search 0.7.0

A library for searching in Maven Central and formatting to Maven/Gradle/Gradle.kts/Sbt/Ivy/Lein
Documentation
use crate::types::Doc;
use log::{debug, warn};

pub fn format(results: Vec<Doc>, output_format: &str) -> Vec<String> {
    debug!(
        "Going to format the following results with format '{:?}':\n{:?}",
        output_format, &results
    );

    match output_format {
        "gradle" => gradle(results),
        "gradle.kts" | "gradle_kts" | "gradlekts" => gradle_kts(results),
        "sbt" => sbt(results),
        "lein" => lein(results),
        "ivy" => ivy(results),
        "maven" | "mvn" => maven(results),
        unknown => {
            warn!("Unknown format: '{unknown}'. Will print in Maven XML format");
            maven(results)
        }
    }
}

fn version(doc: &Doc) -> &str {
    match &doc.version {
        Some(v) => v.as_str(),
        None => doc.latestVersionInfo.version.as_str(),
    }
}

fn transform<F>(results: Vec<Doc>, func: F) -> Vec<String>
where
    F: Fn(&Doc) -> String,
{
    results.iter().map(func).collect()
}

fn maven(results: Vec<Doc>) -> Vec<String> {
    transform(results, |doc| {
        format!(
            r#"
    <dependency>
      <groupId>{}</groupId>
      <artifactId>{}</artifactId>
      <version>{}</version>
    </dependency>
    "#,
            doc.namespace,
            doc.name,
            version(doc)
        )
    })
}

fn gradle(results: Vec<Doc>) -> Vec<String> {
    transform(results, |doc| {
        format!(
            r#"
    implementation '{}:{}:{}'
    "#,
            doc.namespace,
            doc.name,
            version(doc)
        )
    })
}

fn gradle_kts(results: Vec<Doc>) -> Vec<String> {
    transform(results, |doc| {
        format!(
            r#"
    implementation("{}:{}:{}")
    "#,
            doc.namespace,
            doc.name,
            version(doc)
        )
    })
}

fn sbt(results: Vec<Doc>) -> Vec<String> {
    transform(results, |doc| {
        format!(
            r#"
    libraryDependencies += "{}" % "{}" % "{}"
    "#,
            doc.namespace,
            doc.name,
            version(doc)
        )
    })
}

fn lein(results: Vec<Doc>) -> Vec<String> {
    transform(results, |doc| {
        format!(
            r#"
    [{}/{} "{}"]
    "#,
            doc.namespace,
            doc.name,
            version(doc)
        )
    })
}

fn ivy(results: Vec<Doc>) -> Vec<String> {
    transform(results, |doc| {
        format!(
            r#"
    <dependency org="{}" name="{}" rev="{}" />
    "#,
            doc.namespace,
            doc.name,
            version(doc)
        )
    })
}