1 package com.lexicalscope.jewel.cli.parser;
2
3 import com.lexicalscope.jewel.cli.ArgumentValidationException;
4
5 class ArgumentParserImpl implements ArgumentParser
6 {
7
8
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 }