View Javadoc

1   package com.lexicalscope.jewel.cli.parser;
2   
3   import com.lexicalscope.jewel.cli.ArgumentValidationException;
4   
5   class ArgumentParserImpl implements ArgumentParser
6   {
7       /**
8        * {@inheritDoc}
9        */
10      @Override
11      public void parseArguments(final ParsedArguments parsedArguments, final String... arguments) throws ArgumentValidationException
12      {
13          boolean finishedOptions = false;
14          for (final String argument : arguments)
15          {
16             if(finishedOptions)
17             {
18                 parsedArguments.addValue(argument);
19             }
20             else
21             {
22                 finishedOptions = add(parsedArguments, argument);
23             }
24          }
25      }
26  
27      private boolean add(final ParsedArguments parsedArguments, final String argument) throws ArgumentValidationException
28      {
29          if (startsWithDash(argument))
30          {
31              if (startsWithDoubleDash(argument))
32              {
33                  if (argument.length() > 2)
34                  {
35                      addOptionAndValue(parsedArguments, argument);
36                  }
37                  else
38                  {
39                      parsedArguments.unparsedOptionsFollow();
40                      return true;
41                  }
42              }
43              else
44              {
45                  addConjoinedOptions(parsedArguments, argument.substring(1));
46              }
47          }
48          else
49          {
50              parsedArguments.addValue(argument);
51          }
52         return false;
53      }
54  
55      private void addConjoinedOptions(final ParsedArguments parsedArguments, final String options) throws ArgumentValidationException
56      {
57          for (int i = 0; i < options.length(); i++)
58          {
59              parsedArguments.addOption(options.substring(i, i + 1));
60          }
61      }
62  
63      private void addOptionAndValue(final ParsedArguments parsedArguments, final String argument) throws ArgumentValidationException
64      {
65          if (argument.contains("="))
66          {
67              final int separatorIndex = argument.indexOf("=");
68              parsedArguments.addOption(argument.substring(2, separatorIndex).trim());
69  
70              if (argument.length() > separatorIndex + 1)
71              {
72                  parsedArguments.addValue(argument.substring(separatorIndex + 1).trim());
73              }
74          }
75          else
76          {
77              parsedArguments.addOption(argument.substring(2, argument.length()).trim());
78          }
79      }
80  
81      private boolean startsWithDash(final String argument)
82      {
83          return argument.length() > 1 && argument.startsWith("-");
84      }
85  
86      private boolean startsWithDoubleDash(final String argument)
87      {
88          return argument.startsWith("--");
89      }
90  }