package com.lexicalscope.jewel.cli.parser;
import com.lexicalscope.jewel.cli.ArgumentValidationException;
class ArgumentParserImpl implements ArgumentParser
{
/**
* {@inheritDoc}
*/
@Override
public void parseArguments(final ParsedArguments parsedArguments, final String... arguments) throws ArgumentValidationException
{
boolean finishedOptions = false;
for (final String argument : arguments)
{
if(finishedOptions)
{
parsedArguments.addValue(argument);
}
else
{
finishedOptions = add(parsedArguments, argument);
}
}
}
private boolean add(final ParsedArguments parsedArguments, final String argument) throws ArgumentValidationException
{
if (startsWithDash(argument))
{
if (startsWithDoubleDash(argument))
{
if (argument.length() > 2)
{
addOptionAndValue(parsedArguments, argument);
}
else
{
parsedArguments.unparsedOptionsFollow();
return true;
}
}
else
{
addConjoinedOptions(parsedArguments, argument.substring(1));
}
}
else
{
parsedArguments.addValue(argument);
}
return false;
}
private void addConjoinedOptions(final ParsedArguments parsedArguments, final String options) throws ArgumentValidationException
{
for (int i = 0; i < options.length(); i++)
{
parsedArguments.addOption(options.substring(i, i + 1));
}
}
private void addOptionAndValue(final ParsedArguments parsedArguments, final String argument) throws ArgumentValidationException
{
if (argument.contains("="))
{
final int separatorIndex = argument.indexOf("=");
parsedArguments.addOption(argument.substring(2, separatorIndex).trim());
if (argument.length() > separatorIndex + 1)
{
parsedArguments.addValue(argument.substring(separatorIndex + 1).trim());
}
}
else
{
parsedArguments.addOption(argument.substring(2, argument.length()).trim());
}
}
private boolean startsWithDash(final String argument)
{
return argument.length() > 1 && argument.startsWith("-");
}
private boolean startsWithDoubleDash(final String argument)
{
return argument.startsWith("--");
}
}