io7m | single-page | multi-page | epub | Quarrel User Manual 1.8.1
2. Usage
Previous
Front Matter
Up
4. JavaDoc
Next

# 3. Example Application

1
The full sources of the example application are as follows:

### 3.2. ExCat.java

    /*
     * 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;
      }
    }

### 3.3. ExCmd0.java

    /*
     * 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;
      }
    }

### 3.4. ExCow.java

    /*
     * 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;
      }
    }

### 3.5. ExDog.java

    /*
     * 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;
      }
    }

### 3.6. ExEverything.java

    /*
     * 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;
      }
    }

### 3.7. ExMeta.java

    /*
     * 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()
        );
      }
    }

### 3.8. ExStrings.java

    /*
     * 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"
        );
      }
    }

### 3.9. Main.java

    /*
     * 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)
        );
      }
    }

2. Usage
Previous
Front Matter
Up
4. JavaDoc
Next
io7m | single-page | multi-page | epub | Quarrel User Manual 1.8.1