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