Checks.java

package io.github.jonloucks.variants.api;

import io.github.jonloucks.contracts.api.ContractException;
import io.github.jonloucks.contracts.api.Contracts;

import static io.github.jonloucks.contracts.api.Checks.nullCheck;
import static io.github.jonloucks.contracts.api.Checks.validateContracts;

/**
 * Responsibility: Common argument checking and validation
 */
public final class Checks {
    
    /**
     * Check if given Variants is not null or invalid
     *
     * @param variants the Variants to check
     * @return a valid Variants
     * @throws IllegalArgumentException when invalid
     */
    public static Variants variantsCheck(Variants variants) {
        return nullCheck(variants, "Variants must be present.");
    }
    
    /**
     * Quickly validates a Contracts and Variants
     *
     * @param contracts the Contracts to validate
     * @param variants the Variants to validate
     *
     * @throws ContractException when invalid
     * @throws VariantException when invalid
     * @throws IllegalArgumentException when invalid
     */
    public static void validateVariants(Contracts contracts, Variants variants) {
        final Variants validVariants = variantsCheck(variants);
        validateContracts(contracts);
        
        final Variants promisedVariants = contracts.claim(Variants.CONTRACT);
        if (validVariants != promisedVariants) {
            throw new VariantException("Variants.CONTRACT claim is different.");
        }

        contracts.claim(VariantsFactory.CONTRACT);
    }
    
    /**
     * Check if given Variant is not null or invalid
     *
     * @param variant the Variant to check
     * @return a valid Variant
     * @param <T> the Variant value type
     * @throws IllegalArgumentException when invalid
     */
    public static <T> Variant<T> variantCheck(Variant<T> variant) {
        return nullCheck(variant, "Variant must be present.");
    }
    
    /**
     * Check if given key is not null or invalid
     *
     * @param key the key to check
     * @return a valid key
     */
    public static String keyCheck(String key) {
        return nullCheck(key, "Key must be present.");
    }
    
    /**
     * Check if given is not null or invalid
     *
     * @param keys the keys to check
     * @return valid keys
     * @param <T> the type of keys
     */
    public static <T> T keysCheck(T keys) {
        return nullCheck(keys, "Keys must be present.");
    }
    
    private Checks() {
    
    }
}