Configs.java

package io.github.jonloucks.gradle.kit;

import io.github.jonloucks.variants.api.Parsers;
import io.github.jonloucks.variants.api.Variant;
import org.gradle.api.GradleException;
import org.gradle.jvm.toolchain.JavaLanguageVersion;

import java.util.List;
import java.util.Optional;
import java.util.function.Function;

import static io.github.jonloucks.gradle.kit.Internal.base64Decode;
import static io.github.jonloucks.variants.api.Checks.textCheck;
import static io.github.jonloucks.variants.api.GlobalVariants.createVariant;

final class Configs {
    
    static final Variant<Boolean> KIT_LOG_ENABLED = createVariant((b,p) -> b //
        .name("Kit Log Enabled") //
        .keys("KIT_LOG_ENABLED", "kit.log.enabled", "gradle.kit.log.enabled") //
        .of(p.ofBoolean())
        .fallback(() -> false) //
        .description("Enable logging to provide more visibility.") //
    );
    
    static final Variant<JavaLanguageVersion> KIT_JAVA_COMPILER_VERSION = createVariant((b,p) -> b //
        .name("Kit Java Compiler Version") //
        .keys("KIT_JAVA_COMPILER_VERSION", "kit.java.compiler.version") //
        .of(ofJavaLanguageVersion(p)) //
        .fallback(() -> JavaLanguageVersion.of("17")) //
        .description("Select the Java compiler version.") //
    );
    
    static final Variant<JavaLanguageVersion> KIT_JAVA_SOURCE_VERSION = createVariant((b,p) -> b //
        .name("Kit Java Source Version") //
        .keys( "KIT_JAVA_SOURCE_VERSION", "kit.java.source.version") //
        .of(ofJavaLanguageVersion(p)) //
        .fallback(() -> JavaLanguageVersion.of("9")) //
        .description("Select the Java source version.") //
    );
    
    static final Variant<JavaLanguageVersion> KIT_JAVA_TARGET_VERSION = createVariant((b,p) -> b //
        .name("Kit Java Target Version") //
        .keys( "KIT_JAVA_TARGET_VERSION", "kit.java.target.version") //
        .of(ofJavaLanguageVersion(p)) //
        .link(KIT_JAVA_SOURCE_VERSION) //
        .description("Select the Java target version.") //
    );
    
    static final Variant<JavaLanguageVersion> KIT_JAVA_TEST_SOURCE_VERSION = createVariant((b,p) -> b //
        .name("Kit Java Test Source Version") //
        .keys( "KIT_JAVA_TEST_SOURCE_VERSION", "kit.java.test.source.version") //
        .of(ofJavaLanguageVersion(p)) //
        .link(KIT_JAVA_SOURCE_VERSION) //
        .description("Select the Java test source version.") //
    );
    
    static final Variant<JavaLanguageVersion> KIT_JAVA_TEST_TARGET_VERSION = createVariant((b,p) -> b //
        .name("Kit Java Test Target Version") //
        .keys( "KIT_JAVA_TEST_TARGET_VERSION", "kit.java.test.target.version") //
        .of(ofJavaLanguageVersion(p)) //
        .link(KIT_JAVA_TEST_SOURCE_VERSION) //
        .description("Select the Java test target version.") //
    );
    
    static final Variant<String> KIT_PROJECT_WORKFLOW = createVariant((b,p) -> b //
        .name("Kit Project Workflow") //
        .keys( "KIT_PROJECT_WORKFLOW", "PROJECT_WORKFLOW", "kit.project.workflow") //
        .of(p.ofString()) //
        .fallback(() -> "unknown") //
        .description("Declare CI/CD intent.") //
    );
    
    static final Variant<String> KIT_OSSRH_URL = createVariant((b,p) -> b //
        .name("Kit OSSRH URL") //
        .keys("KIT_OSSRH_URL", "kit.ossrh.url") //
        .of(p.ofString()) //
        .fallback(() -> "https://central.sonatype.com/api/v1/publisher/upload?publishingType=USER_MANAGED") //
        .description("Select the URL to publish an OSSRH bundle.")
    );
    
    static final Variant<String> KIT_OSSRH_AUTHOR = createVariant((b, p) -> b //
        .name("Kit OSSRH Author") //
        .keys("KIT_OSSRH_AUTHOR", "kit.ossrh.author") //
        .of(p.ofString()) //
        .link(KIT_PROJECT_WORKFLOW) //
        .description("Select the author to publish an OSSRH bundle.") //
    );
    
    static final Variant<String> KIT_OSSRH_USERNAME = createVariant((b,p) -> b //
        .name("Kit OSSRH User Login Name") //
        .keys("KIT_OSSRH_USERNAME", "OSSRH_USERNAME", "kit.ossrh.username") //
        .of(p.ofString()) //
        .description("Select the username to publish an OSSRH bundle.")
    );
    
    static final Variant<String> KIT_OSSRH_PASSWORD = createVariant((b,p) -> b //
        .name("Kit OSSRH Password") //
        .keys( "KIT_OSSRH_PASSWORD", "OSSRH_PASSWORD", "kit.ossrh.password") //
        .of(p.ofString()) //
        .description("Select the password to publish an OSSRH bundle.") //
    );
    
    static final Variant<String> KIT_GPG_SECRET_KEY = createVariant((b,p) -> b //
        .name("Kit OSSRH GPG Secret Key") //
        .keys("KIT_OSSRH_GPG_SECRET_KEY", "OSSRH_GPG_SECRET_KEY", "kit.ossrh.gpg.secret.key") //
        .of(p.ofTrimAndSkipEmpty(Configs::parseSecretKey)) //
        .description("Select the GPG secret key for signing.") //
    );
    
    static final Variant<String> KIT_GPG_SECRET_KEY_PASSWORD = createVariant((b,p) -> b //
        .name("Kit OSSRH GPG Secret Key Password") //
        .keys("KIT_OSSRH_GPG_SECRET_KEY_PASSWORD", "OSSRH_GPG_SECRET_KEY_PASSWORD", "kit.ossrh.gpg.secret.key.password") //
        .of(p.ofString()) //
        .description("Select the GPG secret key password for signing.") //
    );
    
    static final Variant<String[]> KIT_INCLUDE_TAGS = createVariant((b,p) -> b //
        .name("Kit Java Test Include Tags") //
        .keys("KIT_INCLUDE_TAGS", "kit.include.tags", "includeTags") //
        .of(ofStringArray(p)) //
        .fallback(() -> new String[0])
    );

    static final Variant<String[]> KIT_EXCLUDE_TAGS = createVariant((b,p) -> b //
        .name("Kit Java Test Exclude Tags") //
        .keys("KIT_EXCLUDE_TAGS", "kit.exclude.tags", "excludeTags") //
        .of(ofStringArray(p)) //
        .fallback(() -> new String[] { "unstable", "slow", "integration", "functional"})
    );
    
    static final Variant<String[]> KIT_INTEGRATION_EXCLUDE_TAGS = createVariant((b,p) -> b //
        .name("Kit Java Integration Exclude Tags") //
        .keys("KIT_INTEGRATION_EXCLUDE_TAGS", "kit.integration.exclude.tags", "excludeIntegrationTags") //
        .of(ofStringArray(p)) //
        .link(KIT_EXCLUDE_TAGS) //
        .fallback(() -> new String[] { "unstable", "slow", "functional" })
    );
    
    static final Variant<String[]> KIT_FUNCTIONAL_EXCLUDE_TAGS = createVariant((b,p) -> b //
        .name("Kit Java Functional Exclude Tags") //
        .keys("KIT_FUNCTIONAL_EXCLUDE_TAGS", "kit.functional.exclude.tags") //
        .of(ofStringArray(p)) //
        .link(KIT_EXCLUDE_TAGS) //
        .fallback(() -> new String[] { "unstable", "slow", "integration" })
    );
    
    private static Function<CharSequence,Optional<String[]>> ofStringArray(Parsers parsers) {
        final Function<CharSequence,Optional<List<String>>> ofList = parsers.ofList(parsers.ofString(), ",");
        
        return text -> ofList.apply(text).map(strings -> strings.toArray(new String[0]));
    }
    
    private static Function<CharSequence, Optional<JavaLanguageVersion>> ofJavaLanguageVersion(Parsers parsers) {
        return parsers.ofTrimAndSkipEmpty(parsers.string(JavaLanguageVersion::of));
    }
    
    private static String parseSecretKey(CharSequence text) {
        final CharSequence validText = textCheck(text);
        final String string = validText.toString();
  
        if (string.startsWith("-")) {
            return string;
        }
        try {
            return base64Decode(string);
        } catch (IllegalArgumentException thrown) {
            throw new GradleException("Invalid gpg secret key.");
        }
    }

    private Configs() {
        throw new AssertionError("Utility class");
    }
}