Skip to content

Commit

Permalink
add CommandMetadata
Browse files Browse the repository at this point in the history
  • Loading branch information
sigpwned committed Jan 10, 2025
1 parent 3d09f19 commit ea2d243
Show file tree
Hide file tree
Showing 4 changed files with 141 additions and 41 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -63,10 +63,12 @@
import javax.tools.Diagnostic;
import javax.tools.JavaFileObject;
import dagger.Component;
import rapier.cli.CliCommandHelp;
import rapier.cli.CliFlagParameter;
import rapier.cli.CliOptionParameter;
import rapier.cli.CliPositionalParameter;
import rapier.cli.compiler.model.CommandHelpMetadata;
import rapier.cli.compiler.model.CommandHelp;
import rapier.cli.compiler.model.CommandMetadata;
import rapier.cli.compiler.model.FlagParameterHelp;
import rapier.cli.compiler.model.FlagParameterKey;
import rapier.cli.compiler.model.FlagParameterMetadata;
Expand Down Expand Up @@ -155,9 +157,13 @@ private void processComponent(TypeElement component) {
final String componentClassName = component.getSimpleName().toString();
final String moduleClassName = "Rapier" + componentClassName + "CliModule";

final CommandHelpMetadata commandHelp = component.getAnnotationMirrors().stream()
.flatMap(am -> CommandHelpMetadata.fromAnnotationMirror(am).stream()).findFirst()
.orElse(null);
final CommandHelp commandHelp = component.getAnnotationMirrors().stream()
.flatMap(am -> CommandHelp.fromAnnotationMirror(am).stream()).findFirst().orElse(null);
final CommandMetadata commandMetadata = Optional.ofNullable(commandHelp)
.map(h -> new CommandMetadata(h.getName(), h.getVersion(), h.getDescription().orElse(null),
h.isProvideStandardHelp(), h.isProvideStandardVersion()))
.orElseGet(
() -> new CommandMetadata("command", CliCommandHelp.DEFAULT_VERSION, null, true, true));

System.out.println(new DaggerComponentAnalyzer(getProcessingEnv()).analyzeComponent(component)
.getInjectionSites());
Expand Down Expand Up @@ -206,7 +212,7 @@ private void processComponent(TypeElement component) {
}

final String moduleSource = generateModuleSource(componentPackageName, moduleClassName,
commandHelp, positionalInjectionSites, positionalMetadataService, optionInjectionSites,
commandMetadata, positionalInjectionSites, positionalMetadataService, optionInjectionSites,
optionMetadataService, flagInjectionSites, flagMetadataService);

final Path shadeDir = Paths.get("src", "main", "shade");
Expand Down Expand Up @@ -268,7 +274,7 @@ private boolean validateInjectionSites(TypeElement component,

private static final Character STANDARD_HELP_SHORT_NAME = 'h';

private boolean validateStandardHelp(TypeElement component, CommandHelpMetadata commandHelp,
private boolean validateStandardHelp(TypeElement component, CommandHelp commandHelp,
SortedMap<OptionParameterKey, List<DaggerInjectionSite>> optionInjectionSites,
OptionParameterMetadataService optionMetadataService,
SortedMap<FlagParameterKey, List<DaggerInjectionSite>> flagInjectionSites,
Expand Down Expand Up @@ -333,7 +339,7 @@ private boolean validateStandardHelp(TypeElement component, CommandHelpMetadata

private static final Character STANDARD_VERSION_SHORT_NAME = 'v';

private boolean validateStandardVersion(TypeElement component, CommandHelpMetadata commandHelp,
private boolean validateStandardVersion(TypeElement component, CommandHelp commandHelp,
SortedMap<OptionParameterKey, List<DaggerInjectionSite>> optionInjectionSites,
OptionParameterMetadataService optionMetadataService,
SortedMap<FlagParameterKey, List<DaggerInjectionSite>> flagInjectionSites,
Expand Down Expand Up @@ -889,7 +895,7 @@ private FlagParameterMetadataService createFlagParameterMetadataService(
Comparator.nullsFirst(Comparator.naturalOrder()));

private String generateModuleSource(String packageName, String moduleClassName,
CommandHelpMetadata commandHelp,
CommandMetadata commandMetadata,
SortedMap<PositionalParameterKey, List<DaggerInjectionSite>> positionalInjectionSites,
PositionalParameterMetadataService positionalMetadataService,
SortedMap<OptionParameterKey, List<DaggerInjectionSite>> optionInjectionSites,
Expand Down Expand Up @@ -1035,13 +1041,13 @@ private String generateModuleSource(String packageName, String moduleClassName,
out.println(" final Map<Character, String> flagNegativeShortNames = new HashMap<>();");
out.println(" final Map<String, String> flagNegativeLongNames = new HashMap<>();");
emitFlagParameterInstanceFieldInitPreparation(out, flagRepresentationsByParameter.keySet());
if (commandHelp.isProvideStandardHelp()) {
if (commandMetadata.isProvideStandardHelp()) {
out.println(" // Add the standard help flags");
out.println(" flagPositiveShortNames.put('h', \"rapier.standard.help\");");
out.println(" flagPositiveLongNames.put(\"help\", \"rapier.standard.help\");");
out.println();
}
if (commandHelp.isProvideStandardVersion()) {
if (commandMetadata.isProvideStandardVersion()) {
out.println(" // Add the version flag");
out.println(" flagPositiveShortNames.put('v', \"rapier.standard.version\");");
out.println(" flagPositiveLongNames.put(\"version\", \"rapier.standard.version\");");
Expand Down Expand Up @@ -1102,39 +1108,39 @@ private String generateModuleSource(String packageName, String moduleClassName,
flagNegativeShortName, flagNegativeLongName, parameterIsRequired, parameterIsList);
}

if (commandHelp.isProvideStandardHelp()) {
if (commandMetadata.isProvideStandardHelp()) {
out.println(" // Check for standard help");
out.println(
" final boolean standardHelpRequested = parsed.getFlags().containsKey(\"rapier.standard.help\");");
out.println();
}

if (commandHelp.isProvideStandardVersion()) {
if (commandMetadata.isProvideStandardVersion()) {
out.println(" // Check for standard version");
out.println(
" final boolean standardVersionRequested = parsed.getFlags().containsKey(\"rapier.standard.version\");");
out.println();
}

if (commandHelp.isProvideStandardVersion()) {
if (commandMetadata.isProvideStandardVersion()) {
out.println(" if(standardVersionRequested) {");
out.println(" System.err.println(standardVersionMessage());");
out.println(" }");
out.println();
}

if (commandHelp.isProvideStandardHelp()) {
if (commandMetadata.isProvideStandardHelp()) {
out.println(" if(standardHelpRequested) {");
out.println(" System.err.println(standardHelpMessage());");
out.println(" }");
out.println();
}

if (commandHelp.isProvideStandardHelp() || commandHelp.isProvideStandardVersion()) {
if (commandMetadata.isProvideStandardHelp() || commandMetadata.isProvideStandardVersion()) {
final List<String> conditions = new ArrayList<>(2);
if (commandHelp.isProvideStandardHelp())
if (commandMetadata.isProvideStandardHelp())
conditions.add("standardHelpRequested");
if (commandHelp.isProvideStandardVersion())
if (commandMetadata.isProvideStandardVersion())
conditions.add("standardVersionRequested");
out.println(" if(" + String.join(" || ", conditions) + ") {");
out.println(" System.exit(0);");
Expand All @@ -1144,7 +1150,7 @@ private String generateModuleSource(String packageName, String moduleClassName,

out.println(" }");
out.println(" catch (JustArgs.IllegalSyntaxException e) {");
if (commandHelp.isProvideStandardHelp()) {
if (commandMetadata.isProvideStandardHelp()) {
out.println(" // Standard help is active. Print the help message and exit.");
out.println(" System.err.println(standardHelpMessage());");
out.println(" System.exit(1);");
Expand All @@ -1155,7 +1161,7 @@ private String generateModuleSource(String packageName, String moduleClassName,
}
out.println(" }");
out.println(" catch(CliSyntaxException e) {");
if (commandHelp.isProvideStandardHelp()) {
if (commandMetadata.isProvideStandardHelp()) {
out.println(" // Standard help is active. Print the help message and exit.");
out.println(" System.err.println(standardHelpMessage());");
out.println(" System.exit(1);");
Expand Down Expand Up @@ -1229,15 +1235,15 @@ private String generateModuleSource(String packageName, String moduleClassName,
}

// Generate the help message
if (commandHelp.isProvideStandardHelp()) {
emitStandardHelpMessageMethod(out, commandHelp, positionalRepresentationsByParameter,
if (commandMetadata.isProvideStandardHelp()) {
emitStandardHelpMessageMethod(out, commandMetadata, positionalRepresentationsByParameter,
positionalMetadataService, optionRepresentationsByParameter, optionMetadataService,
flagRepresentationsByParameter, flagMetadataService);
}

// Generate the version message
if (commandHelp.isProvideStandardVersion()) {
emitStandardVersionMessageMethod(out, commandHelp);
if (commandMetadata.isProvideStandardVersion()) {
emitStandardVersionMessageMethod(out, commandMetadata);
}

out.println("}");
Expand Down Expand Up @@ -2293,14 +2299,14 @@ private FlagRepresentationKey toBooleanRepresentation(FlagRepresentationKey key)
//////////////////////////////////////////////////////////////////////////////////////////////////
private static final int HELP_MESSAGE_MAX_WIDTH = 80;

private void emitStandardHelpMessageMethod(PrintWriter out, CommandHelpMetadata commandHelp,
private void emitStandardHelpMessageMethod(PrintWriter out, CommandMetadata commandMetadata,
SortedMap<PositionalParameterKey, Collection<PositionalRepresentationKey>> positionalRepresentationsByParameter,
PositionalParameterMetadataService positionalMetadataService,
SortedMap<OptionParameterKey, Collection<OptionRepresentationKey>> optionRepresentationsByParameter,
OptionParameterMetadataService optionMetadataService,
SortedMap<FlagParameterKey, Collection<FlagRepresentationKey>> flagRepresentationsByParameter,
FlagParameterMetadataService flagMetadataService) {
assert commandHelp.isProvideStandardHelp();
assert commandMetadata.isProvideStandardHelp();

final SortedSet<PositionalParameterKey> positionalParameters =
new TreeSet<PositionalParameterKey>(POSITIONAL_PARAMETER_KEY_COMPARATOR);
Expand All @@ -2313,7 +2319,7 @@ private void emitStandardHelpMessageMethod(PrintWriter out, CommandHelpMetadata
final SortedSet<FlagParameterKey> flagParameters =
new TreeSet<FlagParameterKey>(FLAG_PARAMETER_KEY_COMPARATOR);
flagParameters.addAll(flagRepresentationsByParameter.keySet());
if (commandHelp.isProvideStandardHelp()) {
if (commandMetadata.isProvideStandardHelp()) {
final FlagParameterKey standardHelpFlagParameterKey =
new FlagParameterKey(STANDARD_HELP_SHORT_NAME, STANDARD_HELP_LONG_NAME, null, null);
flagParameters.add(standardHelpFlagParameterKey);
Expand All @@ -2331,7 +2337,7 @@ public FlagParameterMetadata getFlagParameterMetadata(Character shortPositiveNam
}
};
}
if (commandHelp.isProvideStandardVersion()) {
if (commandMetadata.isProvideStandardVersion()) {
final FlagParameterKey standardHelpFlagParameterKey =
new FlagParameterKey(STANDARD_VERSION_SHORT_NAME, STANDARD_VERSION_LONG_NAME, null, null);
flagParameters.add(standardHelpFlagParameterKey);
Expand All @@ -2353,7 +2359,7 @@ public FlagParameterMetadata getFlagParameterMetadata(Character shortPositiveNam
out.println(" public String standardHelpMessage() {");
out.println(" return String.join(\"\\n\", ");

final String commandName = commandHelp.getName();
final String commandName = commandMetadata.getName();
final List<String> positionalNames =
positionalRepresentationsByParameter.keySet().stream()
.sorted(Comparator.comparingInt(PositionalParameterKey::getPosition))
Expand Down Expand Up @@ -2389,8 +2395,8 @@ public FlagParameterMetadata getFlagParameterMetadata(Character shortPositiveNam
// @formatter:off
out.println(" \"Usage: " + commandName + " " + optionsAndFlags + String.join(" ", positionalNames) + "\",");
out.println(" \"\",");
if (commandHelp.getDescription().isPresent()) {
for(String line : wordwrap("Description: " + commandHelp.getDescription().orElseThrow(), HELP_MESSAGE_MAX_WIDTH))
if (commandMetadata.getDescription().isPresent()) {
for(String line : wordwrap("Description: " + commandMetadata.getDescription().orElseThrow(), HELP_MESSAGE_MAX_WIDTH))
out.println(" \"" + Java.escapeString(line) + "\",");
out.println(" \"\",");
}
Expand Down Expand Up @@ -2663,10 +2669,10 @@ private static <T> List<List<T>> pivot(List<List<T>> rows) {
//////////////////////////////////////////////////////////////////////////////////////////////////
// VERSION MESSAGE ///////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
private void emitStandardVersionMessageMethod(PrintWriter out, CommandHelpMetadata commandHelp) {
assert commandHelp.isProvideStandardVersion();
private void emitStandardVersionMessageMethod(PrintWriter out, CommandMetadata metadata) {
assert metadata.isProvideStandardVersion();

final String versionString = commandHelp.getName() + " version " + commandHelp.getVersion();
final String versionString = metadata.getName() + " version " + metadata.getVersion();

out.println(" public String standardVersionMessage() {");
out.println(" return \"" + Java.escapeString(versionString) + "\";");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@
import javax.lang.model.util.SimpleAnnotationValueVisitor8;
import rapier.cli.CliCommandHelp;

public class CommandHelpMetadata {
public static Optional<CommandHelpMetadata> fromAnnotationMirror(AnnotationMirror annotation) {
public class CommandHelp {
public static Optional<CommandHelp> fromAnnotationMirror(AnnotationMirror annotation) {
if (annotation == null)
throw new NullPointerException();

Expand All @@ -41,7 +41,7 @@ public static Optional<CommandHelpMetadata> fromAnnotationMirror(AnnotationMirro
final Boolean provideStandardHelp = extractProvideStandardHelp(annotation);
final Boolean provideStandardVersion = extractProvideStandardVersion(annotation);

return Optional.of(new CommandHelpMetadata(name, version, description, provideStandardHelp,
return Optional.of(new CommandHelp(name, version, description, provideStandardHelp,
provideStandardVersion));
}

Expand All @@ -55,7 +55,7 @@ public static Optional<CommandHelpMetadata> fromAnnotationMirror(AnnotationMirro

private final boolean provideStandardVersion;

public CommandHelpMetadata(String name, String version, String description,
public CommandHelp(String name, String version, String description,
Boolean provideStandardHelp, Boolean provideStandardVersion) {
this.name = requireNonNull(name);
this.version = requireNonNull(version);
Expand Down Expand Up @@ -86,7 +86,7 @@ public boolean isProvideStandardVersion() {

@Override
public String toString() {
return "CommandHelpMetadata [name=" + name + ", version=" + version + ", description="
return "CommandHelp [name=" + name + ", version=" + version + ", description="
+ description + ", provideStandardHelp=" + provideStandardHelp + ", provideStandardVersion="
+ provideStandardVersion + "]";
}
Expand All @@ -104,7 +104,7 @@ public boolean equals(Object obj) {
return false;
if (getClass() != obj.getClass())
return false;
CommandHelpMetadata other = (CommandHelpMetadata) obj;
CommandHelp other = (CommandHelp) obj;
return Objects.equals(description, other.description) && Objects.equals(name, other.name)
&& provideStandardHelp == other.provideStandardHelp
&& provideStandardVersion == other.provideStandardVersion
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
/*-
* =================================LICENSE_START==================================
* rapier-cli-compiler
* ====================================SECTION=====================================
* Copyright (C) 2024 - 2025 Andy Boothe
* ====================================SECTION=====================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ==================================LICENSE_END===================================
*/
package rapier.cli.compiler.model;

import static java.util.Objects.requireNonNull;
import java.util.Objects;
import java.util.Optional;

public class CommandMetadata {
private final String name;

private final String version;

private final String description;

private final boolean provideStandardHelp;

private final boolean provideStandardVersion;

public CommandMetadata(String name, String version, String description,
Boolean provideStandardHelp, Boolean provideStandardVersion) {
this.name = requireNonNull(name);
this.version = requireNonNull(version);
this.description = description;
this.provideStandardHelp = provideStandardHelp;
this.provideStandardVersion = provideStandardVersion;
}

public String getName() {
return name;
}

public String getVersion() {
return version;
}

public Optional<String> getDescription() {
return Optional.ofNullable(description);
}

public boolean isProvideStandardHelp() {
return provideStandardHelp;
}

public boolean isProvideStandardVersion() {
return provideStandardVersion;
}

@Override
public String toString() {
return "CommandHelp [name=" + name + ", version=" + version + ", description=" + description
+ ", provideStandardHelp=" + provideStandardHelp + ", provideStandardVersion="
+ provideStandardVersion + "]";
}

@Override
public int hashCode() {
return Objects.hash(description, name, provideStandardHelp, provideStandardVersion, version);
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
CommandMetadata other = (CommandMetadata) obj;
return Objects.equals(description, other.description) && Objects.equals(name, other.name)
&& provideStandardHelp == other.provideStandardHelp
&& provideStandardVersion == other.provideStandardVersion
&& Objects.equals(version, other.version);
}
}
6 changes: 4 additions & 2 deletions rapier-cli/src/main/java/rapier/cli/CliCommandHelp.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,17 @@
@Retention(RetentionPolicy.CLASS)
@Target({ElementType.TYPE})
public @interface CliCommandHelp {
public static final String DEFAULT_VERSION = "0.0.0";

/**
* The name used in the help message.
*/
public String name();

/**
* The version used in the help message.
*/
public String version() default "0.0.0";
public String version() default DEFAULT_VERSION;

/**
* Print a standard help message and exit with a nonzero exit code on syntax errors or in response
Expand Down

0 comments on commit ea2d243

Please sign in to comment.