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

com.obdobion.argument.UsageBuilderVerbose Maven / Gradle / Ivy

package com.obdobion.argument;

import java.io.File;
import java.util.Iterator;

/**
 * @author Chris DeGreef
 *
 */
public class UsageBuilderVerbose extends UsageBuilder
{
    public UsageBuilderVerbose()
    {
        super();
    }

    @Override
    void prettyPrint (
        final ICmdLine icmdLine)
    {
        final CmdLine cmdLine = (CmdLine) icmdLine;
        usageHeader((cmdLine).commandPrefix, cmdLine, 0);
        showEachOwnedArg((cmdLine).allPossibleArgs.iterator(), cmdLine.commandPrefix, cmdLine, 0);
    }

    /**
     * @param aIter
     * @param commandPrefix
     * @param cmdLine
     * @param indentLevel
     */
    void showEachOwnedArg (
        final Iterator> aIter,
        final char commandPrefix,
        final ICmdLineArg cmdLine,
        final int indentLevel)
    {
        int cnt = 0;
        while (aIter.hasNext())
        {
            final ICmdLineArg arg = aIter.next();

            if (arg.isSystemGenerated())
                continue;

            if (cnt++ > 0)
                newLine(indentLevel);

            if (arg instanceof CmdLineCLA)
                usageDetail(commandPrefix, (CmdLineCLA) arg, indentLevel + 1);
            else
                usageDetail(commandPrefix, arg, indentLevel + 1);
        }
    }

    void usageDetail (
        final char commandPrefix,
        final CmdLineCLA cmdLine,
        final int indentLevel)
    {
        usageDetail(commandPrefix, ((ICmdLineArg) cmdLine), indentLevel);
        showEachOwnedArg((cmdLine.templateCmdLine).allArgs().iterator(), commandPrefix, cmdLine, indentLevel);
    }

    public void usageDetail (
        final char commandPrefix,
        final ICmdLineArg arg,
        final int _indentLevel)
    {
        int indentLevel = _indentLevel;

        newLine(indentLevel);

        if (!arg.isRequired())
            append("[");
        if (!arg.isPositional())
        {
            if (arg.getKeyword() != null)
            {
                if (arg.getKeychar() != null && arg.getKeychar().charValue() != ' ')
                    append(""
                        + commandPrefix
                        + arg.getKeychar().charValue()
                        + " "
                        + commandPrefix
                        + commandPrefix
                        + arg.getKeyword());
                else
                    append("" + commandPrefix + commandPrefix + arg.getKeyword());
                if (arg.isCamelCapsAllowed())
                    append(" " + commandPrefix + commandPrefix + arg.getCamelCaps());
                if (arg.isMetaphoneAllowed())
                    append(" " + commandPrefix + commandPrefix + arg.getMetaphone());
            } else if (arg.getKeychar() != null && arg.getKeychar().charValue() != ' ')
                append("" + commandPrefix + arg.getKeychar().charValue());
            else
                append("unnamed");
        } else
        {
            append("positional");
        }

        final String n = arg.getClass().getSimpleName();
        // ClassnameCLA is how the arguments must be named
        final String name = n.substring(0, n.length() - 3);
        if ("Boolean".equals(name))
        {
            // intentionally left blank
        } else if ("CmdLine".equals(name))
            append(" ()");
        else
        {
            append(" <");
            append(name.toLowerCase());
            append(">");
        }
        if (!arg.isRequired())
            append("]");

        final String help = ((AbstractCLA) arg).getHelp();

        newLine(++indentLevel);
        if (help != null && help.trim().length() > 0)
            append(help);

        if ("CmdLine".equals(name))
            newLine(indentLevel);

        usageDetailModifiers(commandPrefix, arg, indentLevel);

        if (((AbstractCLA) arg).getFormat() != null)
            newLine(indentLevel).append("The value must adhere to \"")
                    .append(((AbstractCLA) arg).getFormat() + "\".");
    }

    /**
     * @param commandPrefix
     * @param arg
     * @param indentLevel
     */
    void usageDetailModifiers (
        final char commandPrefix,
        final ICmdLineArg arg,
        final int indentLevel)
    {

        final String n = arg.getClass().getSimpleName();
        // ClassnameCLA is how the arguments must be named
        final String name = n.substring(0, n.length() - 3);
        if ("Boolean".equals(name))
            return;

        if (arg.isMultiple())
        {
            if (arg.getMultipleMax() == Integer.MAX_VALUE)
                if (arg.isRequired())
                    newLine(indentLevel).append("Although multiple values are allowed, you must specify at least "
                        + arg.getMultipleMin()
                        + ".");
                else
                    newLine(indentLevel)
                            .append("Although no value is required, if you specify one you must specify at least "
                                + arg.getMultipleMin()
                                + ".");
            else
            {
                if (arg.isRequired())
                    newLine(indentLevel).append("It is required that you specify at least "
                        + arg.getMultipleMin()
                        + " and at most "
                        + arg.getMultipleMax()
                        + " values.");
                else
                    newLine(indentLevel)
                            .append("Although no value is required, if you specify one you must specify at least "
                                + arg.getMultipleMin()
                                + " and at most "
                                + arg.getMultipleMax()
                                + " values.");
            }
        }

        if (arg.isCaseSensitive())
        {
            newLine(indentLevel).append("Upper vs lower case matters.");
        }

        if (arg.getCriteria() != null)
        {
            newLine(indentLevel);
            arg.getCriteria().usage(this, indentLevel);
        }

        if (arg instanceof AbstractCLA)
        {
            final AbstractCLA acla = (AbstractCLA) arg;
            if (acla.getDefaultValues() != null && !acla.getDefaultValues().isEmpty())
            {
                newLine(indentLevel).append("If unspecified, the default will be");
                for (final Object dv : acla.getDefaultValues())
                {
                    append(" ");
                    if (dv instanceof Byte)
                        append(ByteCLA.asLiteral(((Byte) dv).byteValue()));
                    else
                        append(dv.toString());
                }
                append(".");
            }
        }
    }

    /**
     * @param commandPrefix
     * @param icmdLine
     * @param indentLevel
     */
    void usageHeader (
        final char commandPrefix,
        final ICmdLine icmdLine,
        final int indentLevel)
    {
        final CmdLine commandLineParser = (CmdLine) icmdLine;

        if (commandLineParser.getName() != null)
        {
            append(commandLineParser.getName());
            newLine(indentLevel);
        }
        if (indentLevel == 0 && commandLineParser.getHelp() != null)
        {
            if (commandLineParser.getName() != null)
                newLine(indentLevel);
            append(commandLineParser.getHelp());
            newLine(indentLevel);
        }
        if (indentLevel == 0 && !commandLineParser.defaultIncludeDirectories.isEmpty())
        {
            newLine(indentLevel);
            append("Import path =");
            for (final File dir : commandLineParser.defaultIncludeDirectories)
            {
                append(" ");
                append(dir.getAbsolutePath());
                append(";");
            }
            newLine(indentLevel);
        }

    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy