All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.opsbears.webcomponents.application.help.TextHelpGenerator Maven / Gradle / Ivy

package com.opsbears.webcomponents.application.help;

import com.opsbears.webcomponents.configuration.*;
import com.opsbears.webcomponents.immutable.ImmutableArrayList;
import com.opsbears.webcomponents.immutable.ImmutableList;

import javax.annotation.ParametersAreNonnullByDefault;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

@ParametersAreNonnullByDefault
public class TextHelpGenerator {
    private final String jarName;
    private final Configuration configuration;
    private final List configurationLoaders;

    public TextHelpGenerator(
        String executableName,
        Configuration configuration,
        List configurationLoaders
    ) {
        this.jarName = executableName;
        this.configuration = configuration;
        this.configurationLoaders = configurationLoaders;
    }

    public String generate() {
        StringBuilder helpBuilder = new StringBuilder();
        helpBuilder.append("Usage: java -jar ").append(jarName).append("\n\n");

        helpBuilder.append("# How to configure\n\n");

        helpBuilder.append("This application can be configured using the following means:\n\n");

        for (ConfigurationLoader configurationLoader : configurationLoaders) {
            helpBuilder.append("  - ").append(configurationLoader.getName()).append(" (").append(configurationLoader.getDescription()).append(")\n");
        }
        helpBuilder.append("\n");

        helpBuilder.append("## Global options\n\n");
        for (NamedConfigurationOption configurationOptionGroup : configuration.getOptions()) {
            if (configurationOptionGroup instanceof ConfigurationOption) {
                generateHelp(helpBuilder, new ImmutableArrayList<>(), configurationOptionGroup, 1);
            }
        }
        for (NamedConfigurationOption configurationOptionGroup : configuration.getOptions()) {
            if (!(configurationOptionGroup instanceof ConfigurationOption)) {
                generateHelp(helpBuilder, new ImmutableArrayList<>(), configurationOptionGroup, 1);
            }
        }

        return helpBuilder.toString();
    }

    private void generateHelp(StringBuilder helpBuilder, ImmutableList prefix, NamedConfigurationOption configurationOptionGroup, int level) {
        if (configurationOptionGroup instanceof ConfigurationOption) {
            List variants = new ArrayList<>();
            for (ConfigurationLoader configurationLoader : configurationLoaders) {
                variants.add(configurationLoader.formatConfigurationOption(
                    prefix,
                    (ConfigurationOption) configurationOptionGroup
                ));
            }
            String formattedConfigurationOption = String.join(" or ", variants);
            helpBuilder.append("  ").append(formattedConfigurationOption).append("\n\n");

            helpBuilder.append("      ").append(configurationOptionGroup.getDescription().replaceAll("\n", "\n      ")).append("\n\n");

            Class valueType = ((ConfigurationOption) configurationOptionGroup).getValueType();

            helpBuilder.append("      Type: ").append(valueType.getSimpleName());
            if (valueType.isEnum()) {
                String values = Arrays.stream(valueType.getEnumConstants()).map(Object::toString).collect(Collectors.joining(", "));
                helpBuilder.append(" (").append(values).append(")");
            }
            helpBuilder.append("\n\n\n");
        } else if (configurationOptionGroup instanceof ConfigurationOptionGroup) {
            String title = ((ConfigurationOptionGroup)configurationOptionGroup).getTitle();
            if (!title.isEmpty()) {
                for (int i = 0; i < level + 1; i++) {
                    helpBuilder.append("#");
                }
                helpBuilder.append(" ").append(title).append("\n\n");
            } else {
                helpBuilder.append("\n");
            }
        }
        if (!(configurationOptionGroup instanceof ConfigurationOption)) {
            String description = configurationOptionGroup.getDescription();
            if (!description.isEmpty()) {
                helpBuilder.append(description).append("\n");
                if (configurationOptionGroup.getOptions().length > 0) {
                    helpBuilder.append("\n\n");
                }
            }
        }
        for (NamedConfigurationOption option : configurationOptionGroup.getOptions()) {
            if (option instanceof ConfigurationOption) {
                generateHelp(
                    helpBuilder,
                    prefix.withAdd(configurationOptionGroup.getName()),
                    option,
                    level+1
                );
            }
        }
        for (NamedConfigurationOption option : configurationOptionGroup.getOptions()) {
            if (!(option instanceof ConfigurationOption)) {
                generateHelp(
                    helpBuilder,
                    prefix.withAdd(configurationOptionGroup.getName()),
                    option,
                    level+1
                );
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy