package org.caudexorigo.cli;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
class ParsedArgumentsBuilder
{
private final Map<String, List<String>> m_arguments = new LinkedHashMap<String, List<String>>();
private List<String> m_currentValues;
private final List<String> m_unparsed = new ArrayList<String>();
private boolean m_moreOptionsExpected = true;
public void add(final String argument) throws ArgumentValidationException
{
if (argument.length() > 1 && argument.startsWith("-"))
{
if (argument.length() > 2 && argument.startsWith("--"))
{
if (argument.contains("="))
{
final int separatorIndex = argument.indexOf("=");
addOption(argument.substring(2, separatorIndex).trim());
if (argument.length() > (separatorIndex + 1))
{
addValue(argument.substring(separatorIndex + 1).trim());
}
}
else
{
addOption(argument.substring(2, argument.length()).trim());
}
}
else
{
for (int i = 1; i < argument.length(); i++)
{
addOption(argument.substring(i, i + 1));
}
}
}
else
{
addValue(argument);
}
}
private void addValue(final String value)
{
if (m_currentValues == null)
{
m_moreOptionsExpected = false;
m_unparsed.add(value);
}
else
{
m_currentValues.add(value);
}
}
private void addOption(final String option) throws ArgumentValidationException
{
if (m_moreOptionsExpected)
{
m_currentValues = new ArrayList<String>();
m_arguments.put(option, m_currentValues);
}
else
{
throw new ArgumentValidationException(new ArgumentValidationException.ValidationError()
{
public ErrorType getErrorType()
{
return ArgumentValidationException.ValidationError.ErrorType.MisplacedOption;
}
public String getMessage()
{
return option;
}
@Override
public String toString()
{
return String.format("Option not expected in this position: %s", getMessage());
}
});
}
}
public void setUnparsed(final String[] unparsed)
{
this.m_unparsed.addAll(Arrays.asList(unparsed));
}
public ParsedArguments getParsedArguments()
{
final Map<String, List<String>> finalArguments = new LinkedHashMap<String, List<String>>();
for (final Entry<String, List<String>> entry : m_arguments.entrySet())
{
finalArguments.put(entry.getKey(), new ArrayList<String>(entry.getValue()));
}
return new ArgumentsImpl(finalArguments, new ArrayList<String>(m_unparsed));
}
}