DATE | 2023-05-12T10:12:20+00:00 |
DESCRIPTION | User manual for the quarrel package. |
IDENTIFIER | ce8c7e2f-3469-45fa-8ffa-4fc1ab2412d2 |
LANGUAGE | en |
SOURCE | https://www.io7m.com/software/quarrel/ |
TITLE | Quarrel User Manual 1.6.1 |
quarrel: ERROR: The wrong number of values were provided for a parameter. Command : example Error Code : parameter-cardinality Maximum Values : 1 Minimum Values : 1 Parameter : --number Provided Count : 0 Suggested Action : Provide the right number of arguments for the parameter. quarrel: ERROR: The value supplied for a parameter is unparseable. Command : example Error Code : parameter-unparseable-value Parameter : --number Provided : x Suggested Action : Provide a parseable value on the command-line. Syntax : 0 | [1-9][0-9]+ Type : java.lang.Integer
@Override public QCommandMetadata metadata() { return new QCommandMetadata( "cat", new QConstant("Hear a cat speak."), Optional.empty() ); }
Type | Cardinality |
---|---|
QParameterNamed0N | The parameter may be specified zero or more times, accumulating values into a list. |
QParameterNamed1 | The parameter must be specified exactly once. |
QParameterNamed1N | The parameter must be specified at least once, accumulating values into a list. |
QParameterNamed01 | The parameter may be specified at most once, yielding an optional value. |
private static final QParameterNamed1<Path> FILE = new QParameterNamed1<>( "--file", List.of("-f"), new QConstant("The input file."), Optional.empty(), Path.class ); private static final QParameterNamed01<Integer> COUNT = new QParameterNamed01<>( "--count", List.of(), new QConstant("The number of items to process."), Optional.of(100), Integer.class ); @Override public List<QParameterNamedType<?>> onListNamedParameters() { return List.of(FILE, COUNT); }
Type | Meaning |
---|---|
QParametersPositionalAny | Any sequence of positional parameters are acceptable. Essentially, no parsing occurs. |
QParametersPositionalNone | No positional parameters are allowed. Passing anything results in an error. |
QParametersPositionalTyped | The command requires the exact sequence of given parameters. |
@Override public QParametersPositionalType onListPositionalParameters() { return new QParametersPositionalNone(); }
@Override public QParametersPositionalType onListPositionalParameters() { return new QParametersPositionalAny(); }
private static final QParameterPositional<Path> INPUT = new QParameterPositional<>( "input", new QConstant("The input file."), Path.class ); private static final QParameterPositional<Path> OUTPUT = new QParameterPositional<>( "output", new QConstant("The output file."), Path.class ); @Override public QParametersPositionalType onListPositionalParameters() { return new QParametersPositionalTyped(List.of(INPUT, OUTPUT)); }
@Override public QCommandStatus onExecute( final QCommandContextType context) { final var w = context.output(); final Path file = context.parameterValue(FILE); w.println(file); final Integer count = context.parameterValue(COUNT); w.println(count); final Path input = context.parameterValue(INPUT); w.println(input); final Path output = context.parameterValue(OUTPUT); w.println(output); w.flush(); return SUCCESS; }
Type | Behaviour |
---|---|
QConstant | The value of the constant is used directly, without any kind of localization. |
QLocalize | The value will be localized from the application's resources. The value will ultimately be used as a key to index into a ResourceBundle. |
final var metadata = new QApplicationMetadata( "quarrel", "com.io7m.quarrel.example", "1.2.0", "eacd59a2", "The Quarrel example application.", Optional.of(URI.create("https://www.io7m.com/software/quarrel/")) );
final ResourceBundle resources = ...; final var builder = QApplication.builder(metadata); builder.setApplicationResources(resources); builder.addCommand(new Command0()); builder.addCommand(new Command1()); builder.addCommand(new Command2());
final var group = builder.createCommandGroup( new QCommandMetadata( "animal", new QConstant("Hear an animal speak."), Optional.of(new QConstant("A long description.")) )); group.addCommand(new CommandCat()); group.addCommand(new CommandDog()); group.addCommand(new CommandCow());
final var application = builder.build();
List<String> arguments = ...; try { var cmd = application.parse(arguments); return result = cmd.execute(); } catch (final Exception e) { // Log errors return QCommandStatus.FAILURE; }
Logger LOG = ... ; return application.run(LOG, arguments)
$ quarrel quarrel: usage: quarrel [command] [arguments ...] The Quarrel example application. Use the "help" command to examine specific commands: $ quarrel help help. Command-line arguments can be placed one per line into a file, and the file can be referenced using the @ symbol: $ echo help > file.txt $ echo help >> file.txt $ quarrel @file.txt Commands: animal Hear an animal speak. cmd-0 A command that does nothing. cmd-1 A command that does nothing. cmd-1 A command that does nothing. help Show usage information for a command. version Show the application version. Documentation: https://www.io7m.com/software/quarrel/
quarrel: usage: cmd-everything [named-arguments ...] <x> <y> <z> A command with everything. Named parameters: --0file Description : A file. Type : String Cardinality : [0, 1]; Specify at most once. Syntax : <any sequence of characters> Alternative names : -x, -y, -z --1number Description : A number. Type : Integer Cardinality : [0, 1]; Specify at most once, or use the default. Default value : 23 Syntax : 0 | [1-9][0-9]+ * --2number-opt Description : A number. Type : Integer Cardinality : [1]; Specify exactly once. Syntax : 0 | [1-9][0-9]+ --3date Description : A date. Type : OffsetDateTime Cardinality : [1]; Specify exactly once, or use the default. Default value : 2023-05-12T11:11:22.138315473Z Syntax : yyyy-mm-ddThh:mm:ss+zz:zz (ISO 8601) --4net Description : A network address. Type : InetAddress Cardinality : [0, N]; Specify zero or more times. Syntax : Hostname, IPv4 or IPv6 address (RFC 2732) --5uuid Description : A UUID. Type : UUID Cardinality : [0, N]; Specify at least once, or use the default. Default value : [5552215f-253f-4391-bd07-7d87f57572ce] Syntax : [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} --6path Description : A path. Type : Path Cardinality : [1, N]; Specify at least once. Syntax : <platform-specific path syntax> --7uri Description : A URI. Type : URI Cardinality : [1, N]; Specify at least once, or use the default. Default value : urn:x Syntax : RFC 3986 URI Positional parameters: x Type : Integer Description : An x. Syntax : 0 | [1-9][0-9]+ y Type : Integer Description : A y. Syntax : 0 | [1-9][0-9]+ z Type : Integer Description : A z. Syntax : 0 | [1-9][0-9]+ Farmer Bertram was in bed when the stranger entered, having had a fall from his horse while hunting. The horseman said his business was of such pressing importance that he must see the farmer at once. Bertram recognized the name, and directed his old servant to admit the stranger to his chamber at once.
com.io7m.quarrel.example 1.2.0 eacd59a2
java.lang.Boolean java.lang.Double java.lang.Float java.lang.Integer java.lang.Long java.lang.String java.math.BigDecimal java.math.BigInteger java.net.InetAddress java.net.URI java.nio.file.Path java.time.Duration java.time.OffsetDateTime java.util.UUID
/* * Copyright © 2023 Mark Raynsford <code@io7m.com> https://www.io7m.com * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ package com.io7m.quarrel.example; import com.io7m.quarrel.core.QCommandContextType; import com.io7m.quarrel.core.QCommandMetadata; import com.io7m.quarrel.core.QCommandStatus; import com.io7m.quarrel.core.QCommandType; import com.io7m.quarrel.core.QParameterNamedType; import com.io7m.quarrel.core.QParametersPositionalNone; import com.io7m.quarrel.core.QParametersPositionalType; import com.io7m.quarrel.core.QStringType.QConstant; import java.util.List; import java.util.Optional; /** * An example command. */ public final class ExCat implements QCommandType { /** * An example command. */ public ExCat() { } @Override public QCommandMetadata metadata() { return new QCommandMetadata( "cat", new QConstant("Hear a cat speak."), Optional.empty() ); } @Override public List<QParameterNamedType<?>> onListNamedParameters() { return List.of(); } @Override public QParametersPositionalType onListPositionalParameters() { return new QParametersPositionalNone(); } @Override public QCommandStatus onExecute( final QCommandContextType context) { final var w = context.output(); w.println("Meow."); w.flush(); return QCommandStatus.SUCCESS; } }
/* * Copyright © 2023 Mark Raynsford <code@io7m.com> https://www.io7m.com * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ package com.io7m.quarrel.example; import com.io7m.quarrel.core.QCommandContextType; import com.io7m.quarrel.core.QCommandMetadata; import com.io7m.quarrel.core.QCommandStatus; import com.io7m.quarrel.core.QCommandType; import com.io7m.quarrel.core.QParameterNamedType; import com.io7m.quarrel.core.QParametersPositionalNone; import com.io7m.quarrel.core.QParametersPositionalType; import com.io7m.quarrel.core.QStringType.QLocalize; import java.util.List; import java.util.Optional; import static com.io7m.quarrel.core.QCommandStatus.SUCCESS; /** * An example command. */ public final class ExCmd0 implements QCommandType { /** * An example command. */ public ExCmd0() { } @Override public QCommandMetadata metadata() { return new QCommandMetadata( "cmd-0", new QLocalize("cmd-0.short"), Optional.of(new QLocalize("cmd-0.long")) ); } @Override public List<QParameterNamedType<?>> onListNamedParameters() { return List.of(); } @Override public QParametersPositionalType onListPositionalParameters() { return new QParametersPositionalNone(); } @Override public QCommandStatus onExecute( final QCommandContextType context) { return SUCCESS; } }
/* * Copyright © 2023 Mark Raynsford <code@io7m.com> https://www.io7m.com * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ package com.io7m.quarrel.example; import com.io7m.quarrel.core.QCommandContextType; import com.io7m.quarrel.core.QCommandMetadata; import com.io7m.quarrel.core.QCommandStatus; import com.io7m.quarrel.core.QCommandType; import com.io7m.quarrel.core.QParameterNamedType; import com.io7m.quarrel.core.QParametersPositionalNone; import com.io7m.quarrel.core.QParametersPositionalType; import com.io7m.quarrel.core.QStringType.QConstant; import java.util.List; import java.util.Optional; /** * An example command. */ public final class ExCow implements QCommandType { /** * An example command. */ public ExCow() { } @Override public QCommandMetadata metadata() { return new QCommandMetadata( "cow", new QConstant("Hear a cow speak."), Optional.empty() ); } @Override public List<QParameterNamedType<?>> onListNamedParameters() { return List.of(); } @Override public QParametersPositionalType onListPositionalParameters() { return new QParametersPositionalNone(); } @Override public QCommandStatus onExecute( final QCommandContextType context) throws Exception { final var w = context.output(); w.println("Moo."); w.flush(); return QCommandStatus.SUCCESS; } }
/* * Copyright © 2023 Mark Raynsford <code@io7m.com> https://www.io7m.com * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ package com.io7m.quarrel.example; import com.io7m.quarrel.core.QCommandContextType; import com.io7m.quarrel.core.QCommandMetadata; import com.io7m.quarrel.core.QCommandStatus; import com.io7m.quarrel.core.QCommandType; import com.io7m.quarrel.core.QParameterNamedType; import com.io7m.quarrel.core.QParametersPositionalNone; import com.io7m.quarrel.core.QParametersPositionalType; import com.io7m.quarrel.core.QStringType.QConstant; import java.util.List; import java.util.Optional; /** * An example command. */ public final class ExDog implements QCommandType { /** * An example command. */ public ExDog() { } @Override public QCommandMetadata metadata() { return new QCommandMetadata( "dog", new QConstant("Hear a dog speak."), Optional.empty() ); } @Override public List<QParameterNamedType<?>> onListNamedParameters() { return List.of(); } @Override public QParametersPositionalType onListPositionalParameters() { return new QParametersPositionalNone(); } @Override public QCommandStatus onExecute( final QCommandContextType context) throws Exception { final var w = context.output(); w.println("Bark."); w.flush(); return QCommandStatus.SUCCESS; } }
/* * Copyright © 2023 Mark Raynsford <code@io7m.com> https://www.io7m.com * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ package com.io7m.quarrel.example; import com.io7m.quarrel.core.QCommandContextType; import com.io7m.quarrel.core.QCommandMetadata; import com.io7m.quarrel.core.QCommandStatus; import com.io7m.quarrel.core.QCommandType; import com.io7m.quarrel.core.QParameterNamed01; import com.io7m.quarrel.core.QParameterNamed0N; import com.io7m.quarrel.core.QParameterNamed1; import com.io7m.quarrel.core.QParameterNamed1N; import com.io7m.quarrel.core.QParameterNamedType; import com.io7m.quarrel.core.QParameterPositional; import com.io7m.quarrel.core.QParametersPositionalType; import com.io7m.quarrel.core.QParametersPositionalTyped; import com.io7m.quarrel.core.QStringType.QConstant; import java.net.InetAddress; import java.net.URI; import java.nio.file.Path; import java.time.OffsetDateTime; import java.util.List; import java.util.Optional; import java.util.UUID; import static com.io7m.quarrel.core.QCommandStatus.SUCCESS; /** * An example command. */ public final class ExEverything implements QCommandType { private static final QParameterNamed01<String> PARAMETER_0 = new QParameterNamed01<>( "--0file", List.of("-x", "-y", "-z"), new QConstant("A file."), Optional.empty(), String.class ); private static final QParameterNamed01<Integer> PARAMETER_1 = new QParameterNamed01<>( "--1number", List.of(), new QConstant("A number."), Optional.of(23), Integer.class ); private static final QParameterNamed1<Integer> PARAMETER_2 = new QParameterNamed1<>( "--2number-opt", List.of(), new QConstant("A number."), Optional.empty(), Integer.class ); private static final QParameterNamed1<OffsetDateTime> PARAMETER_3 = new QParameterNamed1<>( "--3date", List.of(), new QConstant("A date."), Optional.of(OffsetDateTime.now()), OffsetDateTime.class ); private static final QParameterNamed0N<InetAddress> PARAMETER_4 = new QParameterNamed0N<>( "--4net", List.of(), new QConstant("A network address."), List.of(), InetAddress.class ); private static final QParameterNamed0N<UUID> PARAMETER_5 = new QParameterNamed0N<>( "--5uuid", List.of(), new QConstant("A UUID."), List.of(UUID.randomUUID()), UUID.class ); private static final QParameterNamed1N<Path> PARAMETER_6 = new QParameterNamed1N<>( "--6path", List.of(), new QConstant("A path."), Optional.empty(), Path.class ); private static final QParameterNamed1N<URI> PARAMETER_7 = new QParameterNamed1N<>( "--7uri", List.of(), new QConstant("A URI."), Optional.of(URI.create("urn:x")), URI.class ); private static final QParameterPositional<Integer> P_PARAMETER_0 = new QParameterPositional<>( "x", new QConstant("An x."), Integer.class ); private static final QParameterPositional<Integer> P_PARAMETER_1 = new QParameterPositional<>( "y", new QConstant("A y."), Integer.class ); private static final QParameterPositional<Integer> P_PARAMETER_2 = new QParameterPositional<>( "z", new QConstant("A z."), Integer.class ); private static final String TEXT = """ Farmer Bertram was in bed when the stranger entered, having had a fall from his horse while hunting. The horseman said his business was of such pressing importance that he must see the farmer at once. Bertram recognized the name, and directed his old servant to admit the stranger to his chamber at once. """; /** * An example command. */ public ExEverything() { } @Override public List<QParameterNamedType<?>> onListNamedParameters() { return List.of( PARAMETER_0, PARAMETER_1, PARAMETER_2, PARAMETER_3, PARAMETER_4, PARAMETER_5, PARAMETER_6, PARAMETER_7 ); } @Override public QParametersPositionalType onListPositionalParameters() { return new QParametersPositionalTyped( List.of(P_PARAMETER_0, P_PARAMETER_1, P_PARAMETER_2) ); } @Override public QCommandMetadata metadata() { return new QCommandMetadata( "cmd-everything", new QConstant("A command with everything."), Optional.of(new QConstant(TEXT)) ); } @Override public QCommandStatus onExecute( final QCommandContextType context) { final var w = context.output(); w.println(context.parameterValue(PARAMETER_0)); w.println(context.parameterValue(PARAMETER_1)); w.println(context.parameterValue(PARAMETER_2)); w.println(context.parameterValue(PARAMETER_3)); w.println(context.parameterValues(PARAMETER_4)); w.println(context.parameterValues(PARAMETER_5)); w.println(context.parameterValues(PARAMETER_6)); w.println(context.parameterValues(PARAMETER_7)); w.println(context.parameterValue(P_PARAMETER_0)); w.println(context.parameterValue(P_PARAMETER_1)); w.println(context.parameterValue(P_PARAMETER_2)); w.flush(); return SUCCESS; } }
/* * Copyright © 2023 Mark Raynsford <code@io7m.com> https://www.io7m.com * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ package com.io7m.quarrel.example; import com.io7m.quarrel.core.QCommandContextType; import com.io7m.quarrel.core.QCommandMetadata; import com.io7m.quarrel.core.QCommandStatus; import com.io7m.quarrel.core.QCommandType; import com.io7m.quarrel.core.QParameterNamedType; import com.io7m.quarrel.core.QParametersPositionalAny; import com.io7m.quarrel.core.QParametersPositionalType; import com.io7m.quarrel.core.QStringType.QConstant; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Optional; import static com.io7m.quarrel.core.QCommandStatus.SUCCESS; /** * The meta command. */ public final class ExMeta implements QCommandType { /** * The meta command. */ public ExMeta() { } @Override public List<QParameterNamedType<?>> onListNamedParameters() { return List.of(); } @Override public QParametersPositionalType onListPositionalParameters() { return new QParametersPositionalAny(); } @Override public QCommandStatus onExecute( final QCommandContextType context) throws Exception { final var args = context.parametersPositionalRaw(); if (!args.isEmpty()) { switch (args.get(0)) { case "converters" -> { showConverters(context); } default -> { } } } return SUCCESS; } private static void showConverters( final QCommandContextType context) { final var w = context.output(); final var cs = new ArrayList<>(context.valueConverters().converters()); cs.sort(Comparator.comparing(o -> o.convertedClass().getCanonicalName())); for (final var c : cs) { w.println(c.convertedClass().getCanonicalName()); } w.flush(); } @Override public QCommandMetadata metadata() { return new QCommandMetadata( "meta", new QConstant("Display hidden application metadata."), Optional.empty() ); } }
/* * Copyright © 2023 Mark Raynsford <code@io7m.com> https://www.io7m.com * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ package com.io7m.quarrel.example; import com.io7m.jxtrand.vanilla.JXTAbstractStrings; import java.io.IOException; import java.util.Locale; /** * The string resources. */ public final class ExStrings extends JXTAbstractStrings { /** * The string resources. * * @param locale The application locale * * @throws IOException On I/O errors */ public ExStrings( final Locale locale) throws IOException { super( locale, ExStrings.class, "/com/io7m/quarrel/example", "Messages" ); } }
/* * Copyright © 2023 Mark Raynsford <code@io7m.com> https://www.io7m.com * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ package com.io7m.quarrel.example; import com.io7m.quarrel.core.QApplication; import com.io7m.quarrel.core.QApplicationMetadata; import com.io7m.quarrel.core.QApplicationType; import com.io7m.quarrel.core.QCommandMetadata; import com.io7m.quarrel.core.QStringType.QConstant; import com.io7m.quarrel.ext.xstructural.QCommandXS; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.UncheckedIOException; import java.net.URI; import java.util.List; import java.util.Locale; import java.util.Objects; import java.util.Optional; /** * The main program. */ public final class Main implements Runnable { private static final Logger LOG = LoggerFactory.getLogger(Main.class); private final List<String> args; private final QApplicationType application; private int exitCode; /** * The main entry point. * * @param inArgs Command-line arguments */ public Main( final String[] inArgs) { try { this.args = Objects.requireNonNull(List.of(inArgs), "Command line arguments"); final var metadata = new QApplicationMetadata( "quarrel", "com.io7m.quarrel.example", "1.2.0", "eacd59a2", "The Quarrel example application.", Optional.of(URI.create("https://www.io7m.com/software/quarrel/")) ); final var resources = new ExStrings(Locale.getDefault()).resources(); final var builder = QApplication.builder(metadata); builder.setApplicationResources(resources); builder.addCommand(new ExCmd0()); builder.addCommand(new ExCmd1()); builder.addCommand(new ExEverything()); builder.addCommand(new ExMeta()); builder.addCommand(new QCommandXS("xstructural", true)); { final var group = builder.createCommandGroup(new QCommandMetadata( "animal", new QConstant("Hear an animal speak."), Optional.of(new QConstant("A long description.")) )); group.addCommand(new ExCat()); group.addCommand(new ExDog()); group.addCommand(new ExCow()); } this.application = builder.build(); this.exitCode = 0; } catch (final IOException e) { throw new UncheckedIOException(e); } } /** * The main entry point. * * @param args Command line arguments */ public static void main( final String[] args) { System.exit(mainExitless(args)); } /** * The main (exitless) entry point. * * @param args Command line arguments * * @return The exit code */ public static int mainExitless( final String[] args) { final var cm = new Main(args); cm.run(); return cm.exitCode(); } /** * @return The exit code */ public int exitCode() { return this.exitCode; } @Override public void run() { this.exitCode = this.application.run(LOG, this.args).exitCode(); } @Override public String toString() { return String.format( "[Main 0x%s]", Long.toUnsignedString(System.identityHashCode(this), 16) ); } }